zoukankan      html  css  js  c++  java
  • Statement.setQueryTimeout(seconds)在家中环境的再次试验 证明此语句还是有效的

    对比实验:https://www.cnblogs.com/xiandedanteng/p/11955887.html

    这次实验的环境是T440p上安装的Windows版Oracle11g,版本为:

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    用于实验造成行锁的程序:

    package com.hy.multidelete;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.apache.log4j.Logger;
    
    public class Deleter {
        private static Logger log = Logger.getLogger(Deleter.class);
        
        public void doDelete() {
            Connection conn = null;
            Statement stmt = null;
            
            try{
                Class.forName(DBParam.Driver).newInstance();
                conn = DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd);
                conn.setAutoCommit(false);
                stmt = conn.createStatement();
                
                String sql="delete from TestTB17 where id=1";
                int deleted=stmt.executeUpdate(sql);
                
                // 在此处停住断点,另一个删除程序CleanExpiredMocker会执行不下去
                log.info("Deleter deleted "+deleted+" records.");
                
                // 直到接下来回滚或提交CleanExpiredMocker才可以执行
                conn.rollback();
                log.info("Rollbacked.");
            } catch (Exception e) {
                System.out.print(e.getMessage());
            } finally {
                try {
                    stmt.close();
                    conn.close();
                } catch (SQLException e) {
                    System.out.print("Can't close stmt/conn because of " + e.getMessage());
                }
            }
        }
        
        public static void main(String[] args) {
            Deleter d=new Deleter();
            d.doDelete();
        }
    }

    设置了执行sql超时的程序:

    package com.hy.multidelete;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.apache.log4j.Logger;
    
    public class CleanExpiredMocker {
        private static Logger log = Logger.getLogger(CleanExpiredMocker.class);
        
        public void doClean() {
            Connection conn = null;
            Statement stmt = null;
            
            try{
                Class.forName(DBParam.Driver).newInstance();
                conn = DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd);
                stmt = conn.createStatement();
                stmt.setQueryTimeout(2);
                
                String sql="delete from TestTB17 where id<250";
                int deleted=stmt.executeUpdate(sql);
                log.info("CleanExpiredMocker deleted "+deleted+" records.");;    
            } catch (Exception e) {
                System.out.print(e.getMessage());
                e.printStackTrace();
            } finally {
                try {
                    stmt.close();
                    conn.close();
                } catch (SQLException e) {
                    System.out.print("Can't close stmt/conn because of " + e.getMessage());
                }
            }
        }
        
        public static void main(String[] args) {
            CleanExpiredMocker c=new CleanExpiredMocker();
            c.doClean();
        }
    }

    执行后,很快就终止了执行,输出如下:

    ORA-01013: 用户请求取消当前的操作
    java.sql.SQLException: ORA-01013: 用户请求取消当前的操作
    
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
        at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194)
        at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
        at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1814)
        at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1779)
        at oracle.jdbc.driver.OracleStatementWrapper.executeUpdate(OracleStatementWrapper.java:277)
        at com.hy.multidelete.CleanExpiredMocker.doClean(CleanExpiredMocker.java:24)
        at com.hy.multidelete.CleanExpiredMocker.main(CleanExpiredMocker.java:41)

    程序,有时候真是跑起来才知道结果。

    --END-- 2019年11月29日21:11:10

  • 相关阅读:
    SQL性能--left join和inner join的运行速度与效率
    20分钟搭建selenium+python+pydev+eclipse环境
    python 模拟双色球输出
    python 装饰器
    leetcode python丑数
    leetcode python找不同
    TCP和UDP的区别以及使用python服务端客户端简单编程
    python 上台阶
    leetcode python快乐数
    mysql 两例习题
  • 原文地址:https://www.cnblogs.com/heyang78/p/11960320.html
Copyright © 2011-2022 走看看