读书人

使用proxool-0.9.0RC2连接池内存泄漏有

发布时间: 2012-01-09 21:05:41 作者: rapoo

使用proxool-0.9.0RC2连接池内存泄漏问题?
程序中使用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获取的不同?

[解决办法]
up

读书人网 >J2SE开发

热点推荐