2014-08-31 10 views
13

Próbuję skonfigurować dbcp2 z PostgreSQL 9.1Metoda org.postgresql.jdbc4.Jdbc4Connection.isValid (int) nie jest jeszcze zaimplementowana

Kiedy uruchamiam moją aplikację, rzuca wyjątek:

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 

Oto mój ekspert 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> 

Odpowiedz

11

Ta metoda jest zaimplementowana w aktualnej wersji sterownika. Musisz używać starego PgJDBC. Aktualizacja. Jest w pełni kompatybilny wstecz. (W pytaniu powinieneś podać swoją wersję PgJDBC).

Oddzielnie jednak, poleganie na połączeniu "walidacja" jest zwykle złym pomysłem. To tylko sposób na niedoskonałe ukrycie warunków wyścigowych. Po prostu złap połączenie i użyj go. Jeśli wystąpi z tym problem, aplikacja powinna przechwycić wynikowy wyjątek, sprawdź numer SQLSTATE, aby sprawdzić, czy jest to błąd związany z połączeniem, i spróbuj ponownie z nowym połączeniem.

+4

Dzięki Craig. Kiedy zmieniłem sterownik na "9.3-1102-jdbc41", to działa. Myślałem, że wersja sterownika musi pasować do wersji bazy danych, z której korzystam (9.1). Wygląda na to, że sterownik z wersją 9.3 działa również na starej bazie danych. – janetsmith

1

Wymień PostgreSQL z poniższym wpisem pom.xml. Moja wersja Postgress to postgresql-9.3.10-3.

<dependency> 
    <groupId>org.postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.3-1100-jdbc41</version> 
</dependency> 
Powiązane problemy