2013-06-17 2 views
1

В основном я делаю:Почему BoneCP вызывает Derby ShutdownException после создания экземпляра?

CONNECTION_POOL = new BoneCP(config); 

А потом сразу же после:

CONNECTION_POOL.getConnection().createStatement("SELECT * FROM myTable"); 

, которые иногда (не всегда) бросить org.apache.derby.iapi.error.ShutdownException. Я подозреваю, что у BoneCP есть какая-то гоночная ситуация или проблема с потоками, и это экземпляр, но я ничего не могу найти. Я видел кое-что о ленивом экземпляре, но установление его истинным или ложным не имеет никакого значения.

Любая помощь была бы принята с благодарностью.

ответ

0

Вызов Thread.interrupt вызовет дерби в некоторых случаях. To quote the Derby Guide: «Как правило, не используйте вызовы Thread.interrupt() для сигнальных ожидающих потоков, которые также обращаются к базе данных, потому что Derby может перехватить прерывание и закрыть соединение с базой данных. Вместо этого используйте wait и notify calls».

Это действительно плохо, потому что некоторые библиотеки вызовут Thread.interrupt и так далее. И в некоторых случаях это хорошая практика в зависимости от того, что вы делаете. По-моему, это большой недостаток дизайна ядра базы данных.

В любом случае единственным решением, которое я нашел, было то, что если вы собираетесь вызвать Thread.interrupt(), вам необходимо отрегулировать исходный код Derby, чтобы игнорировать эти прерывания потока. В частности, метод noteAndClearInterrupt(...) в классе org.apache.derby.iapi.util.InterruptStatus

1

Встроенная база данных Derby выключается с помощью вызова getConnection с установленным значением shutdown true. Это закроет базу данных и вызовет исключение ShutdownException. Нет ничего плохого, но согласно jdbc getConnection разрешено только возвращать действительное соединение или вызывать исключение. И поскольку не может быть действительного подключения к базе данных, которая была закрыта, и необходимо исключить исключение. Поэтому вопрос здесь в том, что предполагается, что используемая вами фреймворк поймает это исключение, или если вы должны ее обработать.

+0

Действительно. Кажется, что config установил shutdown = true, но, вероятно, этого не должно быть. – Trejkaz