2

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

应用程序.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. 前缀并正常创建一个战争(或者只是不定义任何数据库属性),那么应用程序将使用Google DataStore而不是Cloud SQL. 如果我创建最后添加的 war 文件--%prod(或者只是删除%prodapplication.conf 中的 . 前缀),那么它将一直无法连接到显示相同初始错误的数据库。

请问有什么想法吗?

4

2 回答 2

0

在被困了这么久之后,我在发布问题后立即找到了解决方案。其实很傻。

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

一切运行良好。

编辑:这不是解决方案。问题消失了,但应用程序使用的是 DataStore 而不是 Cloud SQL

于 2013-12-05T17:26:13.027 回答
0

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

如果有人感兴趣,您需要在 GoogleSqlDBPlugin 类的第 97 行附近的代码中删除/注释/捕获异常:

// 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 进行编译,您还需要public Logger getParentLogger() throws SQLFeatureNotSupportedException在 GoogleSqlDBPlugin 文件末尾的 ProxyDriver 内部类中实现。

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

于 2013-12-19T04:05:19.163 回答