2014-08-31 10 views
13

Sto provando a configurare dbcp2 con Postgres 9.1Metodo org.postgresql.jdbc4.Jdbc4Connection.isValid (int) non è ancora implementata

Quando eseguo la mia app, viene generata un'eccezione:

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 

Ecco il mio MDA 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> 

risposta

11

Questo metodo è implementato nella versione del driver corrente. È necessario utilizzare un vecchio PgJDBC. Aggiornamento. È completamente compatibile con le versioni precedenti. (Dovresti aver specificato la tua versione di PgJDBC nella domanda).

Separatamente, tuttavia, affidarsi alla "convalida" della connessione di solito è una cattiva idea. È solo un modo per cercare di nascondere imperfettamente una condizione di gara. Basta prendere la connessione e usarla. Se c'è un problema, la tua applicazione dovrebbe intercettare l'eccezione risultante, controllare lo SQLSTATE per vedere se si tratta di un errore relativo alla connessione e riprovare con una nuova connessione.

+4

Grazie Craig. Una volta cambiato il driver in "9.3-1102-jdbc41", funziona. Ho pensato che la versione del driver deve corrispondere alla versione del database che sto usando (9.1). Apparentemente il driver con la versione 9.3 funziona anche sul vecchio database. – janetsmith

1

Sostituisci il tuo PostgreSQL con iscrizione qui sotto in pom.xml. La mia versione Post Post era Postgresql-9.3.10-3.

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