【问题标题】:Cannot load JDBC driver class 'com.mysql.jdbc.GoogleDriver'无法加载 JDBC 驱动程序类“com.mysql.jdbc.GoogleDriver”
【发布时间】: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


【解决方案1】:

编辑添加(来自下面的 cmets):

  • 此外,从 GAE 连接到 Cloud SQL 时,您应该将密码字段留空。
  • 您还应确保,如果您的代码在 GAE 之外运行(例如,在您的工作站、GCE、Jenkins 构建上),它使用现有的 MySQL 连接器,因为 Google 连接器仅在 GAE 上可用。
  • 您可能还想考虑使用现有的 MySQL 驱动程序,该驱动程序可用于 GAE 和其他连接。在https://github.com/GoogleCloudPlatform/appengine-cloudsql-native-mysql-hibernate-jpa-demo-java 有一个演示

【讨论】:

  • 感谢您的回答大卫,这已经配置并且它没有帮助,即使在部署了“mvn appengine:update”并通过发布管道之后,我也得到了同样的错误:“不能load JDBC driver class 'com.mysql.jdbc.GoogleDriver'”,你还有什么建议吗?有没有办法让我通过 ssh 进入 appengine 框进行故障排除?
  • (1) 您无法通过 SSH 连接到 App Engine。 (2) 请确认这是您在 GAE 上遇到的错误,而不是在开发服务器上。 (3) 尝试在 spring/hibernate 舞蹈之前显式调用Class.forName("com.mysql.jdbc.GoogleDriver")。 (4) 您能否获得更完整的回溯,以便我了解您的堆栈是如何尝试加载该类的?
  • (1) 好的。 (2) 我在运行“mvn appengine:update -DenvTarget=Production -DskipTests”时看不到这个错误,我得到一个奇怪的“java.lang.NoSuchFieldError: INSTANCE”(这是由于与 Hibernate jar 版本不兼容造成的) ),我在向命令中引入“mvn clean ..”后解决了这个问题(我认为 appengine:update 会隐含地为我做这件事)。 (3) 我已经设置了驱动程序,现在似乎可以正确加载它,但是我收到一个新错误:“org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'root' @'localhost"
  • 从 (2) 看来,这段代码是在您的工作站上运行,而不是在应用程序引擎上运行,可能是因为测试正在运行。正如我链接到 GoogleDriver 的文档页面上所述,仅适用于 GAE,不适用于开发环境;在本地,您应该使用股票 MySQL 驱动程序。示例代码通过com.google.appengine.api.utils.SystemProperty.environment.value() == SystemProperty.Environment.Value.Production 进行检查;我不知道如何在 spring/hibernate 世界中做到这一点
  • 再次感谢一百万您的 cmets 大卫,感谢您的关注。您知道如何自定义 Compute Engine 虚拟机为我执行的每个 git push 运行的管道实例/作业吗?我可以通过 SSH 访问它,但它无法识别我的环境变量,我也无权访问 Jenkins Web 控制台:(关于如何自定义 mvn 调用或至少设置一个可以被识别的环境变量的任何想法詹金斯的工作?
猜你喜欢
  • 2023-03-15
  • 2014-09-13
  • 2017-05-17
  • 2013-07-28
  • 2016-08-18
  • 2012-04-23
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多