Я использую 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>
кстати: создается тестовая таблица, и я получаю массу отладочной информации, так что кажется, что она действительно читает конфигурацию.