Connection.isValid(time) 实际上做了什么来检查连接是否有效?

What does Connection.isValid(time) actually do to check if connection if valid?

使用 OJDBC 进程是否使用 isValid 方法检查连接是否仍然存在?我试图弄清楚它可能对数据库产生什么影响以及这个过程有多繁重。例如它是请求一个列,还是只用几个字节的数据 ping 数据库。

每个供应商实施 jdbc 方法的方式不同。 例如Oracle的实现是:

public boolean isValid(int var1) throws SQLException {
    return this.pingDatabase(var1) == 0;
}

pingDatabase 只是执行 select x from dual :

int doPingDatabase() throws SQLException {
    Statement var1 = null;

    byte var3;
    try {
        var1 = this.createStatement();
        ((oracle.jdbc.OracleStatement)var1).defineColumnType(1, 12, 1);
        var1.executeQuery("SELECT \'x\' FROM DUAL");
        return 0;
    } catch (SQLException var7) {
        var3 = -1;
    } finally {
        if(var1 != null) {
            var1.close();
        }

    }

    return var3;
}

我相信其他供应商也在做类似的事情。

对于 Oracle JDBC 瘦驱动程序,isValid() 的作用取决于驱动程序和数据库的版本。从 11g 开始,JDBC 瘦驱动程序使用 OPING,这是一个非常轻量级的 RPC(尽可能小的往返)。在 11gR2 之前,驱动程序正在执行一个 SELECT 查询,它的开销更大。此外,数据库是 10g 之前的版本,因此不支持 OPING,驱动程序执行 SELECT 查询。