2011-08-11 161 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()的时间与连接数与最大值进行比较的时间之间,某些其他线程可能已释放或进行连接,并且连接数可能已更改。此外,您正在轮询队列两次以获得单个连接。

附注:你为什么重新发明轮子?有很多可用的免费连接池。

+0

你有没有想过... 1.什么时候创建connectionPool集合必须充满连接? 2.连接必须从池中删除?我有想法使用peek(),但我现在不知道它是否自动发送使用的连接到队列中。也有可能使一些ConnectionWrapper具有布尔字段使用或未使用... – Ivan

+0

1.这取决于。大部分连接池都可以在此区域进行配置(最小,最大,连接的起始数量)。 2.否。连接池应该包含所有连接,使用与否(但是当然必须能够区分已使用和未使用的连接。不要实现连接池。重用现有连接。 –

+0

我不明白你的我只是说:不要开发连接池,使用现有的实现,比如c3p0或dbcp。 –