Java JPA-DB维护导致恢复死锁/挂起?
我对JPA比较陌生,并且继承了这段代码,但是我对死锁/挂起有一个问题。只有当我们的数据库在一定的维护时间内不可用时,才会发生这种情况。可能有10个独立的线程/处理器,其中一个线程/处理器遇到数据库异常,它会循环并尝试从中恢复,而其他线程/处理器则会挂起数天 我已经搜索过了,但是我找不到我想要的东西,所以如果这是重复的话,我深表歉意 isCommunicationFailure报告数据库错误并重新启动进程 线程1 内部异常:java.sql.SQLException:Io异常:管道中断错误代码:17002 at com.SomeClass.isCommunicationFailure 线程2 信息:坚持。。。 2015年2月14日下午7:55:23 com.SomeClass.transitionUncachedtstate 信息:即将提交作业状态。。。。Java JPA-DB维护导致恢复死锁/挂起?,java,multithreading,jpa,Java,Multithreading,Jpa,我对JPA比较陌生,并且继承了这段代码,但是我对死锁/挂起有一个问题。只有当我们的数据库在一定的维护时间内不可用时,才会发生这种情况。可能有10个独立的线程/处理器,其中一个线程/处理器遇到数据库异常,它会循环并尝试从中恢复,而其他线程/处理器则会挂起数天 我已经搜索过了,但是我找不到我想要的东西,所以如果这是重复的话,我深表歉意 isCommunicationFailure报告数据库错误并重新启动进程 线程1 内部异常:java.sql.SQLException:Io异常:管道中断错误代码:1
2015年2月15日下午2:04:35 com.SomeClass.JPAJobStore死锁/挂起?这是一个很大的区别。Oracle实时检测死锁,并立即向应用程序报告错误。每次发生死锁都会在DB服务器上生成详细的跟踪文件。你真的应该检查一下,数据库中到底发生了什么。你使用的是连接池吗?不是这个连接池。每个进程都在不同的框中,每个进程都有一个连接。有一个web应用程序使用连接池连接到同一个数据库。。我将尝试获取日志数据库
public boolean transitionUncachedToState(Job job, String zId)
throws RAAException
{
boolean result = false;
String jobReqId = job.getJobRequestId();
Query query;
Job jpaJob;
long starttime, stoptime;
starttime = DateUtil.getCurrentUtcTime();
try {
query = em.createNamedQuery("getUnzippedJobUsingJobReqId");
query.setHint("javax.persistence.query.timeout", 30000);
query.setParameter("jobReqId", jobReqId);
jpaJob = (Job)query.getSingleResult();
em.refresh(jpaJob);
stoptime = DateUtil.getCurrentUtcTime();
logger.info("get jpaJob="+jpaJob.toString().substring(0, 512)
+ ", time in miliseconds " + (stoptime-starttime));
starttime = stoptime;
}
catch(NoResultException ex)
{
logger.info("job " + jobReqId + " can not be locked.");
return result;
}
//jpaReportCacheState = jpaJob.getJobDetails().getReportCacheState();
JobDetails jpaJobDetails = jpaJob.getJobDetails();
em.refresh(jpaJobDetails);
ProcessingState jpaState = jpaJobDetails.getProcessingState();
em.refresh(jpaState);
logger.info("Job.Z_STATE_UNPROCESSED="
+ Job.Z_STATE_UNPROCESSED
+ ", jpaState.getState()="+jpaState.getState());
if(Job.Z_STATE_UNPROCESSED.equals(jpaState.getState()))
{
// Set Job's report cache state to CACHING
job.setStartTime(DateUtil.getCurrentUtcTime());
job.setState(Job.Z_STATE_ZIPPING);
job.setId(zId);
job.setProcessingAttempts(job.getProcessingAttempts() + 1);
try {
logger.info(job.getId());
em.getTransaction().begin();
jpaState.setState(job.getState());
jpaState.setStartProcessingTime(new Date(job.getStartTime()));
jpaJob.setId(job.getId());
logger.info("Persisting...");
em.persist(jpaState);
em.persist(jpaJob);
logger.info("About to commit job state....");
em.getTransaction().commit();
em.clear();
stoptime = DateUtil.getCurrentUtcTime();
logger.info("Successful lock on job " + jobReqId
+ ", JPA update time in miliseconds " + (stoptime-starttime));
result = true;
}
catch(Exception ex) {
if(isCommunicationFailure(ex)) {
result = transitionUncachedToState(job, zId);
}
}
}
return result;
}
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd"
version="1.0">
<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<class>com.SomeClass.Job</class>
<properties>
<property name ="toplink.target-database" value="Oracle"/>
<property name="user" value="somthing"/>
<property name="password" value="somthing123"/>
<property name="toplink.logging.level" value="SEVERE"/>
<property name="toplink.logging.exceptions" value="true"/>
<!--<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>-->
<property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="toplink.jdbc.url" value="jdbc:oracle:thin:@someurl"/>
<property name="toplink.jdbc.user" value="user"/>
<property name="toplink.jdbc.password" value="pass"/>
<property name="toplink.jdbc.bind-parameters" value="true"/>
<property name="toplink.cache.size.default" value="5000"/>
<property name="toplink.cache.shared.ContainerEntry" value="false"/>
<property name="toplink.cache.shared.Hosts" value="false"/>
<property name="toplink.cache.shared.default" value="true"/>
<property name="toplink.weaving" value="true"/>
<property name="toplink.jdbc.read-connections.max" value="1"/>
<property name="toplink.jdbc.read-connections.min" value="1"/>
<property name="toplink.jdbc.write-connections.max" value="1"/>
<property name="toplink.jdbc.write-connections.min" value="1"/>
<property name="toplink.cache.type.Order" value="Weak"/>
</properties>
</persistence-unit>