Моя команда должна внести некоторые изменения и обновить старое веб-приложение. Это приложение имеет один основной поток и от 5 до 15 потоков демона, используемых в качестве рабочих для извлечения и вставки данных в БД.проблемы с объединением пула соединений в многопоточной среде
Всех этих нити имеют такую конструкцию (здесь упрощена для удобства):
public MyDaemon implements Runnable {
// initialization and some other stuffs
public void run() {
...
while(isEnabled) {
Engine.doTask1();
Engine.doTask2();
...
Thread.sleep(someTime);
}
}
}
Класс двигателя обеспечивает ряд статических методов, используемых для maipulate других методов классов DataAccessor, некоторые из этих методов были статичными:
Классы DataAccessor обычно взаимодействуют с БД, используя простые операторы JDBC, заключенные в синхронизированные методы (статические для некоторых классов). DataSource настроен на сервере.
public ThatDataAccessor {
public synchronized void retrieve(DataType data) {
Connection conn = DataSource.getConnection();
// JDBC stuff
conn.close();
}
...
}
проблема является то, что основной поток должен подключиться к БД, и когда эти потоки демона работают легко запускать из доступных соединений из пула, получая «ожидание подключения тайм-аута» исключения. Кроме того, иногда даже те потоки демона получают одно и то же исключение.
Мы должны избавиться от этой проблемы.
У нас есть пул соединений, настроенный на 20 соединений, и больше не может быть добавлено, так как это «20» - это стандарт нашей производственной среды. Некоторые блоки кода необходимо синхронизировать, даже если мы планируем переместить «синхронизированное» ключевое слово только там, где это действительно необходимо. Но я не думаю, что это действительно изменило бы ситуацию.
Мы не испытываем многопоточности программирования, и мы никогда раньше не сталкивались с этой проблемой объединения пулов, поэтому я спрашиваю: - проблема из-за дизайна этих потоков? Есть ли недостатки, которых мы не заметили?
У меня есть профилированные классы потоков один за другим, и пока они не работают параллельно, кажется, что нет «узкого места», чтобы оправдать «ожидающий время ожидания соединения». Приложение работает на WebSphere 7, используя Oracle 11g.
Я использую простой JDBC, но я чувствую, что проблема аналогична той, которую вы выставили. Некоторые части кода очень запутаны, многие команды и разработчики работали над этим, и в некоторых случаях мы обнаружили капли запутанных и вложенных блоков try-catch ... Мы отправимся на поиски этих незакрытых соединений, надеясь, что это решит проблему проблема. :) – javatutorial