这个问题是为了提高我对如何在spring hibernate会话中管理事务的理解。当我打印getSessionFactory()getStatistics()。getTransactionCount()时,它会在getSessionFactory()时输出'0'。getCurrentSession()。getTransaction()。isActive()是'true'。我真的很困惑。请为我清楚一点。
以下是我希望事务发生的代码段:
@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
}
我的spring和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>
答案 0 :(得分:1)
好吧,您可能想尝试执行该代码几次,因为getTransactionCount()方法记录为:
我们知道已完成的交易数量
因此,如果你从零开始,但是你在交易中间计算,那么交易还没有完成,所以计数仍然是零。
您可能还想添加对isStatisticsEnabled()的调用并打印结果,只是为了仔细检查是否已启用统计信息。