Google app engine Google应用程序引擎GAE上的问题:无法锁定表架构\u版本
我们正在使用云SQL进行GAE。在本地开发服务器上,一切都很好。我们正在使用带有静态连接字符串的AppEngineDriver。在生产环境中连接良好,因为Flyway能够创建schema_版本表 但我们得到一个错误,它无法锁定所述表。桌子是空的。我们有3次迁移,但都没有执行 我们在Spring以Java配置风格创建数据源bean时启动迁移 这是堆栈跟踪 非常感谢 更新1:我在第一个堆栈跟踪的末尾添加了一个相关的二级堆栈跟踪 com.googlecode.flyway.core.api.FlywayException:无法锁定表Google app engine Google应用程序引擎GAE上的问题:无法锁定表架构\u版本,google-app-engine,flyway,google-cloud-sql,Google App Engine,Flyway,Google Cloud Sql,我们正在使用云SQL进行GAE。在本地开发服务器上,一切都很好。我们正在使用带有静态连接字符串的AppEngineDriver。在生产环境中连接良好,因为Flyway能够创建schema_版本表 但我们得到一个错误,它无法锁定所述表。桌子是空的。我们有3次迁移,但都没有执行 我们在Spring以Java配置风格创建数据源bean时启动迁移 这是堆栈跟踪 非常感谢 更新1:我在第一个堆栈跟踪的末尾添加了一个相关的二级堆栈跟踪 com.googlecode.flyway.core.api.Flywa
ourschema
schema\u版本
:
java.sql.SQLException:在准备好的语句协议中还不支持此命令
位于com.google.cloud.sql.jdbc.internal.Exceptions.newSqlException(Exceptions.java:219)
位于com.google.cloud.sql.jdbc.internal.SqlProtoClient.check(SqlProtoClient.java:198)
位于com.google.cloud.sql.jdbc.internal.SqlProtoClient.executeSql(SqlProtoClient.java:87)
位于com.google.cloud.sql.jdbc.internal.SqlProtoClient.executeSql(SqlProtoClient.java:76)
位于com.google.cloud.sql.jdbc.Connection.executeSql(Connection.java:528)
在com.google.cloud.sql.jdbc.PreparedStatement.executeSqlImpl(PreparedStatement.java:141)
位于com.google.cloud.sql.jdbc.Statement.executeImpl(Statement.java:154)
位于com.google.cloud.sql.jdbc.PreparedStatement.execute(PreparedStatement.java:122)
位于com.googlecode.flyway.core.dbsupport.JdbcTemplate.execute(JdbcTemplate.java:214)
位于com.googlecode.flyway.core.dbsupport.mysql.MySQLTable.doLock(MySQLTable.java:58)
位于com.googlecode.flyway.core.dbsupport.Table.lock(Table.java:254)
位于com.googlecode.flyway.core.metadatatable.MetaDataTableImpl.lock(MetaDataTableImpl.java:121)
位于com.googlecode.flyway.core.command.DbMigrate$1.doInTransaction(DbMigrate.java:140)
位于com.googlecode.flyway.core.command.DbMigrate$1.doInTransaction(DbMigrate.java:138)
位于com.googlecode.flyway.core.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:54)
位于com.googlecode.flyway.core.command.DbMigrate.migrate(DbMigrate.java:137)
位于com.googlecode.flyway.core.flyway$1.execute(flyway.java:862)
位于com.googlecode.flyway.core.flyway$1.execute(flyway.java:815)
位于com.googlecode.flyway.core.flyway.execute(flyway.java:1177)
位于com.googlecode.flyway.core.flyway.migrate(flyway.java:815)
位于com.ourapplication.pilote.persistence.FlywayMigrationDataSourceInitializer.postInitialize(FlywayMigrationDataSourceInitializer.java:23)
位于com.ourapplication.pilote.persistence.PersistenceConfiguration.initializeDataSource(PersistenceConfiguration.java:188)
位于com.ourapplication.pilote.persistence.PersistenceConfiguration.dataSource(PersistenceConfiguration.java:175)
原因:java.sql.SQLException:在准备好的语句协议中还不支持此命令
位于com.google.cloud.sql.jdbc.internal.Exceptions.newSqlException(Exceptions.java:219)
位于com.google.cloud.sql.jdbc.internal.SqlProtoClient.check(SqlProtoClient.java:198)
位于com.google.cloud.sql.jdbc.internal.SqlProtoClient.executeSql(SqlProtoClient.java:87)
位于com.google.cloud.sql.jdbc.internal.SqlProtoClient.executeSql(SqlProtoClient.java:76)
位于com.google.cloud.sql.jdbc.Connection.executeSql(Connection.java:528)
在com.google.cloud.sql.jdbc.PreparedStatement.executeSqlImpl(PreparedStatement.java:141)
位于com.google.cloud.sql.jdbc.Statement.executeImpl(Statement.java:154)
位于com.google.cloud.sql.jdbc.PreparedStatement.execute(PreparedStatement.java:122)
位于com.googlecode.flyway.core.dbsupport.JdbcTemplate.execute(JdbcTemplate.java:214)
位于com.googlecode.flyway.core.dbsupport.mysql.MySQLTable.doLock(MySQLTable.java:58)
在com.googlecode.flyway.core.dbsupport.Table.lock(Table.java:254)上,我有点困惑,因为flyway文档说所有东西都可以通过云SQL和AppEngineDriver在GAE上运行。也许这是最近对Flyway或GAE的改变 但这是我的解决办法 在使用JAD查看GAE的类并跟踪Flyway之后,我认为一些SQL语句(如LOCK)不受RPC协议的支持,RPC协议用于在App Engine服务器实例和MySQL集群之间发送查询 因此,我一时兴起,在Flyway中重写了MySQLTable.java,使用简单语句而不是PreparedStatement。没有语句缓存,但它可以工作 我刚刚将MySQLTable.java复制到我的项目中,保留了相同的打包,并替换了以下内容:
@Override
protected void doLock() throws SQLException
{
jdbcTemplate.executeStatement("LOCK TABLES " + this + " WRITE");
}
@Override
protected void doUnlock() throws SQLException
{
jdbcTemplate.executeStatement("UNLOCK TABLES");
}
executeStatement而不是execute
我们将等待正式修复
问候,
雷米我有点困惑,因为Flyway文档说所有东西都可以在GAE上使用云SQL和AppEngineDriver。也许这是最近对Flyway或GAE的改变 但这是我的解决办法 在使用JAD查看GAE的类并跟踪Flyway之后,我认为一些SQL语句(如LOCK)不受RPC协议的支持,RPC协议用于在App Engine服务器实例和MySQL集群之间发送查询 因此,我一时兴起,在Flyway中重写了MySQLTable.java,使用简单语句而不是PreparedStatement。没有语句缓存,但它可以工作 我刚刚将MySQLTable.java复制到我的项目中,保留了相同的打包,并替换了以下内容:
@Override
protected void doLock() throws SQLException
{
jdbcTemplate.executeStatement("LOCK TABLES " + this + " WRITE");
}
@Override
protected void doUnlock() throws SQLException
{
jdbcTemplate.executeStatement("UNLOCK TABLES");
}
executeStatement而不是execute
我们将等待正式修复
问候,
Remy最新代码已恢复为SELECT。。。由于锁表的其他问题而进行更新。下一个版本应该会再次开箱即用。最新的代码已经恢复为SELECT。。。由于锁表的其他问题而进行更新。下一个版本应该会再次开箱即用