2013-07-03 3 views
0

Этот вопрос заключается в том, чтобы улучшить мое понимание управления транзакциями в сеансах весеннего спящего режима. Когда я печатаю getSessionFactory() getStatistics(), getTransactionCount(), он выводит «0», когда getSessionFactory(). GetCurrentSession(). GetTransaction(). IsActive() - это «истина». Я действительно смущен. Прошу прощения у меня.count countFactory.getStatistics(). GetTransactionCount() is 0

Ниже приводится фрагмент кода, в котором я хочу, чтобы сделка произойдет:

@Transactional(propagation=Propagation.REQUIRED) 
public int insertNewRecord(){ 
System.out.println(getSessionFactory().getCurrentSession().getTransaction().isActive());//gives `true` 
System.out.println(getSessionFactory().getCurrentSession().getStatistics()); //Gives statistics 
System.out.println(getSessionFactory().getStatistics().getSessionOpenCount());// Gives 1 
System.out.println(getSessionFactory().getStatistics().getTransactionCount());// Gives 0 
} 

Моя весна и Hibernate конфигурации:

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingLocations"> 
     <list><value>classpath:Employee.hbm.xml</value></list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <!-- SQL dialect --> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
      <!-- Enable Hibernate's current session context --> 
      <!-- <prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</prop> --><!-- org.hibernate.context.internal.ThreadLocalSessionContext --> 

      <!-- Disable the second-level cache --> 
      <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> 
      <!-- Echo all executed SQL to stdout --> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.generate_statistics">true</prop> 

     </props> 
    </property> 
</bean> 

Ниже менеджер транзакций:

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

ответ

1

Ну, вы можете попробовать выполнить этот код несколько раз, так как getTransactionCount() метод документирована как:

Количество сделок мы знаем, завершили

Так что, если вы начали с нуля, но тогда вы берете счет в середине сделки, сделка имеет еще не завершено, поэтому счет будет равен нулю.

Возможно, вы также захотите добавить звонок в isStatisticsEnabled() и распечатать результат, чтобы дважды проверить, что статистика включена.

+0

Эй, Николос ... Спасибо за информацию. –

+0

@ Николас. Спасибо .. для меня статистика не была включена по умолчанию. Они могут быть включены через конфигурационный файл (hibernate.generate_statistics = on) или программно sessionFactory.getStatistics(). SetStatisticsEnabled (true) – khylo

+0

Хороший вызов. Иногда все ваши утки должны быть в ряду, чтобы что-то работать ..... :) – Nicholas