IT源码网

测试 jdbc 中连接关闭的时机

qq123 2021年02月13日 数据库 461 0

测试 jdbc 中连接关闭的时机

  • 写一段程序,测试 jdbc 连接的关闭情况
    /** 
         * 测试 jdbc 连接的关闭情况 
         */ 
        public static void testOpenCon(){ 
            //打开连接 
            // getOpenCon(); 
            try { 
                //关闭连接 
                // CON.close(); 
                //如果CON不为空,已连接过 
                if(CON!= null){ 
                    //如果CON是false   
                    // isClosed()该方法判断是否关闭连接   返回true false  返回true是已经关闭  返回fasle在连接 
                    if(!CON.isClosed()){ 
                        System.out.println("Connection连接中"); 
                    } 
                    else { 
                        System.out.println("Connection已关闭"); 
                    } 
                } 
                //如果CON为空,为初始话对象 CON= DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); 
                else { 
                    System.out.println("未初始化Connection对象"); 
                } 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            } 
        }
    View Code
  • 使用 show processlist 查看所有数据库连接
      在数据库进行用show processlist进行查询,得出9个字段

      

      首先做个类进行接收这九个字段

    • package com.wbg.test; 
       
      public class ProcessList { 
          int id; 
          String user; 
          String host; 
          String db; 
          String command; 
          String time; 
          String state; 
       
          @Override 
          public String toString() { 
              return "ProcessList{" + 
                      "id=" + id + 
                      ", user='" + user + '\'' + 
                      ", host='" + host + '\'' + 
                      ", db='" + db + '\'' + 
                      ", command='" + command + '\'' + 
                      ", time='" + time + '\'' + 
                      ", state='" + state + '\'' + 
                      ", info='" + info + '\'' + 
                      ", progress='" + progress + '\'' + 
                      '}'; 
          } 
       
          public int getId() { 
              return id; 
          } 
       
          public void setId(int id) { 
              this.id = id; 
          } 
       
          public String getUser() { 
              return user; 
          } 
       
          public void setUser(String user) { 
              this.user = user; 
          } 
       
          public String getHost() { 
              return host; 
          } 
       
          public void setHost(String host) { 
              this.host = host; 
          } 
       
          public ProcessList(int id, String user, String host, String db, String command, String time, String state, String info, String progress) { 
              this.id = id; 
              this.user = user; 
              this.host = host; 
              this.db = db; 
              this.command = command; 
              this.time = time; 
              this.state = state; 
              this.info = info; 
              this.progress = progress; 
          } 
       
          public String getDb() { 
              return db; 
          } 
       
          public void setDb(String db) { 
              this.db = db; 
          } 
       
          public String getCommand() { 
              return command; 
          } 
       
          public void setCommand(String command) { 
              this.command = command; 
          } 
       
          public String getTime() { 
              return time; 
          } 
       
          public void setTime(String time) { 
              this.time = time; 
          } 
       
          public String getState() { 
              return state; 
          } 
       
          public void setState(String state) { 
              this.state = state; 
          } 
       
          public String getInfo() { 
              return info; 
          } 
       
          public void setInfo(String info) { 
              this.info = info; 
          } 
       
          public String getProgress() { 
              return progress; 
          } 
       
          public void setProgress(String progress) { 
              this.progress = progress; 
          } 
       
          String info; 
          String progress; 
       
          public ProcessList() { 
          } 
      }
      View Code

       使用jdbc进行查看

      /** 
           * 使用 show processlist 查看所有数据库连接 
           */ 
          public static void processList(){ 
              List<ProcessList> list=new ArrayList<>(); 
              ProcessList processList=null; 
              ResultSet rs=executeQuery("show processlist"); 
              try { 
                  while (rs.next()){ 
                      processList=new ProcessList( 
                              rs.getInt("id"), 
                              rs.getString("user"), 
                              rs.getString("host"), 
                              rs.getString("db"), 
                              rs.getString("command"), 
                              rs.getString("time"), 
                              rs.getString("state"), 
                              rs.getString("info"), 
                              rs.getString("progress") 
                      ); 
                      list.add(processList); 
                  } 
              } catch (SQLException e) { 
                  e.printStackTrace(); 
              } 
              for (int i = 0; i <list.size() ; i++) { 
                  System.out.println(list.get(i)); 
              } 
          }
      View Code
    • 测试调用 conn.close 之后,连接的变化情况

     

     
/** 
     * 测试 jdbc 连接的关闭情况 
      */ 
      public static void testOpenCon(){ 
        //打开连接 
         getOpenCon(); 
        try { 
            //关闭连接 
           CON.close(); 
            //如果CON不为空,已连接过 
            if(CON!= null){ 
                //如果CON是false 
                // isClosed()该方法判断是否关闭连接   返回true false  返回true是已经关闭  返回fasle在连接 
                if(!CON.isClosed()){ 
                    System.out.println("Connection连接中"); 
                } 
                else { 
                    System.out.println("Connection已关闭"); 
                } 
            } 
            //如果CON为空,为初始话对象 CON= DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); 
            else { 
                System.out.println("未初始化Connection对象"); 
            } 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
    }
View Code
    • 测试如果不写 conn.close 而是调用 System.gc() 之后,连接的变化情况
        • System.gc()该方法是只是回收垃圾,比如StringBuffer进行回收,gc方法不是直接进行回收的,他还需要等待时间,没有关闭连接

    

    
 /** 
     * 测试 jdbc 连接的关闭情况 
     */ 
    public static void testOpenCon(){ 
        //打开连接 
         getOpenCon(); 
        try { 
            //关闭连接 
            System.gc(); 
            //如果CON不为空,已连接过 
            if(CON!= null){ 
                //如果CON是false 
                // isClosed()该方法判断是否关闭连接   返回true false  返回true是已经关闭  返回fasle在连接 
                if(!CON.isClosed()){ 
                    System.out.println("Connection连接中"); 
                } 
                else { 
                    System.out.println("Connection已关闭"); 
                } 
            } 
            //如果CON为空,为初始话对象 CON= DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); 
            else { 
                System.out.println("未初始化Connection对象"); 
            } 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
    }
View Code

     

 创建一张表,插入随机的 10w 条数据.

  • 使用存储过程的方式插入数据,存储过程的参数是插入数据的条数
  • 需要使用到生成随机字符串的功能,使用一个函数来实现
  • [扩展,可选] 了解 out 类型的参数
  • [扩展,可选] 了解游标的使用
  • [扩展,可选] 使用 jdbc 调用 mysql 存储过程,详细了解

   

DROP database if exists randdatabase; 
-- 创建数据库 
create database randdatabase; 
-- 打开数据库 
use randdatabase; 
-- 创建表 
create table  randtable( 
id int primary key auto_increment, 
str varchar(62), -- 字符串 
sums int                -- 字符串长度 
); 
 
DELIMITER $$  
-- n随机个数 
CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255) CHARSET 'utf8' 
BEGIN  
        -- 首先定义所有字母和数字,包括大小写数字 
    DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
        -- 定义接收字符串 
    DECLARE return_str varchar(255) DEFAULT ''; 
        --    用于计数 
    DECLARE i INT DEFAULT 0; 
    WHILE i < n DO 
                    -- concat('abc',d) 在abc上加d  得到abcd 
                    --    substring(str,5,1)从第5个取1个 
                    -- 用return_str接收字符 
        SET return_str = concat(return_str, substring(char_str, FLOOR(1 + RAND()*62), 1)); 
        --    用i进行计数,当i等于n的时候,就会跳出 
        SET i = i+1; 
    END WHILE; 
    -- 返回字符串 
    RETURN return_str; 
END $$ 
delimiter ; 
-- 定好结束符为"$$" 
delimiter $$ 
-- 创建存储过程 
create procedure randtableadd(n int) 
begin 
        -- 关闭事务 
        set autocommit=0; 
        -- 用于计次数 
        set @i = 0; 
        -- 用于接收随机生成个数 
         set @s = 0; 
         -- 进行循环n次 
     WHILE @i < n DO 
             -- 生成随机数字1-62之间 
            set @s=floor(1+rand()*62); 
            -- 添加到表中 
            insert into randtable(str,sums) values(rand_string(@s),@s); 
            -- 进行加i 
            set @i=@i+1; 
            -- 退出 
     END WHILE; 
     -- 提交事务 
    commit; 
            select '成功录入'; 
end $$ 
delimiter ; 
 
call randtableadd(100000); 
 
 
         
          

 

评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

mysql题目(二学年)