2011-11-25 12 views
5

Tengo un problema con la cantidad de consultas realizadas por hibernate a la base de datos. Aquí es mi registro de consultas (usando MySQL 5.1) a la base de datos cuando se hace un selecto simple:Hibernate consultas en la base de datos

111125 7:18:30 
27 Query SET autocommit=0 
27 Query SELECT @@session.tx_isolation 
27 Query select this_.id as id34_0_, this_.media_id as media3_34_0_, this_.message as message34_0_, this_.user_id as user4_34_0_ from notifications this_ 
27 Query rollback 
27 Query SET autocommit=1 

He leído mucho acerca de la configuración de confirmación automática a 0 y luego a 1. Yo sé que el valor predeterminado para una conexión es 1 y este comportamiento no se puede cambiar. Puede ejecutar SET autocommit = 0 pero el resultado es el mismo.

¿Hay alguna forma de evitar estas consultas? No sé por qué está sucediendo SELECT @@ session.tx_isolation y la reversión. Cuando uso una transacción obtengo una confirmación y luego una reversión. No estoy seguro de por qué una reversión siempre está cableada.

¡Muchas gracias!

Mi conf: primavera 2.5.6, Hibernate 3.6.0, MySQL 5.1

datasoure.xml:

<bean id="dataSource" destroy-method="close" 
    class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 

    <property name="initialSize" value="3" /> 
    <property name="maxActive" value="20" /> 
    <property name="minIdle" value="3" /> 
    <property name="poolPreparedStatements" value="false" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="defaultTransactionIsolation" value="4" /> 
</bean> 

Administrador de transacciones de definición:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

ACTUALIZACIÓN: Se las arregló para eliminar la reversión estableciendo una nueva propiedad

<property name="defaultReadOnly" value="true" /> 

Pero el problema ahora es que no puede hacer una modificación (no importa si configuro en la anotación transaccional readOnly = false) a la base de datos que da una SQLException. Esta propiedad establece la conexión readonly en true. Supongo que no hay forma de hacerlo con HibernateTemplate.

Uso la transacción aspectj para el tejido de código interno.

<aop:aspectj-autoproxy proxy-target-class="true" /> 
+0

¡Sus transacciones fallan! ¿Habilitó el administrador de transacciones en el contexto de primavera? Y su registro es normal, el mío es similar, excepto de retrocesos. – madhead

+0

Es solo una selección y no tiene anotación @transactional. Parece que todo está siendo tratado como una transacción. – Gonzalo

+0

Me refiero al nivel de base de datos nativa: 27 Query rollback. Revierte la transacción. ¿Funcionan correctamente tus inserciones o actualizaciones? – madhead

Respuesta

1

Debe configurar las transacciones para su aplicación. Vea el Spring 2.5.x documentation on transaction management.

Editar 12/3/11: incluso para los métodos que solo seleccionan, aún debe crear una transacción de solo lectura para eliminar las consultas adicionales que mencionó en su publicación. Simplemente escriba @Transactional (readOnly = true) y debería estar listo para comenzar.

Editar 20/12/11: También necesita asegurarse de que las transacciones estén configuradas correctamente. Parece que la configuración que ha publicado puede faltar < tx: annotation-driven /> annotation. Ver section 10.5.1 of the Spring documentation.

+0

He agregado el administrador de transacciones. Utilizo las anotaciones @transactional cuando necesito una transacción, pero en este caso, no hay ninguna transacción en curso. – Gonzalo

+0

Incluso para los métodos que solo seleccionan, aún debe crear una transacción de solo lectura para eliminar las consultas adicionales que mencionó en su publicación. Simplemente escriba @Transactional (readOnly = true) y debería estar listo para comenzar. – user393274

+0

Obteniendo la misma reversión de transacción y la misma confirmación automática. Obtengo una confirmación también ahora con readonly = true – Gonzalo

Cuestiones relacionadas