【发布时间】:2011-06-23 17:40:45
【问题描述】:
我们使用 JDBC 的标准代码部分是……
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
// do stuff with rset
rset.close(); stmt.close(); conn.close();
问题一:在使用Connection Pool时,应该在最后关闭Connection吗?如果是这样,是不是失去了汇集的目的?如果没有,DataSource 如何知道某个特定的 Connection 实例何时被释放并可以重用?我对此有点困惑,任何指针表示赞赏。
问题 2: 以下方法是否接近标准?看起来像是试图从池中获取连接,如果无法建立 DataSource,请使用老式的 DriverManager。我们甚至不确定哪个部分在运行时被执行。 重复上面的问题,是否应该关闭这种方法产生的连接?
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
编辑:我认为我们正在获得池连接,因为我们没有看到堆栈跟踪。
【问题讨论】:
标签: java mysql jdbc connection-pooling