【问题标题】:What does Connection.isValid(time) actually do to check if connection if valid?Connection.isValid(time) 实际上会做什么来检查连接是否有效?
【发布时间】:2016-10-24 15:07:08
【问题描述】:

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

【问题讨论】:

    标签: java sql database jdbc ojdbc


    【解决方案1】:

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

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

    【讨论】:

    • 我不是在质疑你的信息,但你的方法是从哪里来的?
    • 驱动程序是public,因为它是用Java编写的,你可以很容易地反编译它。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2011-03-11
      • 2010-11-26
      • 2015-06-23
      • 2017-12-26
      • 2016-10-19
      相关资源
      最近更新 更多