2016-07-09 6 views
-1

프로토 타입 bean을 많이 사용하는 web-app (여기에는 Spring-MVC가 없으며 코어 IOC 만 해당) 대부분은 싱글 톤 (singleton) dao-bean을 사용하고 있습니다. 많은 다른 프로토 타입 빈들 (다른 요청들로부터)이 동일한 방법 id dao를 같은 순간에 사용할 수 있기 때문에 싱글 톤 (singleton) dao-bean 메소드가 synhronized되어야 하는가? 예를 들어싱글 톤 메서드를 동기화해야합니까?

그것은 의존

public void setLetterNotNew(int letterId) { 

    final String sql = "UPDATE income SET isnew=? WHERE id=?"; 

    try(Connection con = HikariFactory.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) { 

     ps.setInt(1, 0); 
     ps.setInt(2, letterId); 

     int i = ps.executeUpdate(); 
     if(i==0) throw new SQLException("setLetterNotNew"); 

    } catch (SQLException e) { 
     log.error(e); 
    } 
} 
+0

DB 업데이트 방법에 따라 다릅니다. 많은 프레임 워크가 이미 동기화되어 있으므로 추가 작업을 할 필요가 없습니다. 문서를 확인하십시오. – markspace

+0

@markspace 여기에는 Spring-ioc의 프레임 워크가 없습니다. 이것은 서블릿 기반 웹 응용 프로그램입니다. 데이터베이스가 standart jdbc를 통해 업데이트 중입니다. – furry

+0

네, 싱글 톤의 메소드를 동기화 시키거나 최소한 동기화 된 블록 사이에서 DB로가는 부분을 만들어야합니다. 또한 어떻게 빌드하고 싱글 톤을 얻는 지 확인하여 두 개의 인스턴스로 끝나지 않게하십시오. – Rumal

답변

0

DAO를 방법.

의견에 쓴 것처럼 jdbc를 사용합니다. JDBC API are synchronized에 대한 모든 조작은 auto-commit by default입니다. 따라서 JDBC 연결을 공유하는 경우 동기화 할 필요가없는 것보다 트랜잭션에 대한 트랜잭션이 필요하지 않습니다 (예 : 몇 줄 전에 선택한 데이터에 대한 업데이트가 수행되지 않음).

그러나 트랜잭션이 필요한 경우이 방법을 동기화하거나 각 스레드에 자체 JDBC 연결을 제공해야합니다 (each connection is also a transaction). 이를 달성하기 위해 매번 새로운 연결을 방법이나 시도로 열 수 있습니다. Spring handle that problem

+0

메서드에서 트랜잭션이 필요한지 어떻게 정의 할 수 있습니까? 나는 그 질문을 갱신했다. Connection (정적 메서드 HikariFactory.getConnection()) 풀에서 Connection을 가져 오면 연결은 자동으로 닫힙니다. 또한 Jdbc는 데이터베이스 레벨에서 멀티 스레딩을 처리한다는 것을 알고 있습니다. 문제의 방법에는 어떤 상태도 포함되어 있지 않습니다. 이 경우 멀티 스레딩이 어떻게 잘못된 일을 할 수 있습니까? 실제로 저는 Dao-bean을위한 프로토 타입을 사용하는 것이 가장 바람직하다고 생각합니다. 따라서 멀티 헤드에 대해 걱정할 필요가 없습니다. – furry

+0

메소드에 doao를 프로토 타입 bean으로 변경하거나 동기화하지 않고 그대로 사용하면 안전하지 않은 상태가 포함되어있는 경우. 귀하의 진술이 단일 업데이트 인 경우, 트랜잭션이 필요하지 않습니다. 트랜잭션은 동시에 사용되는 여러 쿼리가 데이터베이스의 동일한 데이터에서 작동하는지 확인하는 데 사용됩니다. 귀하의 경우에는 단 하나의 진술 만 있으므로 문제는 없습니다. –

관련 문제