如何确保连接将在池中重用

时间:2014-11-14 15:39:30

标签: java sql-server websphere connection-pooling

我遇到的问题是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的连接池属性:

Websphere Connection pool properties

解决方案: 因此,在大多数情况下,我在脚下射击自己。事实证明上面的close函数是正确的,但它也在提交或回滚的Finally语句中被调用,它不会关闭连接。我更改了程序,在提交或回滚后将自动提交设置为true,因此可以正确关闭它。果然这就是问题所在。 谢谢你的帮助。

0 个答案:

没有答案