Java JPA-DB维护导致恢复死锁/挂起?

Java JPA-DB维护导致恢复死锁/挂起?,java,multithreading,jpa,Java,Multithreading,Jpa,我对JPA比较陌生,并且继承了这段代码,但是我对死锁/挂起有一个问题。只有当我们的数据库在一定的维护时间内不可用时,才会发生这种情况。可能有10个独立的线程/处理器,其中一个线程/处理器遇到数据库异常,它会循环并尝试从中恢复,而其他线程/处理器则会挂起数天 我已经搜索过了,但是我找不到我想要的东西,所以如果这是重复的话,我深表歉意 isCommunicationFailure报告数据库错误并重新启动进程 线程1 内部异常:java.sql.SQLException:Io异常:管道中断错误代码:1

我对JPA比较陌生,并且继承了这段代码,但是我对死锁/挂起有一个问题。只有当我们的数据库在一定的维护时间内不可用时,才会发生这种情况。可能有10个独立的线程/处理器,其中一个线程/处理器遇到数据库异常,它会循环并尝试从中恢复,而其他线程/处理器则会挂起数天

我已经搜索过了,但是我找不到我想要的东西,所以如果这是重复的话,我深表歉意

isCommunicationFailure报告数据库错误并重新启动进程

线程1 内部异常:java.sql.SQLException:Io异常:管道中断错误代码:17002 at com.SomeClass.isCommunicationFailure

线程2 信息:坚持。。。 2015年2月14日下午7:55:23 com.SomeClass.transitionUncachedtstate 信息:即将提交作业状态。。。。
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>