Я использую hibernate 3 с c3p0 для программы, которая постоянно извлекает данные из какого-либо источника и записывает их в базу данных.
Теперь проблема в том, что база данных может стать недоступной по некоторым причинам (в простейшем случае: я просто выключаю ее).
Если что-то собирается записать в базу данных, исключений не должно быть - запрос должен ждать всю вечность, пока база данных снова не станет доступной.
Если я не ошибаюсь, это одна из вещей, которую пул соединений мог бы сделать для меня: если есть проблема с БД, просто повторите попытку подключения - в худшем случае для бесконечности.
Но вместо этого я получаю исключение из-за разорванного канала, иногда за ним следует отказ в соединении, а затем исключение передается в мой собственный код, чего не должно быть.
Даже если я поймаю исключение, как я могу снова заново инициализировать спящий режим? (Пока без c3p0 я просто снова построил фабрику сессий, но я не удивлюсь, если это приведет к утечке соединений (или это нормально?)).
База данных - Virtuoso с открытым исходным кодом.
Моя конфигурация hibernate.xml.cfg c3p0:
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.breakAfterAcquireFailure">false</property>
<property name="hibernate.c3p0.acquireRetryAttempts">-1</property>
<property name="hibernate.c3p0.acquireRetryDelay">30000</property>
<property name="hibernate.c3p0.automaticTestTable">my_test_table</property>
<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">10</property>
Кстати: тестовая таблица создана, и я получаю тонны отладочной информации, так что, похоже, она действительно читает конфигурацию.