【问题标题】:HikariCP Google Cloud SQL JDBC Socket Factory cloudSqlInstance property not setHikariCP Google Cloud SQL JDBC 套接字工厂 cloudSqlInstance 属性未设置
【发布时间】:2019-12-15 22:23:14
【问题描述】:

我希望在 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>

applicationContext.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&amp;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 或 具有“项目:区域:实例”形式的值的连接属性 在 com.google.common.base.Preconditions.checkArgument(Preconditions.java:135)

这里可能出了什么问题?

【问题讨论】:

  • 错误提示你的JDBC URL的云SQL实例没有写好。您应该提供一个实例连接名称,其一般结构为“myproject:region:myinstance”。您可以通过导航到 SQL 来在控制台中找到它,单击您要连接的实例并查找“连接到此实例”部分,您可以在其中复制您的实例连接名称。如果您想了解有关连接到 SQL 实例的更多信息,请阅读 github readme。
  • @ddworks 我在 URL 中提供 cloudSqlInstance=projectId:region:instance
  • @ddworks 根据这一行&lt;prop key="url"&gt;jdbc:postgresql://google/mydb?cloudSqlInstance=projectId:region:instance&amp;amp;socketFactory=com.google.cloud.sql.postgres.SocketFactory&lt;/prop&gt; 似乎 OP 提供了 corerct 结构。 @user5155835 确保您将其替换为正确的值。
  • 完整的 JDBC url 应该如下所示:jdbc:postgresql://google/&lt;DATABASE_NAME&gt;?cloudSqlInstance=&lt;INSTANCE_CONNECTION_NAME&gt;&amp;socketFactory=com.google.cloud.sql.postgres.SocketFactory&amp;user=&lt;POSTGRESQL_USER_NAME&gt;&amp;password=&lt;POSTGRESQL_USER_PASSWORD&gt;。您可以找到更多信息here

标签: java spring google-cloud-platform google-cloud-sql hikaricp


【解决方案1】:

我相信这将是由使用 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 不在此列表中,因此套接字工厂将无法使用它。

解决方案可能是使用另一个数据源实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2019-12-14
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多