스프링에서 트랜잭션 처리하면 validationquery는 한번만 날리나요?
조회수 1766회
validationQuery는 커넥션이 살아있는지 검사하는 쿼리로 알고 있습니다. 이때 스프링에서 트랜잭션 처리를 하고 2개의 쿼리를 날린다고 가정하면 validationQuery는 트랜잭션 시작전에 한번 만 호출되는것이 정상 아닌가요?
페이지 계산 때문에 SQL_CALC_FOUND_ROWS 함수와 FOUND_ROWS()함수를 한 트랜잭션에서 사용하는데 문제는 리스트 조회하는 쿼리 호출 후 validationquery가 다시 날아가서 FOUND_ROWS() 의 결과값이 항상 1로 리턴됩니다.
설정은 아래와 같습니다.
커넥터 : mysql-connector-java 버전 : 6.0.6
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=UTC username=myadmin password=1234
db-context.xml
<tx:annotation-driven transaction-manager="txManager" />
<util:properties id="jdbc" location="classpath:properties/#{systemProperties['spring.profiles.active']}/jdbc.properties" />
<bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource">
<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="testWhileIdle" value="true"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceSpied" />
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE" />
<property name="sqlPrefix" value="## SQL : 
	" />
</bean>
</property>
</bean>
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:sql/**/*.xml" />
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache" >
<constructor-arg ref="sqlSessionFactoryBean"/>
</bean>
<!-- Transaction -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="select*" read-only="true" />
<tx:method name="list*" read-only="true" />
<tx:method name="is*" read-only="true" />
<tx:method name="*" rollback-for="Exception" propagation="REQUIRED" isolation="REPEATABLE_READ" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="transactionPointcut"
expression="서비스 클래스들 명시" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" />
</aop:config>
트랜잭션 아이콘도 보입니다.
페이지조회 함수 트랜잭션 (){
SqlSession sqlSession
A = sqlSession.selectList(페이지조회);
B = sqlSession.selectOne(총건수조회);
}
대략 위와 같이 서비스를 만들었을때 A를 호출하고 B를 찍어보면 항상 1이 찍힙니다. 그래서 validationQuery를 지워보니 정상적으로 건수가 찍히고여
heidsql 툴에서는 동시에 날려보면 row 수가 정상적으로 찍힙니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력