Новейший Postgres JDBC41 не работает с HikariCP и Hibernate: isValid() не реализован

Я хотел перенести наш сервлет Java для использования пула соединений Hikari вместо C3P0. Однако я столкнулся со странной ошибкой — во время загрузки Hibernate сервлет вылетает с ошибкой:

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, метод isValid() уже должен быть правильно реализован в версии 9.3. -1102. Мы использовали эту версию драйвера с C3P0, и у нас не было абсолютно никаких проблем.

Мы также пытались использовать драйвер Pgsql-NG JDBC, который работал правильно, но содержал ошибки при обработке типов данных PostGIS.

Я также попытался настроить connectionTestQuery в конфигурации Hikari на SELECT 1, чтобы заставить Hikari не использовать isValid(), но это не дало никакого эффекта.

Есть ли у кого-нибудь опыт решения этой проблемы или какие-то обходные пути?


person NumberFour    schedule 14.12.2014    source источник
comment
Если вы столкнулись с ошибками в pgjdbc-ng, сообщите о них на странице github, по возможности с тестами. На первый взгляд, я бы сказал, что у вас есть несколько версий PgJDBC в пути к классам, и C3P0 находит более старую версию и использует ее для объединения.   -  person Craig Ringer    schedule 14.12.2014
comment
Ах, вы правы, была одна неприятная скрытая зависимость от 8.4 JDBC. Спасибо за указание на это, теперь все работает хорошо!   -  person NumberFour    schedule 14.12.2014


Ответы (1)


Попробуйте это, если используете spring:

<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>
person samarone    schedule 26.08.2015