首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

Hibernate如何释放连接啊

2013-12-16 
Hibernate怎么释放连接啊?本帖最后由 dut_singer 于 2013-12-13 12:00:32 编辑以下是我的代码,在mysql里看

Hibernate怎么释放连接啊?
本帖最后由 dut_singer 于 2013-12-13 12:00:32 编辑 以下是我的代码,在mysql里看每执行一次,就增加3个连接数,执行到N次后,就达到最大连接数了,第一次用Hibernate,版本是4.2.7,不太知道怎么使用,照例子做的,请帮我分析一下连接没有释放的原因。


Configuration conf = new Configuration().configure();
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(conf.getProperties());  
        ServiceRegistry registry = builder.buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(registry);
Session sess = sf.getCurrentSession();
try{
this.setError((Error)sess.get(Error.class,error.getError_id()));
if( error.getReport_status()==1){
List lt= sess.createQuery("select distinct s from Solves as s where error =:error")
.setEntity("error", error)
.list();
this.setSolve((Solves)(lt.iterator().next()));
}
List lt = sess.createQuery("select distinct p from Platform as p")
.list();
for (Iterator pit =  lt.iterator(); pit.hasNext();)
{
    platforms.add( (Platform)pit.next());
}
return SUCCESS;
}catch(Exception e){
e.printStackTrace();
sess.getTransaction().rollback();
}finally{
sess.close();
}

[解决办法]
SessionFactory sf 应为全局唯一变量
[解决办法]
 Configuration conf = new Configuration().configure();
        ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(conf.getProperties());  
        ServiceRegistry registry = builder.buildServiceRegistry();
        SessionFactory sf = conf.buildSessionFactory(registry);

这个 SessionFactory 每次都创建一个 ,就会这样  ,你可以单写个类,是单例的 ,每次都取这个SessionFactory 就可以了
[解决办法]
import java.io.File;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

  private static final Logger logger = Logger
      .getLogger(HibernateSessionFactory.class);

  private static Configuration configuration = new Configuration();

  private static SessionFactory sessionFactory;
  
  private static String configFile;

  public static void buildSessionFactory(String hiberconfig){
    try {
      configFile = hiberconfig;
      configuration.configure(new File(configFile));
      sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
      logger.error(e);
      logger.error("[exit system now]");
      System.exit(1);
    }
  }
  
  private HibernateSessionFactory() {
  }

  /**
   * Rebuild hibernate session factory
   * 
   */
  public static void rebuildSessionFactory() {
    try {
      configuration.configure(new File(configFile));
      sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
      logger.error(e);
    }
  }

  /**
   * return session factory
   * 
   */
  public static org.hibernate.SessionFactory getSessionFactory() {
    return sessionFactory;
  }

  /**
   * return session factory
   * 
   * session factory will be rebuilded in the next call


   */
  public static void setConfigFile(String configFile) {
    HibernateSessionFactory.configFile = configFile;
    sessionFactory = null;
  }

  /**
   * return hibernate configuration
   * 
   */
  public static Configuration getConfiguration() {
    return configuration;
  }

}就这个B样 ,服务器启动的时候,会初始化这个类,HibernateSessionFactory.buildSessionFactory

因为这个类里边的 连接时一个静态的 ,只会被初始化一次,每次调用都是同一个 ,也可以写成单例的 。

热点排行