JPA ECLIPSELINK发布SELECT 1

时间:2014-06-02 08:34:59

标签: jpa eclipselink

全部,

为什么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'

1 个答案:

答案 0 :(得分:1)

这不是你问题的原因。它来自您的连接池管理器,使连接保持活动状态。这样的查询无法锁定任何表,因为不涉及任何表。

可能你应该关闭EntityManager(即使发生异常)。