Я использую JMetric для проверки своего пула DBCP.Используя один тест с 20 потоками, я получаю исключение nullPointerException, когда я пытаюсь создатьStatement из одного соединения.
Мой контекст имеет такой конф:
<Context path="/MyApp" docBase="mypath..." crossContext="true" debug="1" reloadable="true" privileged="true" >
<Resource name="jdbc/orcl"
auth="Container"
type="oracle.jdbc.pool.OracleDataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
url="jdbc:oracle:thin:@192.168.1.11:1521:orcl"
user="....."
password="....."
implicitCachingEnabled="true"
connectionCachingEnabled="true"
connectionCacheProperties="{InitialLimit=20, MinLimit=50, MaxLimit=350, MaxStatementsLimit=0, ConnectionWaitTimeout=10}"
connectionCacheName="cacheOrcl"
validationQuery="select 1 from dual"
removeAbandoned="true"
maxIdle="350"
removeAbandonedTimeout="45"
logAbandoned="true"
/>
</Context>
У меня есть один фильтр, который получает соединение ивыполнить некоторые выборы.Чтобы повторно использовать логику для получения соединения, я создаю один статический метод:
public static synchronized Connection getConnection() throws ConnectionException {
Connection con = null;
try {
Object o = new InitialContext().lookup("java:comp/env/jdbc/orcl");
if( o instanceof DataSource ) {
DataSource ds = (DataSource) o;
con = ds.getConnection();
LOGGER.debug("conn:" + con);
}
}catch( Exception e ) {
LOGGER.error(LogError.logError(e));
}
if( con == null ) {
throw new ConnectionException("Conn null");
}
return con;
}
И мой фильтр:
try {
if( session.getAttribute(PARAM) == null ) {
conexao = ConnectionUtil.getConnection();
//call DAOS... (ommited)
}
}catch( Exception e ) {
LOGGER.error( LogError.logError(e) );
} finally {
try{
conexao.close();
conexao = null;
}catch( Exception e ){}
}
Чтобы получить исключение NullPointerException, я думаю, что getConnection () из DataSourceвосстановление одного соединения, которое все еще используется.
Есть ли проблема с одним статическим синхронизированным методом для получения соединения из пула?
Исключение NullPointerException:
Statement st = conexao.createStatement();
РЕДАКТИРОВАТЬ: Я сейчас пытаюсь tomcat-JDBC.Кажется, он лучше обрабатывает открытые соединения, но все еще не работает у одновременных пользователей (то же самое NullPointerException или иногда java.sql.SQLException: соединение уже было закрыто.)