2011-08-11 5 views
0
BlockingQueue<Connection> connections = new LinkedBlockingQueue<Connection>(maxConnection); 

AtomicInteger numberOfDrewedConnectionFromPool 

내 ConnectionPool에서 나는 LinkedBlockingQueue를 사용합니다. 곱하기 "if 문"이 스레드로부터 안전할지 여부에 대해서는 의심의 여지가 있습니다. maxConnection은 상수입니다. numberOfDrewedConnectionFromPool 잠금없이 방법 releaseConection도 변경() ..연결 풀

public Connection getConnection() throws ConnectionPoolException { 
    Connection connection = null; 

    if ((connections.poll() == null) && (maxConnection > numberOfDrewedConnectionFromPool.get())) { 
     return newConnection(); 
    } else { 
     return connections.poll(); 
    } 
} 


private Connection newConnection() throws ConnectionPoolException { 
    lock.lock(); 
    Connection connection = null; 
    try { 
     try { 
      connection = DriverManager.getConnection(url, user, password); 
      numberOfDrewedConnectionFromPool.incrementAndGet(); 
     } catch (SQLException exception) { 
      throw new ConnectionPoolException(); 
     } 
    } finally { 
     lock.unlock(); 
     return connection; 
    } 

} 
+1

JB Nizet과 마찬가지로 http://sourceforge.net/projects/c3p0/와 같은 기존 연결 풀을 사용하십시오. 자신을 구현하는 것은 시간 낭비이고 불가능하지는 않더라도 어렵지 않습니다. – helpermethod

+0

자신의 conectionPool은 작업의 요구 사항입니다) – Ivan

+0

숙제입니까? 그렇지 않다면 상사에게 기존 연결 풀이 있는지, 그리고 연결 풀을 구현하려고 시도하면서 돈을 잃어 가고 있는지 설명하십시오. –

답변

1

아니, 코드가 스레드로부터 안전하지 않습니다.

connections.poll()이 호출 된 시간과 연결 수를 max와 비교하는 시간 사이에 다른 스레드가 연결을 해제했거나 연결했을 수 있으며 연결 수가 변경되었을 수 있습니다. 또한 대기열을 두 번 폴링하여 단일 연결을 얻습니다.

사이드 노트 : 왜 바퀴를 다시 발명하고 있습니까? 가능한 많은 무료 연결 풀이 있습니다.

+0

그것에 대해 좀 생각해 보셨습니까 ... 1. 언제 connectionPool 컬렉션을 만들 때 연결이 가득 찼습니까? 2. 연결을 풀에서 제거해야합니까? 내가 사용 peek() 아이디어를 가지고 있지만 그것은 자동으로 머리 큐에 사용되는 연결을 보낼 여부 지금은하지 않습니다. 또한 부울 필드가 사용되거나 unsed 인 ConnectionWrapper를 만들 수도 있습니다 ... – Ivan

+0

1. 다릅니다. 대부분의 연결 풀은이 영역에서 구성 가능합니다 (최소, 최대, 시작 연결 수). 연결 풀에는 사용되었거나 사용되지 않은 모든 연결이 포함되어야합니다 (물론 사용 된 연결과 사용되지 않은 연결을 구분할 수 있어야합니다.) 연결 풀을 구현하지 마십시오. 기존 연결을 다시 사용하십시오. –

+0

사용자의 연결 풀을 이해하지 못합니다. 질문 : 연결 풀을 개발하지 말고 c3p0 또는 dbcp와 같은 기존 구현을 사용하십시오 . –