无法打开新连接,因为现有连接仍在当前线程上 - ActiveJDBC

时间:2018-01-29 01:33:44

标签: multithreading activejdbc javalite

我在一段时间后收到此错误Cannot open a new connection because existing connection is still on current thread。我认为错误是非常自我解释的。我的代码是这样的:

  

String mySQLUrl =“jdbc:postgresql://”+ dataLayer.PostgreSQL_Host +“/”+ dataLayer.PostgreSQL_Database;

     

Base.open(“org.postgresql.Driver”,mySQLUrl,dataLayer.getPostgreSQLUser(),dataLayer.getPostgreSQLPassword());

为了避免这个错误,我想创建一个连接工厂,但为了实现这一点,我需要知道如何验证是否有连接打开(并且仍然有效)并返回它,否则,创建它。有什么东西建成或我应该使用旧的尝试捕获? :|

1 个答案:

答案 0 :(得分:1)

如果您收到此异常,则表示您在打开新线程时仍然在当前线程上有连接。这种类型的代码可能会导致连接泄漏,因此框架会阻止您这样做。

此页面:http://javalite.io/database_connection_management#thread-connection-propagation说明模型在当前线程上找到连接

由于您没有为您的应用程序提供任何上下文,我将举几个例子。

如果这是批处理应用程序(独立应用程序),则需要打开连接,然后关闭它:

try(DB db = Base.open(...)){

  // your code here
}

这将确保关闭连接并从当前线程中删除。 如果您使用的是ActiveWeb,则可以使用DBConnectionFilterhttp://javalite.io/database_configuration 与在任何Web应用程序中一样,您将在处理请求之前打开连接(从连接池中拉出),使用controller中的连接,然后在请求结束时关闭连接(返回池) 。

如果你没有使用ActiveWeb,你可以编写一个简单的Servlet过滤器来做同样的事情,这里有一个例子:ActiveJdbcFilter