Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠连接问题_Java_Hibernate - Fatal编程技术网

Java 休眠连接问题

Java 休眠连接问题,java,hibernate,Java,Hibernate,我正在使用webapp,在Hibernate引发异常后出现连接错误: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 每次我在异常发生后尝试访问数据库时,它都会给我这个异常 现在,如果我的应用程序编码良好,Hibernate不应该抛出错误,但是如果与db的连接出现问题,我不希望我的应用程序陷入这个错误 这是我的

我正在使用webapp,在Hibernate引发异常后出现连接错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
每次我在异常发生后尝试访问数据库时,它都会给我这个异常

现在,如果我的应用程序编码良好,Hibernate不应该抛出错误,但是如果与db的连接出现问题,我不希望我的应用程序陷入这个错误

这是我的HibernateUtil课程:

public class HibernateUtil {
  private static Logger log = Logger.getLogger(HibernateUtil.class);
  private static org.hibernate.SessionFactory sessionFactory;
  private static String confFile = "hibernate-test.properties";
  private static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>();

  private HibernateUtil() {

  }

  public static void buildSessionFactory(){
    Configuration configuration = new Configuration();
    synchronized(HibernateUtil.class){
      if(sessionFactory == null){
        try {
          Properties properties = new Properties();
          properties.load(HibernateUtil.class.getClassLoader().getResourceAsStream(confFile));
          configuration.setProperties(properties);
        } catch (Exception e) {
          log.fatal("cannot load the specified hibernate properties file: " + confFile);
          throw new RuntimeException("cannot load the specified hibernate properties file : " + confFile, e);
        }
        sessionFactory = configuration.configure().buildSessionFactory();
      }

      HibernatePBEEncryptorRegistry registry = HibernatePBEEncryptorRegistry.getInstance();

      if(registry.getPBEStringEncryptor("strongHibernateStringEncryptor") == null) {
        StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();
        strongEncryptor.setAlgorithm("PBEWithMD5AndDES"); // not really needed as it is the default
        strongEncryptor.setPassword("aStrongPassword");
        registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor);
      }
    }
  }

  public static SessionFactory getSessionFactory() {
    if(sessionFactory == null){
      buildSessionFactory();
    }
    return sessionFactory;
  }

  public static Session getCurrentSession(){
    if(!getSessionFactory().getCurrentSession().isOpen())
      getSessionFactory().openSession();
    return getSessionFactory().getCurrentSession();
  }
}
下面是一个操作示例:

Transaction transaction = new Transaction(user, Transaction.Type.REGISTRATION, new HashSet(domains));

initHibSession();
hib_session.save(transaction);
closeHibSession();
transaction_id = transaction.getId();
有没有办法避免上述例外情况

每次我在异常发生后尝试访问数据库时,它都会给我这个异常

我不知道确切的情况。无论如何,在发生异常后,您应该回滚事务,关闭会话并重新开始。话虽如此,我对你的代码有一些看法

关于您的
HibernateUtil

  • 为什么您有一个
    ThreadLocal
    Session\getCurrentSession()
    方法为您处理这个问题(不过您似乎没有使用ThreadLocal)

  • HibernateUtil.getCurrentSession()
    中,为什么要处理和?首先,不需要执行您所做的操作,如果当前线程未关联任何会话,则将返回一个新的会话。其次,这两种方法不同,语义也不同(使用时需要自己关闭
    会话
    ),您应该使用其中一种

关于您的
基本操作

  • 我想知道你为什么在会后缺席。如果您没有提交正在进行的事务,您将丢失所有挂起的更改。这真的是你想要的吗

PS:我会考虑使用这个模式来消除代码中的所有负担。

资源
每次我在异常发生后尝试访问数据库时,它都会给我这个异常

我不知道确切的情况。无论如何,在发生异常后,您应该回滚事务,关闭会话并重新开始。话虽如此,我对你的代码有一些看法

关于您的
HibernateUtil

  • 为什么您有一个
    ThreadLocal
    Session\getCurrentSession()
    方法为您处理这个问题(不过您似乎没有使用ThreadLocal)

  • HibernateUtil.getCurrentSession()
    中,为什么要处理和?首先,不需要执行您所做的操作,如果当前线程未关联任何会话,则将返回一个新的会话。其次,这两种方法不同,语义也不同(使用时需要自己关闭
    会话
    ),您应该使用其中一种

关于您的
基本操作

  • 我想知道你为什么在会后缺席。如果您没有提交正在进行的事务,您将丢失所有挂起的更改。这真的是你想要的吗

PS:我会考虑使用这个模式来消除代码中的所有负担。

资源

我不明白您为什么在事务关闭后触摸它。@Tony这似乎是一个“应用程序”事务。@Pascal Thivent是对的,我看一下他的答案。我不明白您为什么在事务关闭后触摸它。@Tony这似乎是一个“应用程序”事务。@Pascal Thivent是对的,我将看看他的答案。我将看看在发生异常后如何执行回滚。我不使用ThreadLocal,它不应该在那里,我的错误。我将尝试只使用getCurrentSession(),我将放弃openSession()。我清除()事务是因为它不应该有一个正在进行的事务,我也会清除它。我将看一看“视图中的开放会话”。非常感谢。我用的是“视野中的公开会议”,它就像一个符咒。。。再次感谢你!我将了解在发生异常后如何执行回滚。我不使用ThreadLocal,它不应该在那里,我的错误。我将尝试只使用getCurrentSession(),我将放弃openSession()。我清除()事务是因为它不应该有一个正在进行的事务,我也会清除它。我将看一看“视图中的开放会话”。非常感谢。我用的是“视野中的公开会议”,它就像一个符咒。。。再次感谢你!
Transaction transaction = new Transaction(user, Transaction.Type.REGISTRATION, new HashSet(domains));

initHibSession();
hib_session.save(transaction);
closeHibSession();
transaction_id = transaction.getId();