即使我们以相反的顺序关闭资源,下面的代码似乎也没有正确关闭MySQL连接。再次运行此代码时,它似乎重用了相同的MySQL进程线程,您可以在下面看到与实际运行的MySQL查询交叉引用的MySQL进程列表(从mysql.general_log中提取)。
我们做错了什么?
我们正在使用Tomcat 6.0(不要问。你不想知道。)和Java 1.6.05。
代码:
String cat_name = request.getParameter("category");
if (cat_name != null) {
DBWrapper db = new DBWrapper();
ResultSet rs = null;
try {
String parent_cat_name = null;
rs = db.executeQuery("SELECT cat_name FROM CATEGORY WHERE cat_code = (SELECT cat_main_code FROM category WHERE cat_name='" + cat_name + "')" );
if (rs != null && rs.first()) {
parent_cat_name = rs.getString("cat_name");
page_title = title_prefix + parent_cat_name + " > " + cat_name;
} else {
page_title = title_prefix + cat_name;
}
} catch (Exception e) {
System.out.println(e);
} finally {
try {
if (rs != null) rs.close();
if (db != null) db.closeConnection();
} catch (Exception e) {
System.out.println(e);
}
}
}
DBWrapper.java:
public class DBWrapper {
private Connection con = null;
private Statement stmt = null;
private DataSource ds;
private HashMap tables;
public DBWrapper(){
try {
Context ctx = new InitialContext();
if (ctx == null)
throw new Exception("Boom - No Context");
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/eDB");
if (ds != null) {
con = ds.getConnection();
}
tables = new HashMap();
loadMappings();
} catch (Exception e) {
e.printStackTrace();
}
}
(other stuff)
public void closeConnection(){
try {
if (stmt != null) stmt.close();
if (con != null) con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
MySQL进程列表和查询:
Tomcat-database configuration:
Resource name="jdbc/eDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="***" password="****" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/ce?autoReconnect=true" />
答案 0 :(得分:1)
你可以分享(其他东西)的代码
你是如何获得联系的?从数据库池?我们需要看看能够提供帮助的具体连接类是什么。
我的理论是你的具体连接类可能没有正确释放连接。