如何使用PostgreSQL JDBC4确定java.sql.Connection是否有效

3

我将尝试编写一个测试方法,该方法返回一个java.sql.Connection以连接到PostgreSQL。

我的测试非常简单:

@Test
public void connectionFactoryShouldReturnOpenConnection() throws Exception {
    Connection conn = ConnectionFactory.getConnection();

    assertTrue(conn.isValid(2));
}
< p > isValid 调用失败了:

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)

发生了什么?肯定有一款PostgreSQL JDBC驱动程序实现了Java 1.6的方法,例如isValid()吧?

这是我正在使用的驱动程序的详细信息:

<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.0-801.jdbc4</version>

我想知道这是否是这样的情况:在1.6之前它不存在,因此所有连接池实现都支持指定要执行的语句来测试连接。现在,由于连接池都支持该功能,因此对于支持新方法的驱动程序需求不高?有点变态,但这就是生活。 - araqnid
1
@EricWilson - 看起来isValid()函数是在9.2.1000版本的驱动程序中实现的(发布于2012年9月27日)。对于重复通知,我表示歉意。 - Chris Forrence
2个回答

4

执行一个简单的查询,如果它能够工作,则是有效的。否则,无效。

简单查询是指类似于以下内容:

SELECT 1;

非常简单。


如果没有其他选择,我会选择那个。但是这让我对我的驱动程序不自信,因为找不到实现如此简单的方法。 - Eric Wilson
坏主意,从超过2百万行的表中选择1会变得非常缓慢...有没有办法完全禁用这个测试连接的东西? - basZero
你可以只使用 "select 1" 而不需要任何表格。这将返回 "1"。非常快速的查询。 - Kaloyan Iliev

2

从postgresql驱动程序源代码中调用 AbstractJdbc4Connection.isValid() 方法时会抛出此异常:

public boolean isValid(int timeout) throws SQLException
{
    checkClosed();
    throw org.postgresql.Driver.notImplemented(this.getClass(), "isValid(int)");
}

1
这很有趣,也证实了我的经验,但并没有回答如何使用Java JDBC和Postgres最好地验证连接的问题。 - Eric Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接