我有一个运行在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时也会发生问题,所以我不认为这是这种情况... –