方法 org.postgresql.jdbc4.Jdbc4Connection.isValid(int) 尚未实现
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25594279/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented
提问by janetsmith
I am trying to configure dbcp2 with postgres 9.1
我正在尝试使用 postgres 9.1 配置 dbcp2
When I run my app, it throws 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
Here is my maven POM:
这是我的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>
采纳答案by Craig Ringer
That method is implemented in the current driver version. You must be using an old PgJDBC. Upgrade. It's fully backward compatible. (You should've specified your PgJDBC version in the question).
该方法在当前驱动程序版本中实现。您必须使用旧的 PgJDBC。升级。它完全向后兼容。(您应该已经在问题中指定了您的 PgJDBC 版本)。
Separately, though, relying on connection "validation" is usually a bad idea. It's just a way of trying to imperfectly hide a race condition. Simply grab the connection and use it. If there's a problem with it, your application should trap the resulting exception, check the SQLSTATE
to see if it's a connection related error, and retry with a new connection.
但是,另外,依赖连接“验证”通常是一个坏主意。这只是试图不完美地隐藏竞争条件的一种方式。只需抓住连接并使用它。如果它有问题,您的应用程序应该捕获产生的异常,检查SQLSTATE
它是否与连接相关的错误,然后使用新连接重试。
回答by Rishi Raj Tandon
Replace your postgresql with below entry in pom.xml. My Postgress version was postgresql-9.3.10-3.
将您的 postgresql 替换为 pom.xml 中的以下条目。我的 Postgress 版本是 postgresql-9.3.10-3。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1100-jdbc41</version>
</dependency>
回答by perimeno
Craig has right. The root cause is postgresql group id changed to org.postgresql and the old group doesn't get the updates. You should refresh your dependency node i.e.:
克雷格是对的。根本原因是 postgresql 组 id 更改为 org.postgresql 并且旧组没有得到更新。你应该刷新你的依赖节点,即:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>
according to the current latest version https://mvnrepository.com/artifact/org.postgresql/postgresql/
根据当前最新版本https://mvnrepository.com/artifact/org.postgresql/postgresql/
回答by ninjakoder
Solution: Set a validation query for parameter "validationQuery".
解决方案:为参数“validationQuery”设置验证查询。
E.g for bean: property name="validationQuery" value="SELECT 1"
例如对于 bean:property name="validationQuery" value="SELECT 1"
This validation query is run against the connection before returning it. So have a valid query, above is a dummy one.
此验证查询在返回之前针对连接运行。所以有一个有效的查询,上面是一个虚拟的。
https://commons.apache.org/proper/commons-dbcp/configuration.html
https://commons.apache.org/proper/commons-dbcp/configuration.html
回答by Shashank
Replace the POM.xml version to
将 POM.xml 版本替换为
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1200-jdbc41</version>
</dependency>
Also, if you are using SSL, the jdbc URL should be following format
此外,如果您使用的是 SSL,则 jdbc URL 应遵循以下格式
spring.datasource.url=jdbc:postgresql://hostName:5432/db?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
回答by sergpank
This ticket helped me to solve the issue: Caused by: java.lang.NoSuchMethodError: org.postgresql.core.BaseConnection.getEncoding()Lorg/postgresql/core/Encoding;
这张票帮助我解决了这个问题:引起:java.lang.NoSuchMethodError: org.postgresql.core.BaseConnection.getEncoding()Lorg/postgresql/core/Encoding;
Basically, you need to exclude PostGIS 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>