最新的 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() 未实现的主要内容,如果未能解决你的问题,请参考以下文章
尝试通过 JDBC 与 Postgres 建立 SSL 连接时出现 PSQLException“无法打开 SSL 根证书文件”