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