В нашем коде (который запускается как задание по расписанию через таймер) у нас есть потоки, работающие параллельно для выполнения операции с базой данных. Проблема здесь в том, что каждый поток инициирует соединение через фабрику Hibernate. Эти соединения закрываются после каждого действия с базой данных, но по-прежнему сохраняются в пуле соединений (как НЕАКТИВНЫЕ). Все соединения освобождаются только после завершения задания/основного процесса. Есть ли способ освободить соединение даже из пула соединений после операции с базой данных. Когда мы используем задание cron вместо таймера, процесс автоматически завершается, но здесь cron нам не нужен. Пожалуйста, помогите нам решить эту проблему, так как мы уже приближаемся к выпуску продукта. Примечание. Мы узнали об этом, когда QA тестировалась с большой нагрузкой на задании, и для каждой нагрузки подключались новые соединения.
Освобождение соединений из пула соединений
Ответы (2)
Вам необходимо ограничить количество потоков, создаваемых в пуле потоков.
dotConnect для Oracle использует пул соединений. Строка подключения OracleConnection имеет параметр Pooling. Если Pooling=true (значение по умолчанию), соединение после закрытия не удаляется, а помещается в пул. Когда открывается новое соединение с той же строкой соединения, оно берется из пула (если есть свободные соединения) вместо создания нового. Это обеспечивает значительное улучшение производительности. Если вы используете 800 подключений, каждое из которых подключается в течение 10-15 секунд, и имеется всего несколько разных строк подключения, у вас может не быть 800 реальных подключений. Закрытые подключения будут помещены в пул, и они будут взяты из пула, когда откроется новое подключение с той же строкой подключения. Никакого дополнительного соединения в этом случае открываться не будет.
Вы можете отключить создание пула, добавив «Pooling=false» в строку подключения. В таком случае соединение будет удалено из памяти и освободится сессия. Однако это может привести к потере производительности.
Скорее всего, объединение не должно приводить к созданию слишком большого количества сессий. Попробуйте протестировать приложение с включенным пулом. Если количество сеансов будет слишком большим, вы можете отключить объединение.
Для получения дополнительной информации см. http://www.devart.com/dotconnect/oracle/docs/FAQ.html#q54
Я нашел основную причину проблемы, а также нашел решение. Основной причиной было количество подключений, установленных как минимальное и максимальное, и параметр тайм-аута. Минимум 5, максимум 20 и время ожидания 800 секунд. Но наша работа должна была выполняться каждую минуту. Из-за конфигурации соединения не были должным образом разорваны в течение минуты. Другая проблема заключалась в том, что наш код не использовал фабрику сеансов как синглтон, а инициализировался для каждого потока. Поскольку ресурс не был общим, каждая фабрика сеансов по умолчанию создает 5 подключений и расширяет их до 20 макс. Так как тайм-аут также был выше, прежде чем соединения были освобождены, следующий набор заданий запускается и создает свой собственный набор новых соединений. Наконец, пул переполняется, и оракул становится недоступным.
Мы исправили это, поделившись объектом сеанса, а также установив тайм-аут на меньшее значение, чтобы соединения освобождались из пула.