2014-08-31 5 views
13

Ich versuche zu konfigurieren dbcp2 mit Postgres 9.1Methode org.postgresql.jdbc4.Jdbc4Connection.isValid (int) ist noch nicht implementiert

Wenn ich meine app laufen, wirft es Ausnahme:

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 

Hier ist mein 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> 

Antwort

11

Diese Methode ist in der aktuellen Treiberversion implementiert. Sie müssen einen alten PgJDBC verwenden. Aktualisierung. Es ist vollständig abwärtskompatibel. (Sie sollten Ihre PgJDBC-Version in der Frage angegeben haben).

Unabhängig davon, auf die Verbindung "Validierung" zu verlassen, ist in der Regel eine schlechte Idee. Es ist nur eine Möglichkeit zu versuchen, eine Race-Bedingung unvollkommen zu verbergen. Greifen Sie einfach die Verbindung und verwenden Sie sie. Wenn es ein Problem damit gibt, sollte Ihre Anwendung die resultierende Ausnahme abfangen, überprüfen Sie die SQLSTATE, um festzustellen, ob es einen verbindungsbedingten Fehler gibt, und versuchen Sie es erneut mit einer neuen Verbindung.

+4

Dank Craig. Sobald ich den Treiber zu "9.3-1102-jdbc41" änderte, funktioniert es. Ich dachte, dass die Version des Treibers mit der Version der Datenbank übereinstimmen muss, die ich verwende (9.1). Anscheinend funktioniert der Treiber mit der Version 9.3 auch auf der alten Datenbank. – janetsmith

1

Ersetzen Sie Ihre postgresql mit unter Eintrag in pom.xml. Meine Postgress-Version war postgresql-9.3.10-3.

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