Невозможно получить управляемые соединения, если вы пропускаете соединения
У меня довольно много методов, которые запускают некоторые вставки и обновления. Один пример выглядит следующим образом:
@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.
Почему эти соединения не закрываются при выполнении каждого метода?