最新的 Postgres JDBC41 不能与 HikariCP 和 Hibernate 一起使用:isValid() 未实现

Posted

技术标签:

【中文标题】最新的 Postgres JDBC41 不能与 HikariCP 和 Hibernate 一起使用:isValid() 未实现【英文标题】:Newest Postgres JDBC41 not working with HikariCP and Hibernate: isValid() not implemented 【发布时间】:2014-12-14 14:14:07 【问题描述】:

我想迁移我们的 Java servlet 以使用 Hikari 连接池而不是 C3P0。 但是,我遇到了一个奇怪的错误 - 在 Hibernate 启动期间, servlet 崩溃:

Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.

这是一种奇怪的行为,因为我们使用的是最新的 JDBC41 postgresql 驱动程序,摘自我们的 pom.xml:

<dependency>
   <groupId>org.postgresql</groupId>
   <artifactId>postgresql</artifactId>
   <version>9.3-1102-jdbc41</version>
</dependency>

根据JDBC驱动的changelog,isValid()方法应该已经在9.3-1102中正确实现了。我们使用的是这个版本的 C3P0 驱动程序,绝对没有问题。

我们也尝试过使用Pgsql-NG JDBC 驱动程序,该驱动程序工作正常,但在处理 PostGIS 数据类型时出现错误。

我还尝试将 Hikari 配置中的 connectionTestQuery 设置为 SELECT 1 以强制 Hikari 不使用 isValid(),但这没有效果。

有没有人遇到过这个问题或一些解决方法?

【问题讨论】:

如果您在 pgjdbc-ng 中遇到错误,请在 github 页面上报告它们,如果可能的话进行测试。猜测一下,我会说你在类路径上有多个版本的 PgJDBC,C3P0 找到了一个旧版本并用于池化。 啊,你是对的,对 8.4 JDBC 有一个讨厌的隐藏依赖。感谢您指出这一点,现在一切正常! 【参考方案1】:

如果使用弹簧试试这个:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean>

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP" />
    <property name="dataSourceClassName" value="org.postgresql.ds.PGSimpleDataSource" />
    <property name="maximumPoolSize" value="30" />
    <property name="connectionTestQuery" value="select 1"/>
    <property name="dataSourceProperties">
        <props>
            <prop key="serverName">$jdbc.serverName</prop>
            <prop key="portNumber">$jdbc.portNumber</prop>
            <prop key="databaseName">$jdbc.databaseName</prop>
            <prop key="user">$jdbc.user</prop>
            <prop key="password">$jdbc.password</prop>
        </props>
    </property>
</bean>

SELECT 1 内部替换为isValid(),性能没问题

版本:

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.4.1</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.3-1103-jdbc41</version>
    </dependency>

【讨论】:

以上是关于最新的 Postgres JDBC41 不能与 HikariCP 和 Hibernate 一起使用:isValid() 未实现的主要内容,如果未能解决你的问题,请参考以下文章

休眠缓慢以获取 Postgres 连接

postgres jdbc 客户端证书用户与数据库用户

尝试通过 JDBC 与 Postgres 建立 SSL 连接时出现 PSQLException“无法打开 SSL 根证书文件”

kafka JDBC源连接器无法获取postgres表

通过 JDBC 连接到 postgres 服务器时 sslmode 参数的默认值?

Android 无法直接连接 Postgres 数据库,也无法使用 JDBC 连接