2017-04-06 5 views
0

내가 연결 풀링 (http://www.mchange.com/projects/c3p0/)를위한 ComboPooledDataSource와 JDBC를 사용하는 Java의 RESTful API를 가지고 있고, 필드 증가하여 행을 업데이트하는 PreparedStatement의 :JDBC : 안전의 행이 갱신 된 경우 여러 요청

public void update(int messageId) { 

    String UPDATE_STM = "UPDATE table SET count_field = count_field +1 WHERE id=?"; 
    conn = ConnectionManager.getConnection(); 
    PreparedStatement stm = conn.prepareStatement(UPDATE_STM); 
    stm.setInt(1, messageId); 
    stm.executeUpdate(); 
} 

(I를 try/catch를 생략하고 ConnectionManager.getConnection()은 풀에서 사용 가능한 연결 중 하나를 제공합니다. RESTful 서비스가 update() 메소드에 대한 요청을 두 개 이상 동시에받는 경우 개수가 올바르게 업데이트되었음을 ​​인정합니까? 그렇지 않은 경우 잘못 계산되지 않도록 코드를 어떻게 수정해야합니까?

+0

이 클래스를 싱글 톤으로 만들고 메서드 선언에 syncronized를 추가합니다. 하지만 증분 값을위한 최상의 솔루션은 시퀀스와 같은 도구에서 데이터베이스 빌드를 사용합니다. –

답변

1

사용 이노

가 최대한 멀리 볼 수있는, 자바 코드는 스레드 안전, 그것은 액세스하거나 필드를 변경하지 않습니다. 걱정할 필요가있는 부분은 UPDATE 작업입니다. mysql 태그로 질문 태그를 지정 했으므로 MySQL을 사용한다고 가정합니다. MySql DBMS는 ACID 모델을 제공하므로 작동하려면 데이터베이스 엔진을 InnoDB으로 설정해야합니다. 자세한 내용은 link을 참조하십시오.

+0

db 엔진을 InnoDB로 설정 한 후 Java 코드를 수정하여 어떻게 작동시켜야합니까? – giozh

+0

코드를 수정할 필요가 없습니다. – ahoxha

+0

감사합니다. db는 엔진으로 InnoDb를 이미 사용하고 있습니다. – giozh