Источник данных в пуле соединений jdbc не возвращает соединение [дубликат]

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

Вот способ сделать это:

(PIDFILE=$(mktemp /tmp/foo.XXXXXX) && trap "rm $PIDFILE" 0 \
   && { foo \
           2> >(tee >(grep -q bar && kill $(cat $PIDFILE)) >&2) \
        & PID=$! && echo $PID >$PIDFILE ; wait $PID || true; })

Хорошее старомодное кошмарное топливо. Что здесь происходит?

  1. В крайних скобках помещено все это в подоболочку; это ограничивает объем переменных для целей hygeine
  2. . Мы создаем временный файл, используя синтаксис, который работает как с GNU, так и с BSD mktemp, и вызывает его PIDFILE
  3. Мы установили ловушку выходного ловушка (которая запускается, когда выходит самая внешняя подоболочка), чтобы удалить файл с именем PIDFILE, снова для hygeine
  4. . Мы запускаем foo; это выполняется в составном заявлении, так что & связывается с foo, а не со всем предыдущим конвейером
  5. . Мы перенаправляем стандартную ошибку foo в замену процесса, которая ждет bar чтобы появиться, а затем убивает foo (из которых более поздней)
  6. Мы фиксируем PID foo в переменной, записываем его в файл с именем PIDFILE, а затем ждите его, поэтому что вся команда ждет foo, чтобы выйти, прежде чем выйти; || true отбрасывает статус выхода ошибки foo, когда это происходит.

Код внутри замещения процесса работает следующим образом:

  1. Во-первых, tee входной сигнал (стандартная ошибка foo), перенаправление стандартного вывода tee на стандартную ошибку, так что стандартная ошибка foo действительно появляется на стандартной ошибке
  2. Отправить копия ввода, идущая к файлу, идущему на другую подстановку процесса ( замещение процесса в подстановке процесса )
  3. В рамках более глубокого замещения процесса сначала выполняйте grep -q на который ищет указанный шаблон и выходит, как только он найдет его (или когда он достигнет конца потока), без печати чего-либо, после чего (если он нашел строку и успешно вышел) оболочка переходит к ...
  4. kill процесс, PID которого зафиксирован в файле с именем PIDFILE, а именно foo

0
задан Vinod 18 January 2019 в 05:10
поделиться

1 ответ

Кажется, твой код - одно из больших условий гонки. Только один экземпляр сервлета используется для нескольких запросов. В результате при одновременных запросах ваш текущий код может и будет пропускать соединения.

Когда выполняются параллельные запросы, каждый из них создаст соединение и назначит его одной и той же переменной экземпляра, поэтому одно или несколько соединений будут потеряны и останутся открытыми. Использование этого DBConnection.getConnection / DBConnection.closeConnection позволяет предположить, что у вас также есть потенциальная утечка соединений.

Пожалуйста, прекратите использовать поля, чтобы сохранить ваши connection и statement, и вместо этого сделайте эти локальные переменные. Также рассмотрите возможность использования try-with-resources для правильного закрытия соединений и рассмотрите возможность использования DataSource напрямую вместо использования этой (вероятно, ненужной) абстракции DBConnection.

0
ответ дан Mark Rotteveel 18 January 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: