我在一段时间后收到此错误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());
为了避免这个错误,我想创建一个连接工厂,但为了实现这一点,我需要知道如何验证是否有连接打开(并且仍然有效)并返回它,否则,创建它。有什么东西建成或我应该使用旧的尝试捕获? :|
答案 0 :(得分:1)
如果您收到此异常,则表示您在打开新线程时仍然在当前线程上有连接。这种类型的代码可能会导致连接泄漏,因此框架会阻止您这样做。
此页面:http://javalite.io/database_connection_management#thread-connection-propagation说明模型在当前线程上找到连接。
由于您没有为您的应用程序提供任何上下文,我将举几个例子。
如果这是批处理应用程序(独立应用程序),则需要打开连接,然后关闭它:
try(DB db = Base.open(...)){
// your code here
}
这将确保关闭连接并从当前线程中删除。
如果您使用的是ActiveWeb,则可以使用DBConnectionFilter
:
http://javalite.io/database_configuration
与在任何Web应用程序中一样,您将在处理请求之前打开连接(从连接池中拉出),使用controller中的连接,然后在请求结束时关闭连接(返回池) 。
如果你没有使用ActiveWeb,你可以编写一个简单的Servlet过滤器来做同样的事情,这里有一个例子:ActiveJdbcFilter