Я изначально написал способ сделать это, что связано с 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; })
Хорошее старомодное кошмарное топливо. Что здесь происходит?
mktemp
, и вызывает его PIDFILE
PIDFILE
, снова для hygeine foo
; это выполняется в составном заявлении, так что &
связывается с foo
, а не со всем предыдущим конвейером foo
в замену процесса, которая ждет bar
чтобы появиться, а затем убивает foo
(из которых более поздней) foo
в переменной, записываем его в файл с именем PIDFILE
, а затем ждите его, поэтому что вся команда ждет foo
, чтобы выйти, прежде чем выйти; || true
отбрасывает статус выхода ошибки foo
, когда это происходит. Код внутри замещения процесса работает следующим образом:
tee
входной сигнал (стандартная ошибка foo
), перенаправление стандартного вывода tee
на стандартную ошибку, так что стандартная ошибка foo
действительно появляется на стандартной ошибке grep -q
на который ищет указанный шаблон и выходит, как только он найдет его (или когда он достигнет конца потока), без печати чего-либо, после чего (если он нашел строку и успешно вышел) оболочка переходит к ... kill
процесс, PID которого зафиксирован в файле с именем PIDFILE
, а именно foo
Кажется, твой код - одно из больших условий гонки. Только один экземпляр сервлета используется для нескольких запросов. В результате при одновременных запросах ваш текущий код может и будет пропускать соединения.
Когда выполняются параллельные запросы, каждый из них создаст соединение и назначит его одной и той же переменной экземпляра, поэтому одно или несколько соединений будут потеряны и останутся открытыми. Использование этого DBConnection.getConnection
/ DBConnection.closeConnection
позволяет предположить, что у вас также есть потенциальная утечка соединений.
Пожалуйста, прекратите использовать поля, чтобы сохранить ваши connection
и statement
, и вместо этого сделайте эти локальные переменные. Также рассмотрите возможность использования try-with-resources для правильного закрытия соединений и рассмотрите возможность использования DataSource
напрямую вместо использования этой (вероятно, ненужной) абстракции DBConnection
.