我正在使用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();
}
}
答案 0 :(得分:0)
似乎连接在超时后关闭,可能是由于事务没有被提交/回滚(并且没有在表/行上释放锁)。
手动冲洗看起来很可疑。我使用entityManager.getTransaction().begin/commit()
并删除em.flush()
。