1

在我的 java 代码中,我正在处理大量数据。所以我将代码作为 servlet 移动到 App Engine 的 Cron Job 中。有些日子它工作得很好。数据量增加后,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)

如何处理这个问题?

4

1 回答 1

0

当在多个线程之间共享单个连接时,此异常很典型。当您的代码不遵循标准 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 我使用带有 servlet Init() 方法的连接池。

没有给我的印象是您以正确的方式做事。这表明您正在 servlet 的init()方法中获取一个数据库连接,并在所有 HTTP 会话中的所有 HTTP 请求中重用相同的连接。这是绝对不对的。servlet 实例仅在 webapp 启动期间创建/初始化一次,并在应用程序的整个剩余生命周期中重复使用。这至少证实了您面临的异常。

只需按照上面演示的标准try-finally习语重写您的 JDBC 代码,您就应该一切就绪。

也可以看看:

于 2013-01-17T03:04:20.930 回答