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