java.sql.SQLRecoverableException: соединение уже используется

В моем Java-коде я обрабатываю огромное количество данных. Поэтому я переместил код в качестве сервлета в Cron Job of App Engine. В некоторые дни это работает нормально. После увеличения объема данных задание cron не работает и показывает следующее сообщение об ошибке.

2012-09-26 04:18:40.627
'ServletName' 'MethodName': Inside SQLExceptionjava.sql.SQLRecoverableException: 
    Connection is already in use.

I 2012-09-26 04:18:40.741
This request caused a new process to be started for your application, and thus caused 
your application code to be loaded for the first time. This request may thus take 
longer and use more CPU than a typical request for your application.

W 2012-09-26 04:18:40.741
A problem was encountered with the process that handled this request, causing it to 
exit. This is likely to cause a new process to be used for the next request to your 
application. If you see this message frequently, you may be throwing exceptions during 
the initialization of your application. (Error code 104)

Как справиться с этой проблемой?

1 ответ

Это исключение типично, когда одно соединение используется несколькими потоками. Это, в свою очередь, произойдет, когда ваш код не соответствует стандартной идиоме JDBC, заключающейся в получении и закрытии ресурсов БД в кратчайшем объеме в той же самой области. try-finally блокировать так:

public Entity find(Long id) throws SQLException {
    Connection connection = null; 
    // ...

    try {
        connection = dataSource.getConnection();
        // ...
    } finally {
        // ...
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return entity;
}

Ваш комментарий к вопросу,

@TejasArjun Я использовал пул соединений с помощью метода сервлета Init().

не производит на меня впечатление, что вы делаете это правильно. Это говорит о том, что вы получаете соединение с БД в сервлете init() метод и повторное использование одного и того же через все запросы HTTP во всех сеансах HTTP. Это абсолютно не правильно. Экземпляр сервлета создается / инициализируется только один раз при запуске веб-приложения и повторно используется в течение всего оставшегося срока службы приложения. Это по крайней мере подтверждает исключение, с которым вы сталкиваетесь.

Просто перепишите свой код JDBC в соответствии со стандартом try-finally идиома, как показано выше, и вы должны быть все готово.

Смотрите также:

Другие вопросы по тегам