【发布时间】:2016-04-17 02:41:41
【问题描述】:
我有一个方法可以创建与嵌入式 Derby 数据库的连接并对其执行 Select 查询。
public PersonMID findPersonMID(String personAlias, CodeUID aliasTypeCodeUID, LogicalDomainMID logicalDomainMID) throws SQLException
{
Connection connection = getConnection();
try
{
QueryExecutor<Long> findPersonIdByPersonAliasExecutor = FindPersonIdByPersonAliasDelegate.getExecutor(authority,connection, personAlias);
Long result = findPersonIdByPersonAliasExecutor.execute();
if(result == null)
{
return null;
}
return PersonMID.create(authority, result);
}
finally
{
JDBCAssistant.close(connection);
}
这是我的查询的样子:
select P.PRSON_ID from PRSON_ALIAS PA join PRSON P on P.PRSON_ID = PA.PRSON_ID and P.LOGICAL_DOMAIN_ID = ? where PA.PRSON_ALIAS_TYPE_CD = ? and PA.ALIAS = ?
当我运行这段代码时,我得到一个异常
JDBCException: java.sql.SQLException: Cannot close a connection while a transaction is still active.
但是,当我在关闭 Connection 之前调用 Connection.commit() 或设置 autoCommit true(我的 Connection 默认设置为 false)我的 Connection 时,它允许我成功关闭连接并获得所需的结果。
但是我真的需要致电commit() 进行Select 操作吗?有什么可承诺的?如果我不提交,是否有没有被释放的锁?
post 说我不应该这样做。我应该能够关闭我的连接而无需提交或回滚。
我错过了什么?
【问题讨论】:
-
如果你用 connection.setAutoCommit(true) 强制自动提交模式会发生什么?
-
@NicolasFilotto 在这种情况下,我可以关闭连接而不会出现任何错误。
-
所以我怀疑在 derby 的全局配置中,这不再是默认启用的自动提交模式。 getAutoCommit() 获取连接后返回什么?或者如果方法 getConnection() 可能没有错
-
如果根据选择的隔离级别没有处于自动提交模式,则与查询匹配的记录可能会被锁定,直到您提交事务以释放锁定
-
不,如果你真的处于自动提交模式,你不需要提交任何东西,这就是为什么我想知道 getAutoCommit() 的值
标签: java hibernate database-connection derby