2011-11-25 14 views
5

Sto riscontrando un problema con la quantità di query eseguite da ibernazione nel database. Ecco il mio log delle query (utilizzando Mysql 5.1) al database quando si fa una semplice select:Hibernate query sul database

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 

Ho letto molto su come impostare autocommit a 0 e poi a 1. So che il default per una connessione è 1 e questo comportamento non può essere modificato. È possibile eseguire SET autocommit = 0 ma il risultato è lo stesso.

Esiste comunque una soluzione per evitare tali query? Non so perché sia ​​in corso la SELECT @@ session.tx_isolation e il rollback. Quando uso una transazione ottengo un commit e quindi un rollback. Non sono sicuro del motivo per cui un rollback è sempre cablato.

Grazie mille!

mio 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> 

Transaction definizione allenatore:

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

UPDATE: Riuscito a eliminare il rollback impostando una nuova proprietà

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

Ma il problema ora è che non è possibile apportare una modifica (non importa se ho impostato l'annotazione transazionale readOnly = false) al db dando una SQLException. Questa proprietà imposta la connessione in sola lettura su true. Suppongo che non ci sia modo di farlo con HibernateTemplate.

Uso la transazione aspectj per la tessitura di codice interno.

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

Le tue transazioni falliscono! Hai abilitato il gestore delle transazioni nel contesto di primavera? E il tuo registro è normale, il mio è simile, ad eccezione dei rollback. – madhead

+0

È solo una selezione e non ha annotazioni @ transazionali. Sembra che tutto sia trattato come una transazione. – Gonzalo

+0

Intendo livello database nativo: 27 Ripristino query. È una transazione di rollback. I tuoi inserti o aggiornamenti funzionano correttamente? – madhead

risposta

1

È necessario configurare le transazioni per l'applicazione. Vedi lo Spring 2.5.x documentation on transaction management.

Modifica 12/3/11: Anche per i metodi selezionati, è necessario creare una transazione di sola lettura per rimuovere le query aggiuntive citate nel post. Scrivi @Transactional (readOnly = true) e dovresti essere bravo a farlo.

Modifica 12/20/11: È inoltre necessario assicurarsi che le transazioni siano configurate correttamente. Sembra che la configurazione che hai postato manchi < tx: annotation-driven /> annotation. Vedi section 10.5.1 of the Spring documentation.

+0

Ho aggiunto il gestore delle transazioni. Io uso le annotazioni @transactional quando ho bisogno di una transazione, ma in questo caso non ci sono transazioni in corso. – Gonzalo

+0

Anche per i metodi selezionati, devi comunque creare una transazione di sola lettura per rimuovere le query aggiuntive che hai menzionato nel tuo post. Scrivi @Transactional (readOnly = true) e dovresti essere bravo a farlo. – user393274

+0

Ancora ottenere lo stesso rollback della transazione e autocommit. Ricevo un commit anche ora con readonly = true – Gonzalo

Problemi correlati