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

时间:2016-06-22 15:11:07

标签: java sql database jdbc ojdbc

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

2 个答案:

答案 0 :(得分:6)

每个供应商以不同方式实现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;
}

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

答案 1 :(得分:1)

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