如果您正在泄漏连接,则无法获得托管连接

时间:2018-04-10 22:34:44

标签: java managed connection

我有很多方法可以运行一些插入和更新。一个例子如下:

@SuppressWarnings("unchecked")
public void insertStuff( String crap1, String crap2 ) throws SQLException {
   Connection conn = null;
   PreparedStatement ps1 = null;
   try
   {
      String sqlStr = " INSERT INTO ... "
                    + " VALUES (? , ? )" ;

      conn = JNDIUtil.getConnection();
      ps1 = conn.prepareStatement(sqlStr);
      ps1.setString(1, crap1);
      ps1.setString(2, crap2);
      ps1.executeUpdate();

   } catch (Exception e) {
      e.printStackTrace();
   } finally {
      DbUtils.close(ps1);
      DbUtils.close(conn);
   }
}

我的JNDIUtil是:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public final class JNDIUtil {

    private static final String JDBC_DB_URL = "blah";

    public static Connection getConnection() {
        Connection conn = null;

        try {
            Context ctx = (Context) new InitialContext();
            DataSource ds = (DataSource)ctx.lookup(JDBC_DB_URL);
            conn = ds.getConnection();
        } catch (final SQLException e) {
            e.printStackTrace();
        } catch (final NamingException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

现在,这是一个jboss eap 6.4服务器。我限制了最大池大小,以便复制生产中发生的相同错误:

<max-pool-size>10</max-pool-size>

当我使用JMeter同时使用20个线程运行负载测试时,出现以下错误:

我收到以下错误:

16:05:20,018 ERROR [stderr] (http-/127.0.0.1:8085-19) java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for blah

每个方法都有一个紧密准备语句,关闭结果集和关闭连接,顺序与它们的创建顺序相反。顺便说一句,DBUtils.close()来自Apache Commons DBUtils。当我查看JBoss管理控制台时,我发现可用的连接数降至0。

为什么在执行每个方法时都不会关闭这些连接?

0 个答案:

没有答案