hibernate中sessionfactory的关闭机制?
我在java应用中使用hibernate连接数据库,不使用spring托管,遇到mysql超时自动断开问题。我百度了一下相关问题的解答,绝大部分是使用连接池,另外的解答是每次连接的时候都创建新的sessionfactory。
经过一天的大量实验,我现在有如下疑问:
在不使用连接池的情况下,也就是只用hibernate的默认连接池的情况下:
我每次数据库操作都创建新的sessionfactory对象,这个方法是能使用的。但是sessionfactory是重量级组件,每次创建非常占内存,因此我实验了一下,用一个for循环,创建3000个sessionfactory对象,发现果然内存直线上升,大概占用了200M左右的内存。我机器上的mysql最大连接数是100,当sessionfactory的数量超过mysql的最大连接时,后面创建的sessionfactory都无法进行数据库操作,但是依旧可以创建,并且占用大量内存。
代码如下:
public void test(){
Configuration cfg = new Configuration().configure();
ArrayList<SessionFactory> al = new ArrayList<SessionFactory>();
for (int i = 0; i < 3000; i++) {
SessionFactory sf = cfg.buildSessionFactory();
}
public void test(){
Configuration cfg = new Configuration().configure();
ArrayList<SessionFactory> al = new ArrayList<SessionFactory>();
for (int i = 0; i < 3000; i++) {
SessionFactory sf = cfg.buildSessionFactory();
sf.close();
}
public void test(){
Configuration cfg = new Configuration().configure();
ArrayList<SessionFactory> al = new ArrayList<SessionFactory>();
for (int i = 0; i < 3000; i++) {
SessionFactory sf = cfg.buildSessionFactory();
sf.close();
al.add(sf);
}
public void test(){
Configuration cfg = new Configuration().configure();
ArrayList<SessionFactory> al = new ArrayList<SessionFactory>();
for (int i = 0; i < 3000; i++) {
SessionFactory sf = cfg.buildSessionFactory();
sf.close();
System.out.println(i+":"+sf);
}