2017-02-15 3 views
0

Enum 내부에서 getConnection()을 동기화해야합니까?다른 데이터베이스에 연결하는 데 사용되는 enum 상수의 스레드 안전

어느 것이 안전합니까?

첫째 :

public enum DBConnection { 

POSTGRESQL("jdbc:postgresql://localhost:5432/mydb", "vagrant", "vagrant"), 
MYSQL("jdbc:mysql://localhost:3306/mydb", "vagrant", "vagrant"); 

DBConnection(String host, String user, String password) { 

    this.host = host; 
    this.user = user; 
    this.password = password; 
} 

private final String host; 
private final String user; 
private final String password; 

private Connection connection; 

public Connection getConnection() throws SQLException { 

    if (connection == null || connection.isClosed()) { 
     connection = DriverManager.getConnection(host, user, password); 
    } 

    return connection; 
}} 

또는 두 번째, 동기화 호출 및 휘발성 변수 :

private volatile Connection connection; 

public synchronized Connection getConnection() throws SQLException { 

    if (connection == null || connection.isClosed()) { 
     connection = DriverManager.getConnection(host, user, password); 
    } 

    return connection; 
} 

연결 호출, 예를 들면 :

 try (Connection connection = DBConnection.POSTGRESQL.getConnection()) { 
     // Prepared statement etc 
     } 
    } catch (SQLException ignored) {} 
+0

나는 오히려 새로운 연결을 매번 반환 할 것이라고 생각합니다. – Axel

+0

@ Axel, Yea, 나도 알아,하지만이 예제는 Pluralsite 과정에서 나온거야. 작성자는 위와 같이 연결을 처리합니다. –

+0

@JanuszAgh이 사이트의 첫 번째 질문이므로 [내 질문에 대한 답변] (https://stackoverflow.com/help/someone-answers)을 읽어보십시오. 도움이되었던 답변을 upvote하는 것은 좋은 예절로 간주됩니다. 추가 설명이 필요하면 질문에 답변했거나 답변에 의견을 남기면 답변을 수락 할 수도 있습니다. 내 대답을보고 도움이 더 필요하면 알려주십시오. 그렇지 않은 경우 옆에있는 체크 표시를 클릭하여 답변을 수락하십시오. – CKing

답변

2

을 하나의 스레드가 안전합니까? 당신은 경쟁 조건을 초래할 수있는 체크인 당시 행위 상황을 가지고 있기 때문에

첫 번째 옵션은 스레드 안전 아니다. 두 번째 옵션은 스레드 안전이지만 volatile의 사용은 전체 getConnection 메서드를 동기화하는 경우 중복됩니다. 말했다

, 당신은 으로 conneciton 풀보다는 싱글 DB 연결을 사용하는 것이 더 낫다.

+0

코드가 thread-safe한지 또는 thread-safe하지 않은지 궁금해하는 분에게, 이해해야 할 중요한 점은 각각의'enum' 상수가'enum'의 인스턴스라는 것입니다. 복수의 thread로부터'enum' 정수 (인스턴스)의 상태를 변경하는 메소드를 호출하면 (자),'class' 객체의 객체에 필요한 thread 안전 보장의 대부분이 필요하게됩니다. – CKing

관련 문제