我希望在Spring 4应用程序中使用JDBC SocketFactory连接到Google Cloud SQL。
pom.xml中的依赖项是:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.1.1</version>
</dependency>
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>postgres-socket-factory</artifactId>
<version>1.0.14</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
应用程序上下文.xml包含:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="poolName" value="springHikariCP" />
<property name="connectionTestQuery" value="SELECT 1" />
<property name="dataSourceClassName" value="org.postgresql.ds.PGSimpleDataSource" />
<property name="maximumPoolSize" value="10" />
<property name="idleTimeout" value="30000" />
<property name="dataSourceProperties">
<props>
<prop key="url">jdbc:postgresql://google/mydb?cloudSqlInstance=projectId:region:instance&socketFactory=com.google.cloud.sql.postgres.SocketFactory</prop>
<prop key="user">postgres</prop>
<prop key="password">password</prop>
</props>
</property>
</bean>
但是当我运行应用程序时,我得到以下异常:
原因:java.lang.IllegalArgumentException: cloudSqlInstance 属性未设置。请在 JDBC URL 或 连接属性,其值形式为"项目:区域:实例" at com.google.common.base.Preconditions.checkArgument(Preconditions.java:135(
这里可能出了什么问题?
我相信这是由使用PGSimpleDatasource引起的。Postgres 数据源筛选所有连接 URL 属性。唯一允许的是在以下枚举中找到的那些:
https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/PGProperty.html
您可以在此处查看过滤:
https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/ds/common/BaseDataSource.java#L1276
由于 cloudSqlInstance 不在此列表中,因此套接字工厂无法使用它。
解决方案是使用另一个数据源实现。