如何正确关闭和打开Hibernate会话?

如何正确关闭和打开Hibernate会话?,hibernate,transactions,database-connection,c3p0,hibernate-session,Hibernate,Transactions,Database Connection,C3p0,Hibernate Session,我有以下方法,每隔几秒钟插入一大批记录。运行一段时间后,出现如下错误: 错误:通信链路故障 从服务器成功接收的最后一个数据包是523 几毫秒前。成功发送到服务器的最后一个数据包为 8毫秒前 2013年5月16日上午9:48:30 com.mchange.v2.c3p0.stmt.GooGooStatementCache CheckInstanceInfo:签入语句有问题,正在丢弃 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectio

我有以下方法,每隔几秒钟插入一大批记录。运行一段时间后,出现如下错误:

错误:通信链路故障

从服务器成功接收的最后一个数据包是523 几毫秒前。成功发送到服务器的最后一个数据包为 8毫秒前

2013年5月16日上午9:48:30 com.mchange.v2.c3p0.stmt.GooGooStatementCache CheckInstanceInfo:签入语句有问题,正在丢弃

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 语句关闭后不允许执行任何操作


我用于打开和关闭连接的代码如下:

public DataControllerImp(){
session=HibernateUtil.getSessionFactory().openSession();
}
@凌驾
公共void保存消息(ArrayList消息){
事务tx=会话.beginTransaction();
对于(int i=0;i

我还使用c3p0连接池。我的配置如下所示:

org.hibernate.connection.C3P0ConnectionProvider
1.
300
3.
20
50
300
1.
250

我是否错误地打开和关闭连接?请告诉我可以更改什么以停止接收此错误并停止我的程序。

Transaction tx=session.beginTransaction();
    Transaction tx = session.beginTransaction();
    try {
        for (int i = 0; i < mesages.size(); i++) {
            Message message = messages.get(i);
            session.save(message);
            if (i % 75 == 0) { 
                // flush a batch of inserts and release memory:
                session.flush();
                session.clear();
            }
        }
        tx.commit();
    }catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        tx.rollBack();
    }finally{
        session.close();
    }
}
试一试{ 对于(int i=0;i
而是为任何对象类型创建一个通用方法并传递该对象。也可以添加任何列表的逻辑

public void save(Object obj) {
    Session session = null;
    Transaction transaction = null;
    try {
        session = sessionFactory.getCurrentSession();
        transaction = session.beginTransaction();
        session.save(obj);
        session.flush();
        transaction.commit();
    } catch (JDBCException jde) {
        logger.fatal("Error occured in database communication", jde);
        transaction.rollback();
        throw new RuntimeException(jde);
    } finally {
        if (session.isOpen()) {
            session.close();
        }
    }
}

这会在每次调用此方法时关闭连接吗?这真的是放置close语句的正确位置吗?您得到了异常,因为您在提交之前关闭了会话。如果要关闭会话,这取决于工作单元,理想的Escnario应该是每个线程打开和关闭会话一次。另外,请参阅官方的会话/事务处理习惯用法说明。