程序中使用proxool-0.9.0RC2.连接池,但导致了内存泄漏,代码如下:
package com.mypackage;import java.io.File;
//import org.apache.log4j.Category;
//import .......(省略)public class ProxoolTest extends Thread {
private Connection conn = null; public ProxoolTest() {
this.conn = DBConnectionManage.getConnection();
this.start();
} public void run() {
this.uploadCSV();
DBConnectionManage.closeConnection(conn);
} /**
 * 上传CSV文件
 */
private void uploadCSV() {
StringBuffer sqlQueryUsage = new StringBuffer();
sqlQueryUsage.append("select * from tableName"); Statement stmt = null;
ResultSet rst = null; try {
stmt = this.conn.createStatement();
rst = stmt.executeQuery(sqlQueryUsage.toString()); while (rst.next()) {
String subId = rst.getString("SUBSCRIBER_ID"); if (this.isUpload(subId, row)) {
// 将数据写入文件
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rst != null)
rst.close();
if (stmt != null)
stmt.close(); } catch (Exception e) {
System.err.println("System Error");
}
}
} /**
 * 是否满足上传条件
 * 
 * @param row
 *            一条上传数据
 * @return boolean true:满足;false:不满足
 */
private boolean isUpload(String subId) {
StringBuffer sql = new StringBuffer();
sql
.append("SELECT a.subscriber_id, "
+ "quota_usage1 - quota_limit1 quota1, quota_usage2 - quota_limit2 quota2, "
+ "quota_usage3 - quota_limit3 quota3, quota_usage4 - quota_limit4 quota4  "
+ "FROM qm_subscriber_quota_usage a, qm_subscriber_quota_limit b "
+ "WHERE a.subscriber_id = '" + subId
+ "' AND a.subscriber_id = b.subscriber_id "); Statement stmt = null;
ResultSet rst = null; try {
stmt = conn.createStatement();
rst = stmt.executeQuery(sql.toString()); if (rst.next()) {
for (int i = 1; i <= 4; i++) {
if (Long.parseLong(rst.getString("QUOTA" + i)) >= 0)
return true;
}
}
} catch (Exception e) { } finally {
try {
if (rst != null) {
rst.close();
rst = null;
} if (stmt != null) {
stmt.close();
stmt = null;
} } catch (Exception e) {
System.err.println("System Error");
}
} return false; }}在上面的代码中while 循环中调用了isUpload方法,其中这个方法要进行数据库操作,方法中用线程的conn属性创建了stmt 进行操作,但在测试过程中发现此方法导致程序内存一直疯长,直至jvm崩溃!如果isUpload中的connection从连接池中重新新获取,并且操作结束後close掉,而不用线程中已有的conn,则不会产生内存泄漏(程序占用内存基本不变),或者将线程的conn用JDBC获取而不用连接池,在isUpload中也直接引用这个conn则也不会有内存泄漏发生.这是怎么回事?
难道从proxool中获取的连接与用JDBC获取的不同?