Spring에서 DAO가 순환 호출될 때 데이터가 실시간으로 업데이트되지 않는 해결 방법

문제를 설명하기 전에 몇 가지 전제 사항을 설명하십시오. Spring의 구성 파일에서 다음과 같은 방식으로 데이터베이스 트랜잭션을 구성했다고 가정하십시오.

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
 </bean> 
 <tx:annotation-driven transaction-manager="transactionManager" />
현재 UserDao 및 Security Service가 있습니다.

@Repository
 public class UserDao {
   public User getUser() {
     // query user from user table
     return queryObject("select * from user order by id desc limit 1");
   }
 }

@Service
 @Transactional
 public class SecurityService {
   @Autowired
   private UserDao userDao;
 
   public void checkUserInfo() {
     while(true) {
       User user = userDao.getUser();
       if(user != null && "Tom".equals(user.getName()) {
         System.out.println("Tom is here");
         break;
       }
     }
   }
 }
Security Service #checkUser Info () 방법을 호출하는 과정에서userDao #getUser () 방법을 통해 얻은 데이터는 변하지 않습니다. 이 때name 을 Tom으로 새로 삽입해도 데이터 순환이 끝나지 않습니다.또한 Security Service의 @Transactional 메모를 제거하는 것도 도움이 되지 않습니다.
데이터베이스 연결 탱크가 아닐까 하는 생각이 먼저 들었고, 스프링이 가지고 있는 것으로 바꾼 것도 마찬가지였다.그리고 JdbcTemplate에서 연결 대상을 직접 호출하여 원시적인 JDBC 방식으로 데이터베이스를 조작했습니다. 이때 데이터는 실시간으로 바뀌었기 때문에 스프링의 업무와 현재 작업 라인을 연결해야 한다고 생각했습니다.원본 코드가 들어간 후에 과연 DataSourceUtils #doGetConnection 방법에서 Spring이 모든 라인의 모든 DataSource에 연결을 만들고 업무와 연결되는 것을 발견했습니다.tx:annotation-driven 프로필은 모든 서비스 층 (@Service 주석을 추가한 클래스) 에 대한 사무 연결을 하기 때문에 @Transactional을 사용하든 안 사용하든 같은 라인에서 같은 연결을 연결합니다. 사무 조작을 하지 않을 뿐입니다.
여러 차례의 실험과 자료 탐색을 거쳐 마침내 완벽한 해결 방법을 찾았다. 상술한 checkUserInfo 방법에 @Transactional(propagation=Propagation.NOT_SUPPORTED) 주석을 추가하면 된다.물론 Connection을 가져와서 수동으로 조작할 수도 있고 DateUtils 패키지로 조작할 수도 있습니다.

좋은 웹페이지 즐겨찾기