2011-11-25 16 views
5

Mam problem z ilością zapytań wykonanych przez hibernację do bazy danych. Oto mój dziennik zapytań (przy użyciu MySQL 5.1) do bazy danych, gdy robi to prosta wybierz:Kwerendy hibernacji w bazie danych

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 

Czytałem dużo na temat ustawiania trybu automatycznego na 0, a następnie do 1. Wiem, że domyślna dla połączenia jest 1 i tego zachowania nie można zmienić. Możesz uruchomić Autocommit SET = 0, ale wynik jest taki sam.

Czy mimo to można uniknąć tych pytań? Nie wiem, dlaczego odbywa się SELECT @@ session.tx_isolation i rollback. Kiedy używam transakcji, otrzymuję zatwierdzenie, a następnie wycofanie. Nie wiem, dlaczego wycofanie jest zawsze kable.

Wielkie dzięki!

Moja conf: Wiosna 2.5.6, 3.6.0 hibernacji, 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> 

transakcja definicja kierownik:

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

UPDATE: Zarządzane, aby wycofać wycofanie, ustawiając nową właściwość

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

Ale problem polega na tym, że nie można dokonać modyfikacji (bez względu na to, czy ustawiłem adnotację transakcyjną readOnly = false) do bazy danych dającej wyjątek SQLException. Ta właściwość ustawia połączenie tylko do odczytu na true. Zgaduję, że nie ma sposobu, aby to zrobić z HibernateTemplate.

Używam transakcji aspectj do wewnętrznego tkania kodu.

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

Twoje transakcje zawiedzie! Czy aktywowałeś menedżera transakcji w kontekście wiosny? Twój dziennik jest normalny, mój jest podobny, z wyjątkiem wycofań. – madhead

+0

To tylko wybór i nie ma adnotacji @transactional. Wygląda na to, że wszystko traktuje się jak transakcję. – Gonzalo

+0

Mam na myśli rodzimy poziom bazy danych: 27 przywrócenie zapytania. Wycofuje transakcję. Czy Twoje wstawki lub aktualizacje działają poprawnie? – madhead

Odpowiedz

1

Musisz skonfigurować transakcje dla swojej aplikacji. Zobacz Spring 2.5.x documentation on transaction management.

Edycja 12/3/11: Nawet w przypadku metod, które wybierają tylko selekcje, musisz nadal utworzyć transakcję tylko do odczytu w celu usunięcia dodatkowych zapytań wymienionych we wpisie. Po prostu napisz @Transactional (readOnly = true) i powinieneś być dobry.

Edycja 12/20/11: Musisz również upewnić się, że transakcje są poprawnie skonfigurowane. Wygląda na to, że opublikowana konfiguracja może nie być dostępna < tx: adnotacja sterowana /> ​​adnotacja. Zobacz section 10.5.1 of the Spring documentation.

+0

Dodałem menedżera transakcji. Korzystam z adnotacji @transactional, gdy potrzebuję transakcji, ale w tym przypadku nie ma transakcji. – Gonzalo

+0

Nawet w przypadku metod, które wybierają tylko selekcje, nadal trzeba utworzyć transakcję tylko do odczytu, aby usunąć dodatkowe zapytania wymienione w poście. Po prostu napisz @Transactional (readOnly = true) i powinieneś być dobry. – user393274

+0

Nadal trwa wycofywanie transakcji i automatyczne zatwierdzanie. Dostaję teraz również commit z readonly = true – Gonzalo

Powiązane problemy