繁体   English   中英

ORMLite - After.commit,.setAutoCommit - 连接未关闭

[英]ORMLite — After .commit , .setAutoCommit — Connection NOT closed

我在服务器和客户端制作的解决方案上使用 ORMLite。

在服务器端我使用 PostgreSQL,在客户端我使用 SQLite。 在代码中,我使用相同的 ORMLite 方法,而不关心托管的数据库(Postgres 或 SQLite)。 我也使用了池连接。

我没有打开连接,当我需要 Sql 查询时,ORMLite 会注意打开和关闭连接。

有时我使用以下代码在服务器端的后台执行长时间操作,因此在 DB PostgreSql 中。

final ConnectionSource OGGETTO_ConnectionSource = ...... ;
final DatabaseConnection OGGETTO_DatabaseConnection =
     OGGETTO_ConnectionSource.getReadOnlyConnection( "tablename" ) ;
OGGETTO_DAO.setAutoCommit(OGGETTO_DatabaseConnection, false); 
// do long operation with Sql Queries ;
OGGETTO_DAO.commit(OGGETTO_DatabaseConnection);
OGGETTO_DAO.setAutoCommit(OGGETTO_DatabaseConnection, true);

我注意到打开的连接数增加了,因此在某个时间后这个数字太大而无法停止服务器(SqlException“连接到数据库的客户端太多”)。 我发现这是由于上面的代码片段,似乎在这个片段之后连接没有关闭 e 保持打开状态。 当然我不能在最后添加一个“OGGETTO_ConnectionSource.close()”,因为它关闭了池连接源。 如果我在末尾添加“OGGETTO_DatabaseConnection.close();”,它不起作用,打开的连接继续增加。

如何解决?

我发现这是由于上面的代码片段,似乎在这个片段之后连接没有关闭 e 保持打开状态。

让我们使用 RTFM。 这是ConnectionSource.getReadOnlyConnection(...)方法的 javadocs。 我将引用:

Return a database connection suitable for read-only operations. After you are done,
you should call releaseConnection(DatabaseConnection).

您需要执行类似以下代码的操作:

DatabaseConnection connection = connectionSource.getReadOnlyConnection("tablename");
try {
   dao.setAutoCommit(connection false);
   try {
      // do long operation with Sql Queries
      ...
      dao.commit(connection);
   } finally {
      dao.setAutoCommit(connection, true);
   }
} finally {
   connectionSource.releaseConnection(connection);
}

顺便说一句,这大约是TransactionManager.callInTransaction(...)方法正在做的事情,尽管它有更多的 try/finally 块来确保连接的 state 被重置。 您可能应该切换到它。 这是ORMLite 数据库事务的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM