我在我的 Ubuntu 13.10 机器上使用 RDBMS 和本地 MySQL 实例成功完成了JDO 的 DataNucleus 教程。
在尝试在 Google CloudSQL 实例上进行相同的工作时,我遇到了一些问题。
为了进行切换,我替换了以下内容:
<property name="javax.jdo.option.ConnectionURL" value="jdbc:mysql://127.0.0.1/nucleus?useServerPrepStmts=false"/>
<property name="javax.jdo.option.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
...具有以下内容:
<property name="javax.jdo.option.ConnectionURL" value="jdbc:google:mysql://<my-project>:nucleus/nucleus?useServerPrepStmts=false"/>
<property name="javax.jdo.option.ConnectionDriverName" value="com.mysql.jdbc.GoogleDriver"/>
我将本地 MySQL 和 CloudSQL 实例设置为具有相同的凭据,因此 javax.jdo.option.ConnectionUserName 和 javax.jdo.option.ConnectionPassword 不需要更改。
在 Google Cloud Console Cloud SQL my-project:nucleus MySQL 实例下,我创建了一个静态 IP,并将我的开发机器的 IP 地址列入白名单。我验证我能够通过“mysql -u root -p -h”本地连接到它。
当我尝试运行“mvn datanucleus:schema-create”时,我得到了这个:
[DEBUG] Exit code: 1
[DEBUG] --------------------
[DEBUG] Standard output from the DataNucleus tool org.datanucleus.store.schema.SchemaTool :
[DEBUG] --------------------
[INFO] DataNucleus SchemaTool : Creation of the schema
An error was encountered creating a PersistenceManagerFactory : Error creating transactional connection factory - please consult the log for more information.
如果我用以下内容替换连接设置,那么它与本地 MySQL 实例的工作方式相同:
<property name="javax.jdo.option.ConnectionURL" value="jdbc:mysql://<Cloud SQL IP>/nucleus?useServerPrepStmts=false"/>
<property name="javax.jdo.option.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
所以,我已经解决了这个问题,但为什么这不适用于 GoogleDriver?我对那个驱动程序内部发生的黑魔法一无所知,但我很好奇是否有办法让它工作,以及我是否有理由完全使用 GoogleDriver。