Как удалить недопустимое соединение с базой данных из пула - PullRequest
11 голосов
/ 17 мая 2011

Я использую пул соединений tomcat с базой данных oracle . Это работает нормально, но когда я использую свое приложение после долгого времени, оно выдает ошибку " сброс соединения ". Я получаю эту ошибку из-за того, что физическое соединение на сервере Oracle было закрыто до того, как логическое соединение было закрыто на источнике данных Tomcat. Поэтому, прежде чем получить соединение из источника данных, я проверяю действительность соединения с помощью метода isValid (0) объекта соединения, который выдает false, если физическое соединение было закрыто. Но я не знаю, как удалить , что недопустимое соединение объект из пула.

Ответы [ 4 ]

9 голосов
/ 17 мая 2011

Это может быть связано с тем, что на сервере базы данных есть тайм-аут, чтобы не позволять соединениям жить дольше заданного времени, или умирать, если он не получает что-то, говорящее, что он все еще действителен. Один из способов исправить это - включить keepalive. Они в основном пингуют сервер базы данных, говоря, что они все еще являются действительными соединениями.

Это - довольно хорошая ссылка на конфигурации Tomcats DBCP. Взгляните на раздел «Предотвращение утечек из пулов соединений дБ». Похоже, это может быть хорошим местом для начала.

6 голосов
/ 22 июня 2011

Я использовал validatationquery при настройке источника данных в server.xml файле. Он собирается проверить действительность соединения, выполнив запрос к базе данных, прежде чем передать его приложению.

для Oracle

validationQuery="/* select 1 from dual */"

для MySql

validationQuery="/* ping */"
0 голосов
/ 15 декабря 2016

Если мы хотим избавиться от некорректного java.sql.connection из пула соединений Tomcat jdbc,

мы можем сделать это явно в программе. Разверните его в org.apache.tomcat.jdbc.pool.PooledConnection, setDiscarded (true) и, наконец, закройте соединение JDBC. ConnectionPool удалит базовое соединение, как только оно будет возвращено.

(ConnectionPool.returnConnection (....))

например. PooledConnection pconn = conn.unwrap (PooledConnection.class); pconn.setDiscarded (истина); conn.Close ();

0 голосов
/ 17 мая 2011

Попробуйте закрыть и открыть, если он недействителен.Я имею в виду, что вы бы заново инициализировали его таким образом, чтобы вам не нужно было удалять его из пула и использовать его повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...