Spring에서 mybatis 연동시 sqlSession 주입 시기가 궁금합니다.
sqlSession객체를 사용하여 autoCommit을 자동으로 하고자
아래와 같이 설정하고 테스트 해봤습니다.
================================
[root-context.xml]
<!-- datasource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
<!-- mybatis SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="/WEB-INF/mybatis/home/test.xml"/>
</bean>
<!-- SqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
================================
[service class]
@Service
public class HomeService {
@Autowired
HomeDao homeDao;
public HashMap<String, Object> testService(HashMap<String, Object> params) {
try {
homeDao.setAutoCommit(false);
params.put("name", "nameTest");
homeDao.insertTest(params);
List<HashMap<String, Object>> list = homeDao.getTest(params);
} catch (Exception e) {
homeDao.rollback();
} finally {
homeDao.setAutoCommit(true);
}
return params;
}
}
================================
[Dao class]
@Repository
public class HomeDao {
@Autowired
SqlSession sqlSession;
public void setAutoCommit(boolean autoCommit){
try {
sqlSession.getConnection().setAutoCommit(autoCommit);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void commit() {
sqlSession.commit();
}
public void rollback() {
sqlSession.rollback();
}
public int insertTest(HashMap<String, Object> params) {
return sqlSession.insert("test.insertTest", params);
}
public List<HashMap<String, Object>> getTest(HashMap<String, Object> params) {
return sqlSession.selectList("test.getTest", params);
}
}
로 설정해서 실행하면
setAutoCommit시
java.sql.SQLException: Connection is closed. 에러가 떨어집니다.
그런데 insert나 select 시에는 connection이 맺어져 있는것 같은데
어느 시점에 SqlSession이 injection 되는건가요?
아니면 다르게 설정이 필요한 부분이 또 있는건가요?
transactionManaging은 위임해야하는 것이 아닌가요?
직접 처리한다면 코드 복잡도 증가하기 때문이라고 알고 있습니다.
//kenu
그렇군요;
답변 감사합니다^^
구글링해보니 대부분 aop를 사용하여 트랜젝션처리 하는게 대부분인데
그 방식이 안맞는 부분이 종종 나와서;; ㅎㅎ
일단 결과는 transactionManager를 사용해서 commit 과 rollback 테스트 해봤어요 ㅋ
'Mybatis > 노하우정보' 카테고리의 다른 글
MyBatis 내장 cache 에 대해서 (0) | 2016.04.27 |
---|---|
Spring Transaction propagation mode에 따른 내부 동작 메커니즘 (0) | 2016.04.27 |
Spring Transaction 내부 동작 메커니즘 (0) | 2016.04.27 |
TransactionTemplate 을 이용한 Spring Transaction 사용 (0) | 2016.04.27 |
Spring Transaction 사용법 (0) | 2016.04.27 |
Spring - Mybatis 에서 Mapper interface 를 주입받는 방법과 SqlSession 을 주입받는 방법 (0) | 2016.04.27 |
Spring 에서 Mybatis 사용하기 (0) | 2016.04.27 |
MyBatis에서의 Transaction 관리 (0) | 2016.04.27 |