jmap查看java进程占用的数据库连接数

背景:开发中时长会出现无法连接数据库的错误,怀疑应该是不是打开的连接数过多而导致。本例中通过jmap打印虚拟机堆栈信息中的连接数来确定进程所占用的数据库(oracle)连接数。
1.查看当前数据库的连接数
  select count(*) from v$session;
2.启动30个线程同时查询数据库(连接池中最大允许50个连接),但所有线程再并未关闭连接
for (int i=0;i<30;i++){
	        	Runnable r = new Runnable(){
					@Override
					public void run() {
						Connection con = null;
						Statement stm = null;
						try {
							con = DataBasePool.getConnection();
							stm = con.createStatement();
							stm.execute("select * from tt_bar_track t");
							
							Thread.currentThread().sleep(10000);
						} catch (Exception e) {
							throw new RuntimeException("exec error", e);
						} finally {
							//DataBasePool.close(con, stm);
						}
					}
		        	
		        };
		        Thread t = new Thread(r);
		        t.start();
		        
	        }

  3.查看此时的数据库连接数增加了30个
    select count(*) from v$session;
  4.使用jmap (jmap -histo:live pid )查看此时的java所有对象数量,找T4CConnection的个数为30。


  结论:使用jmap看T4CConnection的数量即为该java进程占用的数据库连接数

你可能感兴趣的:(java)