我们正在将一些功能从我们的应用程序引擎项目中分离出来,并将其转移到谷歌云功能(GCF)。
我一生都无法从 GCF 获得数据库连接。 应用程序引擎应用程序和 GCF 中使用完全相同的代码。
数据库连接像这样初始化,这在应用程序引擎中有效:
String dbconn = "jdbc:mysql:///" + MYDBNAME +
"?cloudSqlInstance=" + PROJECTID + ":us-central1:" + INSTANCEID +
"&socketFactory=com.google.cloud.sql.mysql.SocketFactory;
String uid = "xxx";
String pwd = "xxx";
config.setJdbcUrl( dbconn );
config.setUsername( uid );
config.setPassword( pwd );
ConnectionPool pool = new HikariDataSource( config );
这在应用程序引擎中完美运行。
但是,GCF 在日志中显示了这一点。
无法获取 jdbcUrl=jdbc:mysql:///MYDBNAME?cloudSqlInstance=PROJECTID:us-central1:INSTANCEID&socketFactory=com.google.cloud.sql.mysql.SocketFactory 的驱动程序实例
我还在 GCF 云控制台中配置了 SQL 连接。
pom.xml 文件包含 sql 类。
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>mysql-socket-factory-connector-j-8</artifactId>
<version>1.13.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
问题是我们没有加载 JDBC 驱动程序。 我们试图加载这个类,我们认为它是 JDBC 驱动程序。
Class.forName( "com.google.cloud.sql.mysql.SocketFactory" );
当我们添加这个时(经过几天的尝试和错误),它起作用了。
Class.forName( "com.mysql.cj.jdbc.Driver" );