【问题标题】:java.lang.IllegalStateException: Could not load JDBC driver class [com.mysql.jdbc.GoogleDriver]java.lang.IllegalStateException:无法加载 JDBC 驱动程序类 [com.mysql.jdbc.GoogleDriver]
【发布时间】:2025-12-15 22:55:02
【问题描述】:

我正在尝试将我的数据库从 Google 灵活环境 连接到 Google Cloud SQL。连接字符串和驱动类如下所示:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.GoogleDriver" />
    <property name="url" value="jdbc:google:mysql://mz-test:us-central1:mz-life-cloudsql-prod/mz_db" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

但是,我目前正在接受

org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/classes/context/applicationContext-jooq.xml]: 
            Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; 
            nested PropertyAccessExceptions (1) are:|PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; 
            nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [com.mysql.jdbc.GoogleDriver]

我尝试连接的数据库是第二代 Cloud SQL MySQL 数据库。

为什么会出现这个异常?

App Engine 有这个&lt;use-google-connector-j&gt; 属性。我还没有看到灵活环境的这个属性——至少在我目前阅读的那些页面上没有。我需要在 app.yaml 文件中添加什么内容吗?


不确定我是否必须在灵活环境中执行此操作,但我目前正在尝试在我的 yaml 文件中将 use-google-connector-j 属性设置为 true:

use-google-connector-j: true

但目前看来这不起作用:https://code.google.com/p/googleappengine/issues/detail?id=11444

【问题讨论】:

  • 但是您在问题中添加了两个标签
  • @Jens 那是因为我使用的是 Google Flexible Environment,而这实际上是 Google App EngineGoogle Compute Engine 的混合体 或类似的东西,它们都是(部分)Google Cloud Platform

标签: google-app-engine google-cloud-sql google-flexible


【解决方案1】:

com.mysql.jdbc.GoogleDriver 设计用于 App Engine 标准环境应用程序。

对于在 App Engine 柔性环境应用程序上运行的 Java 应用程序,请使用 mysql-socket-factory 库。

对于基于 Maven 的应用程序,添加对库的依赖项:

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>mysql-socket-factory</artifactId>
    <version>1.0.1</version>
</dependency>

切换到标准/官方com.mysql.jdbc.Driver。连接字符串从

更改
jdbc:google:mysql://instance_name/db_name

jdbc:mysql://google/db_name?cloudSqlInstance=<instance_connection_name>&socketFactory=com.google.cloud.sql.mysql.SocketFactory

的值可在 Google Cloud Console 的 Cloud SQL 实例概览页面上找到。

注意:如果您在 XML 文件中指定连接字符串,您可能需要将特殊字符(如 &amp;amp;)转义为 &amp;amp;

注意:此方法不适用于mysql驱动的开发线(6及以上)。我必须使用生产 5.1.39 版本。

【讨论】:

  • 这是否意味着jdbc:google:mysql://mz-test:us-central1:mz-life-cloudsql-prod/mz_db 现在更改为jdbc:mysql://google/mz_db?cloudSqlInstance=jdbc:google:mysql&amp;socketFactory=com.google.cloud.sql.mysql.SocketFactory 而我只需要添加这个依赖项?
  • 哦..不,我猜应该是jdbc:mysql://google/mz_db?cloudSqlInstance=mz-test:us-central1:mz-life-cloudsql-prod&amp;socketFactory=com.google.cloud.sql.mysql.SocketFactory
  • 好吧,它在抱怨“对实体“socketFactory”的引用必须以“;”结尾分隔符。”但我在想另一件事:我现在使用什么 jdbc 驱动程序?我还用com.mysql.jdbc.GoogleDriver吗? (只是问,因为部署几乎需要永远^^)
  • 你把这个放在哪里?这听起来像是来自 XML 解析器的错误。对于 Flex VM,您将使用标准/官方 MySQL 驱动程序 com.mysql.jdbc.Driver
  • 我已将&amp;amp; 替换为&amp;amp; 并添加了; 但现在我得到Could not create socket factory 'com.google.cloud.sql.mysql.SocketFactory;' ..
最近更新 更多