gpt4 book ai didi

java - 连接池

转载 作者:行者123 更新时间:2023-12-01 15:45:53 24 4
gpt4 key购买 nike

 BlockingQueue<Connection> connections = new LinkedBlockingQueue<Connection>(maxConnection);

AtomicInteger numberOfDrewedConnectionFromPool

在我的连接池中,我使用 LinkedBlockingQueue。我有些怀疑乘法“if 语句”是否是线程安全的。 maxConnection 是恒定的。 numberOfDrewedConnectionFromPool 在没有 lock() 的情况下也在方法 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;
}

}

最佳答案

不,您的代码不是线程安全的。

在调用 connections.poll() 的时间和将连接数与最大值进行比较的时间之间,其他一些线程可能已释放或占用连接,并且连接数连接可能已更改。此外,您需要轮询队列两次才能获得单个连接。

旁注:为什么要重新发明轮子?有大量可用的免费连接池。

关于java - 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7022070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com