Google app engine 播放Siena无法连接到GAE上的MySQL

Google app engine 播放Siena无法连接到GAE上的MySQL,google-app-engine,playframework,google-cloud-sql,siena,Google App Engine,Playframework,Google Cloud Sql,Siena,我正在使用play framework 1.2.7、gae模块1.6.0和锡耶纳模块2.0.7(也测试了2.0.6)。这是一个简单的项目,应该在appengine上运行,并连接到googlecloudsql中的MySQL数据库。我的项目在本地运行良好,但无法连接到生产中的数据库。查看日志,它似乎使用的是postgresql驱动程序,而不是mysql驱动程序 Application.conf # db=mem db.url=jdbc:google:mysql://PROJECT_ID:sienat

我正在使用play framework 1.2.7、gae模块1.6.0和锡耶纳模块2.0.7(也测试了2.0.6)。这是一个简单的项目,应该在appengine上运行,并连接到googlecloudsql中的MySQL数据库。我的项目在本地运行良好,但无法连接到生产中的数据库。查看日志,它似乎使用的是postgresql驱动程序,而不是mysql驱动程序

Application.conf

# db=mem
db.url=jdbc:google:mysql://PROJECT_ID:sienatest/sienatest
db.driver=com.mysql.jdbc.GoogleDriver
db.user=root
db.pass=root
这是崩溃堆栈跟踪

play.Logger niceThrowable: Cannot connected to the database : null
java.lang.NullPointerException
    at com.google.appengine.runtime.Request.process-a3b6145d1dbbd04d(Request.java)
    at java.util.Hashtable.put(Hashtable.java:432)
    at java.util.Properties.setProperty(Properties.java:161)
    at org.postgresql.Driver.loadDefaultProperties(Driver.java:121)
    at org.postgresql.Driver.access$000(Driver.java:47)
    at org.postgresql.Driver$1.run(Driver.java:88)
    at java.security.AccessController.doPrivileged(AccessController.java:63)
    at org.postgresql.Driver.getDefaultProperties(Driver.java:85)
    at org.postgresql.Driver.connect(Driver.java:231)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:215)
    at play.modules.siena.GoogleSqlDBPlugin.onApplicationStart(GoogleSqlDBPlugin.java:103)
    at play.plugins.PluginCollection.onApplicationStart(PluginCollection.java:525)
    at play.Play.start(Play.java:533)
    at play.Play.init(Play.java:305)
这是怎么回事?我正在指定正确的驱动程序和url模式,它使用的是postgresql驱动程序。Google Cloud SQL API访问已启用,允许应用程序连接到mysql实例,我没有使用db=mem。。。我被卡住了,不知道如何前进!:-((

更新:我以为我找到了解决方案,但事实并非如此。如果我保留
%prod
。前缀并正常创建war(或者只是不定义任何DB属性),则应用程序将使用
谷歌数据存储
而不是
云SQL
。如果我创建war文件,在末尾添加
--%prod
(或仅删除application.conf中的
%prod
。前缀),则它将继续无法连接到显示相同初始错误的数据库


有什么想法吗?

我在这个问题上纠缠了这么久,在发布了这个问题后,我很快就找到了解决办法。事实上,这很愚蠢

application.conf文件中的生产环境属性前面必须加上%prod。因此数据库配置应为

%prod.db.url=jdbc:google:mysql://PROJECT_ID:sienatest/sienatest
%prod.db.driver=com.mysql.jdbc.GoogleDriver
%prod.db.user=root
%prod.db.pass=root
一切都很好


编辑:这不是解决方案。问题解决了,但应用程序使用的是数据存储,而不是云SQL

最后,我对play siena模块源代码进行了轻微修改并重新编译

如果有人感兴趣,您需要删除GoogleSqlDBPlugin类第97行代码中的/comment/catch异常:

// Try the connection
                Connection fake = null;
                try {
                    if (p.getProperty("db.user") == null) {
                        fake = DriverManager.getConnection(p.getProperty("db.url"));
                    } else {
                        fake = DriverManager.getConnection(p.getProperty("db.url"), p.getProperty("db.user"), p.getProperty("db.pass"));
                    }
                } finally {
                    if (fake != null) {
                        fake.close();
                    }
                }
由于某些原因,当使用
DriverManager.getConnection()启动时,连接会失败,但当使用
basicDatasource.getConnection()启动时,连接会工作;
这显然是模块在其余代码中使用的方式。因此,如果删除上面的块并重新编译模块,一切都将按预期工作。如果使用JDK 7编译,还需要实现
公共记录器getParentLogger()在GoogleSqlDBPlugin文件末尾的ProxyDriver内部类中抛出SQLFeatureNotSupportedException

奇怪的是,我深入研究了
DriverManager.getConnection()
,它看起来像是某种postgresql驱动程序以某种方式注册了,因为否则我看不出
DriverManager.getConnection()
为什么会调用
org.postgresql.driver.connect()