Я реализовал веб-сервис java, и внутри него есть класс DbUtil, который я использую в потоке для подключения к базе данных Oracle.Проблема заключается в том, что при развертывании веб-службы в Tomcat возникает ошибка закрытого соединения.
1106] ERROR xac.atws.service - SQL exception, while inserting request to DB. EX :
java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.PhysicalConnection.prepareCall(PhysicalConnection.java:3672)
at oracle.jdbc.driver.PhysicalConnection.prepareCall(PhysicalConnection.java:3633)
at xac.ape.at.ws.DbUtil.insertListMwRequestToDb(DbUtil.java:410)
at xac.ape.at.ws.jaxb.list.AtListProcessor.run(AtListProcessor.java:34)
at java.lang.Thread.run(Thread.java:745)
Чтобы кратко объяснить, что я делаю в классе DbUtil, я имею в виду наличие открытых членов класса conn, dbUser,dbPass, connectionUrl, которые заполняются конструктором класса.Затем я использую эти переменные, чтобы открывать и закрывать новое соединение в каждой функции-члене класса.Образ реализации класса dbUtil прилагается в ссылке. Класс DbUtil .
И открытие и закрытие соединения в каждой функции-члене, например: public DbUtil (String connectionUrlTemp, String dbUserTemp, String dbPassTemp) выдает SQLException {
try {
//set the private connection variables
dbUser = dbUserTemp;
dbPass = dbPassTemp;
connectionUrl = connectionUrlTemp;
//initializing the connection
OracleDataSource ods = new OracleDataSource();
ods.setUser(dbUser);
ods.setPassword(dbPass);
ods.setURL(connectionUrl);
conn = ods.getConnection();
AtServiceImpl.loggerAtws.info("[SYSTEM] Successfully connected to DB");
AtServiceImpl.loggerAtws.debug("[SYSTEM] DB Connection URL : {}", connectionUrl);
} catch (SQLException e) {
AtServiceImpl.loggerAtws.error("[SYSTEM] Exception occured while initializing DB connection. EX : ", e);
}finally {
if (conn != null) {
conn.close();
}
}
}
public Hashtable<String, Integer> sysConfigPull(String systemName, String functionName) throws SQLException {
Hashtable<String, Integer> sysConfig = new Hashtable<>();
try {
//---- added this section ----
//initializing the connection
OracleDataSource ods = new OracleDataSource();
ods.setUser(dbUser);
ods.setPassword(dbPass);
ods.setURL(connectionUrl);
conn = ods.getConnection();
//---- end of added section ----
CallableStatement sqlStatement;
String SQLTEXT = "begin GETSYSCONFIG(?,?,?); end;";
sqlStatement = conn.prepareCall(SQLTEXT);
sqlStatement.setString(1, systemName);
sqlStatement.setString(2, functionName);
sqlStatement.registerOutParameter(3, OracleTypes.CURSOR);
ResultSet rs;
sqlStatement.executeUpdate();
rs = (ResultSet)sqlStatement.getObject(3);
while (rs.next()) {
sysConfig.put("RETRYCOUNT", rs.getInt("RETRYCOUNT"));
sysConfig.put("NOTICEID", rs.getInt("NOTICEID"));
AtServiceImpl.loggerAtws.debug("System Config option: RETRYCOUNT {}, NOTICEID {}",rs.getString("RETRYCOUNT"), rs.getString("NOTICEID"));
}
} catch (SQLException e) {
AtServiceImpl.loggerAtws.error("[SYSTEM] SQL Exception, load system configuration, EX:", e);
}finally {
if (conn != null) {
conn.close();
}
}
return sysConfig;
}
Так что я думаю, что открытие и закрытие соединения в каждой функции-члене может быть причиной ошибки.И если так, то почему?Любая помощь будет оценена.