我有很多方法可以运行一些插入和更新。一个例子如下:
@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。
为什么在执行每个方法时都不会关闭这些连接?