【发布时间】:2015-02-21 18:34:21
【问题描述】:
我面临一个非常奇怪的问题,我的 App Engine 服务器无法加载其 Cloud SQL 的 GoogleDriver,这是错误(它发生在我运行“mvn appengine:update”之后)。
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:596)
...
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.GoogleDriver'
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1429)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
... 48 more
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver
appengine.properties
################### MySQL Configuration - Google Cloud App Engine ##########################
jdbc.driverClassName=com.mysql.jdbc.GoogleDriver
jdbc.url=jdbc:google:mysql://mytestapp:testdb?user=someuser
jdbc.username=someuser
jdbc.password=******
jdbc.dialect=org.hibernate.dialect.MySQLDialect
在我的 Spring 上下文文件中,我有:
<context:property-placeholder location="classpath:appengine.properties" />
<bean
id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" >
<property
name="driverClassName"
value="${jdbc.driverClassName}" />
<property
name="url"
value="${jdbc.url}" />
...
有什么想法吗?
==
确认一下,我已经配置了我的 appengine-web.xml,但它根本没有帮助:
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>mytestapp</application>
<version>1</version>
<threadsafe>true</threadsafe>
<sessions-enabled>true</sessions-enabled>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<use-google-connector-j>true</use-google-connector-j>
</appengine-web-app>
--
由于 hibernate jar 版本之间的一些不兼容,我无法继续前进,所以我一直尝试通过实际的发布管道(Jenkins + Maven + build + test + deploy),我不得不将 Compute Engine VM 的 IP 地址添加到Cloud SQL 实例的授权 IP 列表,以便运行我的单元测试并将其部署到应用程序(但是,如果我保持这种方法,我只能使用 MySQL 驱动程序和 URL 而不是 GoogleDriver 和 URL。所以这是变得棘手...)。
我的 Spring MVC 配置文件加载的 Production.properties 文件中有这些属性:
################### MySQL Configuration - Google Cloud App Engine ##########################
jdbc.driverClassName=com.mysql.jdbc.GoogleDriver
jdbc.url=jdbc:google:mysql://*******testapp:testsqldb?user=root
jdbc.username=root
jdbc.password=*****
jdbc.dialect=org.hibernate.dialect.MySQLDialect
是否有一种简单的方法可以在不使用这种方法的情况下在外部和 GAE Cloud SQL 连接详细信息之间动态切换?
if (SystemProperty.environment.value() ==
SystemProperty.Environment.Value.Production) {
// Connecting from App Engine.
有什么想法吗?
【问题讨论】:
-
MySQL JDBC 驱动程序 JAR 不能包含类 GoogleDriver。
-
刚刚检查,jar 不包含此类。我正在使用“mysql-connector-java-5.1.14”(在我的 pom.xml 中指定)并且它与“mvn appengine:devserver”一起工作得很好,但我的理解是它一旦使用它将使用完全不同的驱动器部署到 Google 云中的实际(远程)应用引擎(即 com.mysql.jdbc.GoogleDriver),我从 Google Cloud Developer Console - Cloud SQL 中的说明中获得了此信息。
-
好吧,看起来您的项目类路径中缺少一些库。错误非常具体:java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver
-
打开 JAR - 你看到那个类了吗?如果没有,你有你的答案。我认为 MySQL JAR 有 com.mysql.jdbc.Driver 用于连接到该数据库。尝试更改名称。
-
伙计们,你没有抓住重点,一旦你部署到谷歌的云,Appengine 应该提供 jar,所有这些 cmets 都假设这是一个普通的网络应用程序。
标签: java mysql hibernate google-app-engine google-cloud-sql