Похоже, либо база данных закрыла соединение, либо какое-то сетевое устройство завершило сокет.Существует много способов обойти эту проблему:
- Вы можете периодически запускать какие-либо запросы типа «поддерживать активность» (например, SELECT 1) для соединения, чтобы поддерживать его.Это предполагает, что оно было закрыто, потому что оно бездействовало.
- Вы можете открывать соединение время от времени.
- Если вы получаете исключение закрытое соединение, то вы можете просто снова открыть соединение.Дух.
- Вы можете использовать пул соединений, который может поддерживать и восстанавливать соединения. Apache DBCP является фаворитом многих.
Я рекомендую последний.Вы бы использовали DBCP что-то вроде:
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setValidationQuery("SELECT 1"); // this is database specific
ds.setTestWhileIdle(true); // test the connections every so often
ds.setUrl(connectURI);
...
while (!shutdown) {
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
...
stmt.close();
// this returns the connection back to the pool instead of really closing
// the connection
conn.close();
}
Поэтому вместо передачи Connection
вы передаете BasicDataSource
и вызываете getConnection()
, когда вам нужно соединение и conn.close()
когда вы закончите с этим.Пул выполняет всю работу по проверке и т. Д. Он также позволит нескольким потокам использовать базу данных.
Надеюсь, это поможет.
Редактировать: Вытакже не может удерживать спящий режим открытым в течение длительного времени.Чтобы показать вам, насколько коротким должен быть сеанс, я процитирую из документов:
Жизненный цикл сеанса ограничен началом и концом логической транзакции.(Длинные транзакции могут охватывать несколько транзакций базы данных.)
Сеанс содержит соединение с базой данных, поэтому вы никогда не захотите сохранять его в течение какого-либо промежутка времени.Вы должны выполнить пару запросов к базе данных (например, один веб-запрос с запросами и обновлениями), а затем закрыть сеанс, чтобы базовое соединение с базой данных могло быть возвращено в пул.