728x90
반응형

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 테스트 해봤어요 ㅋ

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,