J'essaie de configurer dbcp2 avec PostgreSQL 9.1
Lorsque j'exécute mon application, elle génère une exception:
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
Voici mon PAV maven:
<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>
Cette méthode est implémentée dans la version actuelle du pilote. Vous devez utiliser un ancien PgJDBC. Améliorer. C'est totalement compatible avec les versions antérieures. (Vous devriez avoir spécifié votre version de PgJDBC dans la question).
Séparément, compter sur la validation de la connexion est généralement une mauvaise idée. C'est juste une façon d'essayer de cacher de manière imparfaite une situation de concurrence critique. Saisissez simplement la connexion et utilisez-la. En cas de problème, votre application doit intercepter l’exception résultante, consultez la variable SQLSTATE
pour savoir s’il s’agit d’une erreur liée à la connexion et réessayez avec une nouvelle connexion.
Remplacez votre postgresql par l'entrée ci-dessous dans pom.xml. Ma version de Postgres aws postgresql-9.3.10-3.
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1100-jdbc41</version>
</dependency>
Craig a raison. La cause principale est que l'ID de groupe postgresql a été remplacé par org.postgresql et que l'ancien groupe ne reçoit pas les mises à jour. Vous devez actualiser votre nœud de dépendance, à savoir:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>
selon la dernière version actuelle https://mvnrepository.com/artifact/org.postgresql/postgresql/
Solution: Définissez une requête de validation pour le paramètre "validationQuery".
E.g pour haricot: property name = "validationQuery" value = "SELECT 1"
Cette requête de validation est exécutée sur la connexion avant de la renvoyer. Donc, avoir une requête valide, ci-dessus est une question factice.
https://commons.Apache.org/proper/commons-dbcp/configuration.html
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1100-jdbc41</version>
</dependency>
changé le pilote, ça marche!
Ce billet m'a aidé à résoudre le problème: Causé par: Java.lang.NoSuchMethodError: org.postgresql.core.BaseConnection.getEncoding () Lorg/postgresql/core/Encoding;
Fondamentalement, vous devez exclure les stubs PostGIS:
<dependency>
<groupId>org.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>1.3.3</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.postgis</groupId>
<artifactId>postgis-stubs</artifactId>
</exclusion>
</exclusions>
</dependency>