500w 个 com.esproc.jdbc.InternalConnection 异常

正式环境运行一段时间,使用 jmap -histo:live 21864 > jmap_21864.txt 导出内存对象。

发现500wcom.esproc.jdbc.InternalConnection**** 严重异常
imagepng

服务器资源 16 核,32G 内存

imagepng

过了 10 分钟,又导出一个 jmap,数量没有减少,反而继续增加。
imagepng

代码如下:
// 获取结果集
ResultSet rs = null;
// 建立连接
Connection con = EsProcUtils.getConnection();

	String fileName = "call form-db2-page-parameter(?,?,?,?)";
	if(start+limit < 1000) {
		fileName = "call form-db2-page-parameter-fetch(?,?,?,?)";
	}
	
	try {
		com.esproc.jdbc.InternalCStatement st = (com.esproc.jdbc.InternalCStatement) con.prepareCall(fileName);
		
		//组装集算器第一个数组参数
		String[] listIpAndDb = EsProcUtils.ipToArray(listIp, db);
		st.setObject(1, listIpAndDb);//数据库名字
		
		if(start+limit < 1000) {
			BasicDBObject dataTimeSort = new BasicDBObject();
			dataTimeSort.put(FormItemDataShow.DATA_TIME, -1);
			st.setObject(2, EsProcUtils.runCommand(table, query, null, dataTimeSort, start+limit, start+limit));
		}else {
			st.setObject(2, EsProcUtils.runCommand(table, query, null, sortValue, start+limit));
		}
		st.setObject(3, start);
		st.setObject(4, limit);
		
		List<List<BasicDBObject>> listResult = new ArrayList<List<BasicDBObject>>();
		
		// 执行存储过程
		boolean hasResult  = st.execute();
		if(!hasResult) {
			//此时没有结果集,无法获取,hasResult为false
			return page;
		}
		
		rs = st.getResultSet();
		if(rs == null) {
			return page;
		}
		
		ResultSetMetaData rsmd = rs.getMetaData();
		int colCount = rsmd.getColumnCount();
		
		List<String> listColTitle = EsProcUtils.listColTitle(rsmd, colCount);
		BasicDBObject basicDBObject = null;
		List<BasicDBObject> list = null;
		//获取列的值
		while (rs.next()) {
			list = new ArrayList<BasicDBObject>();
			basicDBObject = EsProcUtils.resultSetToBasicDBObject(rs, colCount, listColTitle);
			list.add(basicDBObject);
			listResult.add(list);
		}
		
		page.setResults(listResult);
		
		if(page.getNoTotal()!=null && page.getNoTotal()) {
			
		}else {
			EsProcUtils.close(rs, con);
			
			Long totalPages = null;
			if(start == 0 && limit > listResult.size()) {
				//第一页,并且返回的数据要少limit,则任务这就是整体数据集合,不需要二次count
				totalPages = 0L+listResult.size();
			}else {
				totalPages = countByEsproc(listIp, db, table, query);
			}
			if(totalPages!=null) {
				page.setTotalRecords(totalPages.intValue());
			}
		}
	} catch (Exception e) {
		throw e;
	}finally {
		EsProcUtils.close(rs, con);
	}
	return page;

/**
* 关闭集算器的连接
* @param rs
* @param con
*/
public static void close(ResultSet rs, Connection con) {
if(rs!=null) {
try {
rs.close();
rs = null;
} catch (Exception e) {
log.error(“关闭游标或者链接报错”, e);
}
}

	if(con!=null) {
		try {
			con.close();
			con = null;
		} catch (Exception e) {
			log.error("关闭游标或者链接报错", e);
		}
	}
	
}

com.esproc.jdbc.InternalConnection 为什么这么高呢?