【发布时间】:2013-12-23 16:51:21
【问题描述】:
我有一个在 tomcat 上运行的 JSF Web 应用程序。 此应用程序使用休眠连接到 Postgres 数据库。
一段时间后,应用程序停止工作,因为它无法打开新连接。 如果在 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 时也会出现问题,所以我不认为是这种情况......
标签: hibernate postgresql jsf-2 jdbc