DBILITY

독거 가능성 100% 노후에 라면값이라도 하게 센스를 발휘합시다!😅
Please click on the ad so that I can pay for ramen in my old age!
点击一下广告,让老后吃个泡面钱吧!
老後にラーメン代だけでもするように広告を一回クリックしてください。

spring 3.1.1 spring + mybatis + log4jdbc-remix 사용시 transaction 관련 본문

java/spring

spring 3.1.1 spring + mybatis + log4jdbc-remix 사용시 transaction 관련

DBILITY 2021. 11. 22. 14:52
반응형

이거 보고 광고 한번 안 누른 이는 삼대가 재수가 없을지어다!ㅋㅋ

프레임워크 설정을 새로 하는 경우가 아주 드물어서 인지 오래전 겪은 일들을 다시 겪게 되는 경우가 있다.

필요한 경우가 반드시 생기니 기록해 두자.

1.sqlSessionFactory와 transactionManager가 참조하는 dataSource가 동일해야 하고,
2.public interface를 구현한 method에 @Transactional이 rollback-for와 함께 선언이 되어 있어야 하는 것이 본 작업 프레임워크의 기본이다.(default proxy-target-class="false").물론 Annotation이 아닌 xml이나 java config로 선언적으로 할  수도 있다. 이 부분은 스프링 문서를 참고하자. 길다.
간혹 1의 경우에 둘 중 하나가 log4jdbc의 datasource를 참조할 경우 dbms default auto transaction이 적용된다.

개발할 때야 sql log가 필요하겠지만, 운영 시에는 대부분 필요하지 않으니 logDataSource를 제외하는 경우 변경이 필요하다. 번거로우니 pom에 profile을 적용하는 것이 좋겠다.

<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
	<property name="driverClassName" value="${jdbc.driverClassName}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
	<property name="defaultAutoCommit" value="false" />
	<property name="initialSize" value="1" />
	<property name="minIdle" value="2" />
	<property name="maxIdle" value="5" />
	<property name="maxActive" value="5" />
	<property name="maxWait" value="600000" />
	<property name="testOnBorrow" value="true" />
	<property name="testWhileIdle" value="true" />
	<property name="validationQuery" value="SELECT 1 FROM DUAL" />
	<property name="removeAbandoned" value="true" />
	<property name="removeAbandonedTimeout" value="300" />
	<property name="logAbandoned" value="true" />
</bean>

<!-- logDataSource 설정 -->
<bean id="logDataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
	<constructor-arg ref="dataSource" />
	<property name="logFormatter">
		<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
			<property name="loggingType" value="MULTI_LINE" />
			<property name="sqlPrefix" value="SQL:::" />
		</bean>
	</property>
</bean>

<!-- 트랜잭션을 처리 모듈 추가 : 어노테이션을 적용하여 처리  -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="logDataSource" />
</bean>


<!-- SqlSession setup for myBATIS Database Layer -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="logDataSource" />
	<property name="configLocation" value="classpath:/mapper/mybatis-config.xml" />
	<!-- Core File관련 Table SQL MAP 설정 위치 -->
	<property name="mapperLocations">
		<list>
			<value>classpath:/mapper/**/*_Oracle.xml</value>
		</list>
	</property>
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg ref="sqlSessionFactory" />
</bean>

 

반응형
Comments