【高分】【紧急】【在线等】hibernate如何避免重复加载配置文件,谢谢~ 补充,配置文件没问题,如果hibernate连接的时候没有别的访问的话,hibernate就可以正常启动,不会重复加载~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是我用的~package cn.hlgc.util;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;/** * HibernateSession工厂 */public class HibernateUtil { /** Hibernate的配置文件hibernate.cfg.xml */ private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; /** Session的线程本地变量 */ private static final ThreadLocal threadLocal = new ThreadLocal(); /** transaction的线程本地变量 */ private static final ThreadLocal txThreadLocal = new ThreadLocal(); private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory sessionFactory; private static String configFile = CONFIG_FILE_LOCATION; private HibernateUtil() { } /** * 获得一个线程本地化的Hibernate session实例 * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory */ public static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * 关闭线程化的Hibernate session实例 * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * 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) { HibernateUtil.configFile = configFile; sessionFactory = null; } /** * return hibernate configuration * */ public static Configuration getConfiguration() { return configuration; } /** * 在本地session实例上开启事务 */ public static void beginTransaction() { Transaction tx = (Transaction) txThreadLocal.get(); if (tx == null) { tx = getSession().beginTransaction(); txThreadLocal.set(tx); } } /** * 在本地session实例上提交事务 */ public static void commitTransaction() { Transaction tx = (Transaction) txThreadLocal.get(); if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) { tx.commit(); txThreadLocal.set(null); } } /** * 在本地session实例上回滚事务 */ public static void rollbackTransaction() { Transaction tx = (Transaction) txThreadLocal.get(); txThreadLocal.set(null); if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) { tx.rollback(); } }} 将加载配置文件的语句放在static代码块中:static{ configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory();} /** * Rebuild hibernate session factory */ public static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } }请问这样不算放在static中? 把 buildSessionFactory 过程的方法加上同步关键字,这点很重要,也不影响性能,因为这具操作只需要执行一次。 你这个是只要调用rebuildSessionFactory()方法,就会重新加载配置文件,而放在static中的代码,实在java虚拟机加载这个类的时候执行,只执行一次 /** * Rebuild hibernate session factory */ public synchronized static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% 创建 SessionFactory 失败 %%%%"); e.printStackTrace(); } }按照5楼的方法解决了~ springMVC 注解怎么用 初始化spring配置文件时发生异常 随机数 +冒泡排序求助!!! struts 2问题,实在没办法了~ servlet生命周期问题 请教一个actionForm问题 java难学吗? MappingException的Unknown entity class错误 新手请教 Tomcat 5.5.4(exe)安装,QQ:68336016,怎么也用不了 小弟刚开始接触JAVA,请教一些问题,大家随便指教,你们都会的! 弱弱问下json的小问题,O(∩_∩)O哈哈~ 有人居然通过 jre1.5 中的 jucheck.exe文件入侵我的系统?!!
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;/**
* HibernateSession工厂
*/
public class HibernateUtil { /** Hibernate的配置文件hibernate.cfg.xml */
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
/** Session的线程本地变量 */
private static final ThreadLocal threadLocal = new ThreadLocal();
/** transaction的线程本地变量 */
private static final ThreadLocal txThreadLocal = new ThreadLocal();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION; private HibernateUtil() {
} /**
* 获得一个线程本地化的Hibernate session实例
*
* @return Session
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
} return session;
} /**
* Rebuild hibernate session factory
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
} /**
* 关闭线程化的Hibernate session实例
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null); if (session != null) {
session.close();
}
} /**
* 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) {
HibernateUtil.configFile = configFile;
sessionFactory = null;
} /**
* return hibernate configuration
*
*/
public static Configuration getConfiguration() {
return configuration;
} /**
* 在本地session实例上开启事务
*/
public static void beginTransaction() {
Transaction tx = (Transaction) txThreadLocal.get();
if (tx == null) {
tx = getSession().beginTransaction();
txThreadLocal.set(tx);
}
} /**
* 在本地session实例上提交事务
*/
public static void commitTransaction() {
Transaction tx = (Transaction) txThreadLocal.get();
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
tx.commit();
txThreadLocal.set(null);
}
} /**
* 在本地session实例上回滚事务
*/
public static void rollbackTransaction() {
Transaction tx = (Transaction) txThreadLocal.get();
txThreadLocal.set(null);
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
tx.rollback();
}
}}
static{
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
}
/**
* Rebuild hibernate session factory
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
请问这样不算放在static中?
而放在static中的代码,实在java虚拟机加载这个类的时候执行,只执行一次
* Rebuild hibernate session factory
*/
public synchronized static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% 创建 SessionFactory 失败 %%%%");
e.printStackTrace();
}
}按照5楼的方法解决了~