全部,
为什么EL会在每次例外后发出SELECT 1?有没有办法避免发出这个SELECT 1,因为它挂起/锁定表并且连接没有被释放?
请让我知道为什么会发生这种情况,有没有办法解决这个问题? 谢谢!
[UPDATE]
当然,它的RESOURCE_LOCAL和我使用JPAEclipseCustmizer来设置连接,
<persistence version="2.0" ...>
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
....
<properties>
<property name="eclipselink.session.customizer" value="xxx.JpaEclipseLinkSessionCustomizer" />
</properties>
错误日志,如果您注意到,没有最终工作单位提交的痕迹,我相信可能会将其标记为问题。在这次激发之后,SELECT 1阻止了其他进程,正如我从Database Proceeses list中看到的那样
[EL Finer]:2014-06-01 01:15:24.73 - ClientSession(454114973) - 连接(1046369599) - 线程(线程[Timer-0,10,main]) - 开始批处理语句 [EL Fine]:2014-06-01 01:15:24.731 - ClientSession(454114973) - 连接(1046369599) - 线程(线程[Timer-0,10,main]) - INSERT INTO xxx(名称)价值观(?) [EL Fine]:2014-06-01 01:15:24.732 - ClientSession(454114973) - 连接(1046369599) - 线程(线程[Timer-0,10,main]) - bind =&gt; [XXX] [EL Finer]:2014-06-01 01:15:24.733 - ClientSession(454114973) - 连接(1046369599) - 线程(线程[Timer-0,10,main]) - 结束批处理语句 [EL Fine]:2014-06-01 01:15:24.74 - ClientSession(454114973) - 线程(线程[Timer-0,10,main]) - SELECT 1 [EL警告]:2014-06-01 01:15:24.744 - ClientSession(454114973) - 线程(线程[Timer-0,10,main]) - 本地异常堆栈: 异常[EclipseLink-4002](Eclipse Persistence Services - 2.1.2.v20101206-r8635):org.eclipse.persistence.exceptions.DatabaseException 内部异常:com.sybase.jdbc3.jdbc.SybBatchUpdateException:JZ0BE:BatchUpdateException:执行批处理语句时发生错误:尝试在对象&#39; xxx&#39;中插入重复的键行具有唯一索引&#39; pk_xxx&#39;
Error Code: 0
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeJDK12BatchStatement(DatabaseAccessor.java:830)
[更新2]
看起来问题归结为提交片段,当我尝试将记录插入已存在的表时,它会因唯一约束问题而失败。随之而来的是我的sql没有回滚,所以链式模式没有重新设置为关闭
我在db日志中看到了以下内容,
set CHAINED on
DELETE FROM xx WHERE (xx = @p0)
commit
commit
set CHAINED off
SELECT xx FROM xx
set CHAINED on
INSERT INTO xx (xx) VALUES (@p0x)
SELECT 1
如果您注意到上述内容,则清楚表明设置链接模式不会再次设置为关闭,而是保持连接被锁定(与SELECT 1一起)。
应用程序日志如下所示,即使显式发出回滚,但在提交失败时它并不会导致事务处理失败。
Is Tran ACtive? true // Before issuing commit()
Exception while Committing - Is Tran ACtive? false // Tran status after commit() failed
Exception while Committing, check-- >javax.persistence.RollbackException: // error thrown while committing
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.2.v20101206-r8635):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.sybase.jdbc3.jdbc.SybBatchUpdateException: JZ0BE:
BatchUpdateException: Error occurred while executing batch statement:
Attempt to insert duplicate key row in object 'x' with unique index 'pk_x'
答案 0 :(得分:1)
这不是你问题的原因。它来自您的连接池管理器,使连接保持活动状态。这样的查询无法锁定任何表,因为不涉及任何表。
可能你应该关闭EntityManager
(即使发生异常)。