동일한 테이블에서 두 개의 데이터베이스 연산을 수행하는 Spring 서비스 메소드가있다. 하나는 Hibernate Session Factory이고 다른 하나는 평범한 Spring JDBC이다. 그러나 둘 다 단일 트랜잭션에 바인딩되기를 원합니다. 아래 코드에서는 2 개의 다른 트랜잭션이 생성되고 첫 번째 트랜잭션이 두 번째 트랜잭션에 대해 테이블을 잠그는 것처럼 보입니다.동일한 테이블에서 동일한 트랜잭션의 springjdbc와 hibernate 세션 팩토리를
두 작업이 모두 단일 트랜잭션으로 처리되는지 어떻게 확인합니까? ?
내 서비스 클래스
@Service
public class MyService{
@Autowired
IMyDao mydao;
@Transactional
public void myMethod(){
...
mydao.save(entity); //This uses hibernate
...
mydao.saveBulk(List<Entity> entities>; //This uses spring jdbc for performance reasons.
}
...
}
MyDAOImpl.class
public class MyDAOImpl extends SimpleJDBCSupport implements IMyDao{
private SessionFactory sessionFactory;
@Autowired
public MyDAOImpl (
@Qualifier("sessionFactory") final SessionFactory sessionFactory,
@Qualifier("dataSource") final DataSource dataSource) {
this.sessionFactory = sessionFactory;
this.setDataSource(dataSource);
}
public void save(Entity entity){
sessionFactory.getCurrentSession().createQuery("insert into tableA... ").executeUpdate() ;
}
public void saveBulk(List<Entity> entites){
...// prepare batch insert data.
this.getJdbcTemplate().batchUpdate("insert into tableA... " , batchPreparedStmtSetter)
}
}
봄 구성
<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="xaDataSourceClassName" value="${advdb.jdbc.dataSourceClassName}" />
<property name="xaProperties" ref="dataSourceProperties" />
<property name="uniqueResourceName" value="${advdb.jdbc.uniqueResourceName}" />
<property name="testQuery" value="${advdb.jdbc.testQuery}" />
<property name="minPoolSize" value="${advdb.jdbc.minPoolSize}" />
<property name="maxPoolSize" value="${advdb.jdbc.maxPoolSize}" />
<property name="maxIdleTime" value="${advdb.jdbc.maxIdleTime}" />
<property name="borrowConnectionTimeout" value="${advdb.jdbc.borrowConnectionTimeout}" />
<property name="reapTimeout" value="${advdb.jdbc.reapTimeout}" />
<property name="maintenanceInterval" value="${advdb.jdbc.maintenanceInterval}" />
</bean>
<!-- Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource- ref="dataSource">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
...
...
</bean>
삽입을 수행하기 위해 "update (...)"메소드 대신 "createQuery (...)"를 사용하고 있기 때문일 수 있습니다. –
나는 그 영향을 몰랐다. 그러나 나는 그것을 시도 할 것이다. –