
[英]Batch Update: connection.commit() at the very end, with setAutoCommit(false), but data doesn't get rolled back
[英]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.