JPA多线程插入

时间:2014-08-19 09:18:39

标签: java sql multithreading jpa locking

我正在使用MS SQL Server,我的程序最近开始随机丢失数据库连接。我使用的是非XA驱动程序。

最可能的嫌疑是我添加的异步数据库日志记录 偷偷摸摸的是,我使用了一个线程池:

ExecutorService ruleLoggingExecutor = Executors.newFixedThreadPool(10);

在我的进程的finally块中,我启动了一个调用addLogs()方法的新线程。

代码可以工作数小时,数天,然后在完全不相关的查询期间,它将丢失数据库连接。我有一个问题,问题是正在尝试两个并发插入。但是,我不知道是否同步了#39;在addLogs方法上会修复它,或者如果我需要事务代码,或者是什么。有什么建议吗?


在DAO中:

private EntityManager getEntityManager(InitialContext context) {
    try {
        if (emf == null) {
            emf = (EntityManagerFactory) context
                    .lookup("java:jboss/persistence/db");
        }

        return emf.createEntityManager();
    } catch (Exception e) {
        logger.error(
                "Error finding EntityManagerFactory in JNDI: "
                        + e.getMessage(), e);
        return null;
    }
}



public void addLogs(InitialContext context, String key, String logs,
        String responseXml) {
    EntityManager em = getEntityManager(context);

    try {
        TblRuleLog log = new TblRuleLog();
        log.setAuthKey(key);
        log.setLogMessage(logs);
        log.setDateTime(new Timestamp(new Date().getTime()));
        log.setResponseXml(responseXml);

        em.persist(log);
        em.flush();

    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    } finally {
        em.close();
    }
}

1 个答案:

答案 0 :(得分:0)

似乎连接在超时后关闭,可能是由于事务没有被提交/回滚(并且没有在表/行上释放锁)。
手动冲洗看起来很可疑。我使用entityManager.getTransaction().begin/commit()并删除em.flush()