0

一段时间后我收到此错误Cannot open a new connection because existing connection is still on current thread。我认为这个错误是不言自明的。我的代码是这样的:

字符串 mySQLUrl = "jdbc:postgresql://" + dataLayer.PostgreSQL_Host + "/" + dataLayer.PostgreSQL_Database;

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

为了避免该错误,我想创建一个连接工厂,但要做到这一点,我需要知道如何验证是否有打开的连接(并且仍然有效)并返回它,否则,创建它。有什么东西建好的还是我应该使用旧的try-catch?:|

4

1 回答 1

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

于 2018-01-30T00:04:29.307 回答