我遇到的问题是DataSource没有重用正在创建新连接的连接。问题是,它用完了允许的连接。
我正在使用Java,MSSQL和Websphere。
以下是我打开连接的方式:
public static Connection open(boolean transaction) throws NamingException, SQLException {
Context ctx;
Connection con = null;
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MYDB");
if (ds == null) {
throw new NamingException("No data source");
}
con = ds.getConnection();
if (con == null) {
throw new SQLException("No database connection");
}else{
con.setAutoCommit(!transaction);
}
return con;
}
在每个DAO函数的最后,我都有一个关闭函数的关闭函数。
public static void close(ResultSet rs, PreparedStatement ps, Connection con) throws SQLException{
if (rs != null) {
try { rs.close(); } catch (SQLException e) { throw e;}
}
if (ps != null) {
try {ps.close(); } catch (SQLException e) { throw e;}
}
if (con != null) {
if(con.getAutoCommit()){
try { con.close(); } catch (SQLException e) { throw e;}
}
}
}
我正在使用的这些功能不是基于事务的连接。每次循环到函数时,代码都会调用open连接,但不是使用已建立的连接,而是创建一个新连接。我正在监视在SQL Server Management Studio的活动监视器中创建的连接。
为什么不重复使用连接的任何想法?
编辑:以下是Websphere的连接池属性:
解决方案: 因此,在大多数情况下,我在脚下射击自己。事实证明上面的close函数是正确的,但它也在提交或回滚的Finally语句中被调用,它不会关闭连接。我更改了程序,在提交或回滚后将自动提交设置为true,因此可以正确关闭它。果然这就是问题所在。 谢谢你的帮助。