2013-05-08 165 views
1

我們正在使用Cloud SQL進行GAE。在本地開發服務器上一切都很好。我們使用帶有靜態連接字符串的AppEngineDriver。由於Flyway能夠創建schema_version表,所以在生產環境中連接良好。Google App Engine GAE上的問題:無法鎖定表schema_version

但是,然後我們得到一個錯誤,它無法鎖定所述表。該表是空的。我們有3次遷移,沒有任何執行。

我們在Spring創建DataSource bean時使用Java配置樣式啓動遷移。

這裏是堆棧跟蹤。

非常感謝!

更新1:我在第一個結尾添加了一個相關的輔助堆棧跟蹤。

com.googlecode.flyway.core.api.FlywayException:無法鎖定表ourschemaschema_version: java.sql.SQLException:準備好的語句協議中不支持此命令,但在com.google.cloud.sql.jdbc.internal.Exceptions.newSqlException(Exceptions.java:219) 處的 中不支持此命令。 cloud.sql.jdbc.internal.SqlProtoClient.check(SqlProtoClient.java:198) at com.google.cloud.sql.jdbc.internal.SqlProtoClient.executeSql(SqlProtoClient.java:87) at 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) at com.google.cloud.sql.jdbc.Statement.executeImpl(Statement.java:154) at com.googlecode.flyway.core.dbsupport.JdbcTemplate.execute(JdbcTemplate.java:214) com.googlecode.flyway上的com.google.cloud.sql.jdbc.PreparedStatement.execute(PreparedStatement.java:122) 。在com.googlecode.flyway.core.dbsupport.Table.lock(Table.java:254) 處的com.googlecode.flyway.core.metadatatable上的core.dbsupport.mysql.MySQLTable.doLock(MySQLTable.java:58) 。 MetaDataTableImpl.lock(MetaDataTableImpl.java:121) at com.googlecode.flyway.core.command.DbMigrate $ 1.doInTransaction(DbMigrate.java:140) at com.googlecode.flyway.core.command.DbMigrate $ 1.doInTransaction( DbMigrate.java:138) at com.googlecode.flyway.core.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:54) at com.googlecode.flyway.core.command.DbMigrate.migrate( DbMigrate.java:137) at com.googlecode.flyway.core.Flyway $ 1.execute(Flyway.java:862) at com.googlecode.flyway.core.Flyway $ 1.execute(Flyway.java:815) at com.googlecode.flyway.core.Flyway.execute(Flyway.java:1177) at com.googlecode.flyway.core.Flyway.migrate(Flyway.java:815) at 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)

C aused by:java.sql.SQLException:準備好的語句協議中不支持此命令,但尚未在com.google.cloud.sql.jdbc.internal.Exceptions.newSqlException(Exceptions.java:219) 處運行 。 cloud.sql.jdbc.internal.SqlProtoClient.check(SqlProtoClient.java:198) ,位於com.google.cloud.sql.jdbc.internal。SqlProtoClient.executeSql(SqlProtoClient.java:87) at com.google.cloud.sql.jdbc.internal.SqlProtoClient.executeSql(SqlProtoClient.java:76) at com.google.cloud.sql.jdbc.Connection.executeSql( Connection.java:528) at com.google.cloud.sql.jdbc.PreparedStatement.executeSqlImpl(PreparedStatement.java:141) at com.google.cloud.sql.jdbc.Statement.executeImpl(Statement.java:154) at com.google.cloud.sql.jdbc.PreparedStatement.execute(PreparedStatement.java:122) at com.googlecode.flyway.core.dbsupport.JdbcTemplate.execute(JdbcTemplate.java:214) at com.googlecode。 flyway.core.dbsupport.mysql.MySQLTable.doLock(MySQLTable.java:58) at com.googlecode.flyway.core.dbsupport.Table.lock(Table.java:254)

回答

1

我有點困惑,因爲Flyway文檔說所有的東西都可以在GAE上用Cloud SQL和AppEngineDriver工作。也許這是對Flyway或GAE的最新改變。

但這是我的修復。

在使用JAD查看GAE的類並追蹤Flyway後,我認爲用於在App Engine服務器實例和MySQL集羣之間發送查詢的RPC協議不支持某些SQL語句(如LOCK)。

因此,我突發奇想,重寫了Flyway中的MySQLTable.java,使用簡單的Statement而不是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,而不是執行。

我們將等待官方修復。

問候,

雷米

+1

最新的代碼已經收歸SELECT ... FOR UPDATE由於與LOCK TABLES額外的問題。下一個版本應該再次開箱即用。 – 2013-05-09 08:18:21