Эффекты набора результатов и операторов, не закрывающихся в Java - PullRequest
1 голос
/ 19 февраля 2012

У меня есть Java-приложение, в котором в потоке находится соединение через сокет, которое собирает данные и передает их другому потоку для обработки данных, используя концепцию производителя и потребителя, помещая их в очередь. Проблема в том, что поток обработки базы данных иногда не запускается, и я замечаю, что некоторые из набора результатов и оператор не были закрыты. Может ли это быть причиной его провала или есть какая-то другая причина? Насколько я знаю, что это сбой, это использование метода isAlive для проверки потока обработки базы данных, который показывает, что никакое значение не означает, что он мертв.

Фрагмент моих кодов.

private LinkedBlockingQueue<String> databaseQueue = new LinkedBlockingQueue<String>();
class DatabaseProcessor implements Runnable {
  public void run()
      {
      try 
      {
           createConnection();
           while (true) 
             {
                     message = databaseQueue.take();
                     //all the database processing here with multiple queries and resultsets 
             }
       }
       catch (Exception e) 
       {
        e.printStackTrace(System.out);
        try 
        {    
        dbconn.rollback();  
        } 
        catch (Exception rollback) 
        {    
            rollback.printStackTrace(System.out);
        }           
       }

     }
 }

Ответы [ 2 ]

5 голосов
/ 19 февраля 2012

Кто знает, не глядя на весь ваш код?

Неспособность закрыть ограниченные ресурсы всех видов, не только связанные с базами данных, в конечном итоге проявляется в исчерпании и недоступности.Соединения с базами данных конечны.Наборы результатов - это курсоры, которые также ограничены.

Вы должны закрыть ресурсы в области действия метода, в котором они были созданы.Получите их в блоке try и закройте их в блоке finally, обернутом в отдельные блоки try / catch.

2 голосов
/ 19 февраля 2012

Я очень сомневаюсь, что не закрывающиеся resultSet и statement являются причиной его отказа.Я подозреваю, что это симптом проблемы.Некоторая часть обработки данных в одном из потоков вызывает исключение, и соединения с базой данных не закрываются.

  • Убедитесь, что вы регистрируете все свои исключения соответствующим образом.Вы должны сделать закрытие соединений в том же потоке, что и тот, который их открыл, если можете.Это хороший шаблон.
  • Убедитесь, что у вас есть код try { .. } finally { close database connections... } вокруг ваших исключений.Это обеспечит их закрытие.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...