【发布时间】:2017-10-03 20:35:06
【问题描述】:
当我执行时:
select * from pg_stat_activity where state ~ 'idle in transact'
我得到不适当的行数,状态为“事务中的空闲”。他们中的一些人闲置了几天。其中大多数是从一个服务类(Hibernate 5.1.0.Final,Guice 4.1.0)执行的相同简单的select 查询:
public class FirebaseServiceImpl implements FirebaseService {
@Inject
private Provider<FirebaseKeyDAO> firebaseKeyDAO;
@Override
public void sendNotification(User recipient) {
List<FirebaseKey> firebaseKeys = firebaseKeyDAO.get().findByUserId(recipient.getId());
final ExecutorService notificationsPool = Executors.newFixedThreadPool(3);
for (FirebaseKey firebaseKey : firebaseKeys)
notificationsPool.execute(new Runnable() {
@Override
public void run() {
sendNotification(new FirebaseNotification(firebaseKey.getFirebaseKey(), "example");
}
});
notificationsPool.shutdown();
}
}
DAO 方法:
@Override
@SuppressWarnings("unchecked")
public List<FirebaseKey> findByUserId(Long userId) {
Criteria criteria = getSession().createCriteria(type);
criteria.add(Restrictions.eq("userId", userId));
return criteria.list();
}
为什么会这样?如何避免这种情况?
更新
当我在单独的线程中使用 Guice Provider exampleDAO.get() 时,未提交事务:
@Inject
Provider<ExampleDAO> exampleDAO;
【问题讨论】:
标签: java postgresql hibernate transactions guice