¿Cómo cerrar y abrir correctamente una sesión de Hibernate?

Tengo el siguiente método que inserta un gran lote de registros cada pocos segundos. Después de algún tiempo de ejecución me sale errores como los siguientes:

ERROR: Fallo en el enlace de comunicaciones

El último paquete recibido con éxito del servidor fue hace 523 milisegundos. El último paquete enviado con éxito al servidor fue hace 8 milisegundos.

16 de mayo de 2013, 9:48:30 a.m. com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO: Problema con la declaración registrada, descarte.

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: no se permiten operaciones después de cerrar la instrucción.


El código que utilizo para abrir y cerrar conexiones es el siguiente:

public DataControllerImp() {
    session = HibernateUtil.getSessionFactory().openSession();
}

@Override
public void saveMessage(ArrayList<Message> messages) {
    Transaction tx = session.beginTransaction();

    for (int i = 0; i < mesages.size(); i++) {
        Message message = messages.get(i);

        try {
            session.save(message);
            if (i % 75 == 0) { 
                // flush a batch of inserts and release memory:
                session.flush();
                session.clear();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

    tx.commit();
}


También estoy usando la agrupación de conexiones c3p0. Mi configuración se ve como:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>        
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.acquireRetryAttempts">1</property>
<property name="hibernate.c3p0.acquireRetryDelay">250</property>


¿Estoy abriendo y cerrando las conexiones incorrectamente? Por favor, hágame saber qué puedo cambiar para dejar de recibir este error y detener mi programa.

Respuestas a la pregunta(2)

Su respuesta a la pregunta