我有一個運行在tomcat上的JSF web應用程序。 此應用程序使用休眠連接到Postgres數據庫。Hibernate不關閉JDBC連接
過了一段時間,應用程序停止工作,因爲它無法打開新的連接。 如果執行中的Postgres的SQL語句:
select * from pg_stat_activity
它表明我100分的記錄,並在列「狀態」它讓我閒着。 我追蹤了導致這種情況的語句,發現多次執行一條語句會導致行爲(在我的情況下,它是一個autoComplete ajax方法)。 這是結:
Connection con = ConnectDb.getConnection();
ArrayList<Cidade> cidades=new ArrayList<Cidade>();
try{
PreparedStatement pst=con.prepareStatement("select c.cidCodigo,c.cidNome,e.estCodigo,e.estSigla from cidade c left join estado e on e.estCodigo=c.estCodigo where upper(c.cidNome) like ?");
pst.setObject(1, s.toUpperCase()+"%");
ResultSet rs=pst.executeQuery();
while(rs.next()){
Cidade c = new Cidade(rs.getInt("cidCodigo"), rs.getString("cidNome"));
Estado e = new Estado();
e.setEstCodigo(rs.getInt("estCodigo"));
e.setEstSigla(rs.getString("estSigla"));
c.setCidEstado(e);
cidades.add(c);
}
}catch(Exception e){
e.printStackTrace();
JsfUtils.showFatalMessage("Erro ao carregar dados: "+e.getLocalizedMessage());
}finally{
try{
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
這是我得到的連接:
public class ConnectDb {
static EntityManagerFactory emf;
public static EntityManager getEntityManager(){
return getEntityManagerFactory().createEntityManager();
}
public static EntityManagerFactory getEntityManagerFactory() {
if(emf==null){
try {
emf=Persistence.createEntityManagerFactory("GestaoPU");
} catch (Exception e) {
e.printStackTrace();
}
}
return emf;
}
public static Session getSession(){
Session session = getEntityManager().unwrap(Session.class);
session.setFlushMode(FlushMode.AUTO);
return session;
}
public static Connection getConnection(){
Object delegate = getEntityManager().getDelegate();
SessionImpl si=(SessionImpl)delegate;
Connection con = si.connection();
try {con.setAutoCommit(false);} catch (SQLException e) {}
return con;
}
}
什麼可以引起此問題?
也許你需要保持對EntityManager的引用並調用close()。只是一個猜測。 –
我注意到使用Session/EntityManager時也會發生問題,所以我不認爲這是這種情況... –