時候當我執行:「在交易閒置的」使用Hibernate,Postgres的和吉斯提供商
select * from pg_stat_activity where state ~ 'idle in transact'
我得到「在交易閒置的」與國家的行數不恰當的。其中一些人閒置了幾天。他們中的大多數,這是從一個服務類執行(休眠5.1.0.Final,吉斯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();
}
爲什麼它發生了嗎?如何避免這種情況?
UPDATE
當我在一個單獨的線程中使用吉斯提供商exampleDAO.get()
事務不COMMITED:
@Inject
Provider<ExampleDAO> exampleDAO;
有時我有很多長時間運行的查詢'COMMIT'狀態'空閒'。爲什麼會發生?是否值得執行'echo never>/sys/kernel/mm/redhat_transparent_hugepage/enabled',因爲它在https://dba.stackexchange.com/questions/32890/postgresql-pg-stat-activity-shows-commit中提及? – Justas
空閒意味着連接在提交後不會執行任何操作。查詢更改時查詢列發生更改 - 因此顯示上次執行的查詢... –
如果應用程序通過空閒提交達到hibernate.c3p0.max_size限制,則它將停止使用數據庫。 – Justas