javase项目中使用hibernate如何不用重复buildSessionFactory,我的项目里面,每操作一次数据可靠就读取一次hibernate.cfg.xml文件,最后报一些这样的错误:
Connections could not be acquired from the underlying database!
.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
[b]问题补充:[/b]
谢谢yourgame ,我有几个问题想请教下
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;
[u] /*我的所有的类都继承这个类了,所以我把这个构造方法改为public了,这样做有什么坏影响吗?(这里写成私有的话,它的子类会被提示错误:Implicit super constructor HibernateUtil() is not visible. Must explicitly
invoke another constructor)**/[/u]
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(); } }
/**[size=x-large][size=large][u]还有这里什么时候关闭它呢,我的项目里免现在是用session.close()关闭一个session的,如果我一直不调用这个方法,有影响吗[/u][/size][/size]
- 关闭线程化的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(); } }
}