2014-08-31 4 views
13

Я пытаюсь настроить dbcp2 с Postgres 9.1Метод org.postgresql.jdbc4.Jdbc4Connection.isValid (интермедиат) еще не реализован

Когда я запускаю мое приложение, он бросает исключение:

Exception in thread "main" org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.) 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:575) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:639) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:664) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:704) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:195) 
    at com.springinpractice.ch02.service.impl.ContactServiceImpl.getContact(ContactServiceImpl.java:64) 
    at com.springinpractice.ch02.ConsoleApp.main(ConsoleApp.java:16) 
Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.) 
    at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2152) 
    at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1903) 
    at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1413) 
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
    ... 7 more 
Caused by: org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented. 
    at org.postgresql.Driver.notImplemented(Driver.java:753) 
    at org.postgresql.jdbc4.AbstractJdbc4Connection.isValid(AbstractJdbc4Connection.java:109) 
    at org.postgresql.jdbc4.Jdbc4Connection.isValid(Jdbc4Connection.java:21) 
    at org.apache.commons.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:914) 
    at org.apache.commons.dbcp2.PoolableConnection.validate(PoolableConnection.java:227) 
    at org.apache.commons.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:303) 
    at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2165) 
    at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2148) 
    ... 11 more 

Вот мой maven POM:

<dependencies> 
    <!-- Spring and Transactions --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring-framework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${spring-framework.version}</version> 
    </dependency> 

    <!-- Logging with SLF4J & LogBack --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
     <scope>runtime</scope> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 


    <!-- Test Artifacts --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${spring-framework.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${junit.version}</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- For JDBC --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>${spring-framework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.1-901.jdbc4</version> 

    </dependency> 

    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-dbcp2</artifactId> 
     <version>2.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
     <version>1</version> 
    </dependency> 

</dependencies> 

ответ

11

Этот метод реализован в текущей версии драйвера. Вы должны использовать старый PgJDBC. Обновить. Он полностью обратно совместим. (Вы должны были указать свою версию PgJDBC в вопросе).

Отдельно, однако, полагаясь на подключение «валидация», обычно это плохая идея. Это всего лишь способ попытаться скрыть состояние гонки. Просто возьмите соединение и используйте его. Если с этим возникла проблема, ваше приложение должно уловить полученное исключение, проверьте SQLSTATE, чтобы узнать, является ли это связанной с подключением ошибкой и повторите попытку с новым подключением.

+4

Thanks Craig. Как только я сменил драйвер на «9.3-1102-jdbc41», он работает. Я думал, что версия драйвера должна соответствовать версии используемой базы данных (9.1). Очевидно, что драйвер с версией 9.3 работает и с старой базой данных. – janetsmith

1

Решение: Задайте запрос проверки для параметра "validationQuery".

для фасоли например: имя свойства = значение «validationQuery» = «SELECT 1»

Этот запрос проверки выполняется против соединения перед возвращением его. Так что у вас есть действительный запрос, выше - фиктивный.

https://commons.apache.org/proper/commons-dbcp/configuration.html

1

Замените PostgreSQL с ниже входа в pom.xml. Моя версия Postgress была postgresql-9.3.10-3.

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