2

我有一个在 Tomcat 6 上运行的 servlet,它使用 Hibernate 4.1.6 和 c3p0 0.9.1.2,我收到了太多的 org.hibernate.ResourceClosedException,并显示消息“此 TransactionCoordinator 已关闭”。

在线程被另一个调用重用之前,我已经检查过beginTransaction()并且rollback()或已完成。commit()

在 hibernate.cfg.xml,我有

<hibernate-configuration>
 <session-factory>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://host/database</property>
  <property name="hibernate.connection.username">username</property>
  <property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  <property name="show_sql">true</property>
  <property name="current_session_context_class">thread</property>

  <property name="hibernate.c3p0.min_size">5</property>
  <property name="hibernate.c3p0.max_size">20</property>
  <property name="hibernate.c3p0.timeout">1800</property>
  <property name="hibernate.c3p0.max_statements">50</property>

  <!-- mappings start here -->
  ...
  </session-factory>
</hibernate-configuration>

我正在使用 HibernateUtil.java 为我的应用程序创建一个静态 sessionFactory 并使用它来控制我的事务:

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
            SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            return sessionFactory;          
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
        getSessionFactory().close();
    }

    public static void beginTransaction() {
        HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
    }

    public static void commit() {
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
    }

    public static void rollback() {
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
    }

}

当我开始在 servlet 中使用数据库时,我的代码基本上是这样的:

    try {
        HibernateUtil.beginTransaction();

        // do stuffs

        HibernateUtil.commit();
    } catch (RuntimeException e) {
        HibernateUtil.rollback();
        throw e;
    } catch (Exception e) {
        HibernateUtil.rollback();
        throw e;
    }

我在哪里做错了?

4

1 回答 1

0

我在完成事务后关闭了一个会话,并且在新会话中我使用了上一个会话的对象,这导致我出现“事务协调器已关闭”我已编辑代码以使用新会话对象,现在错误已解决

于 2021-06-16T07:21:22.480 回答