iteye_16028 2009-03-25 08:12
浏览 174
已采纳

javase项目中使用hibernate如何不用重复buildSessionFactory

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(); } }

}

  • 写回答

3条回答 默认 最新

  • zhoujuan520 2009-03-25 08:37
    关注

    [code="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(); } }

    [/code]

    或者这样就可以了

    [code="java"]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(); } }

    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型