我有一个远程MySQL数据库。在Java中,我有一个连接池:
pool = new MysqlConnectionPoolDataSource();
pool.setURL("jdbc:mysql://1.2.3.4:3306/TEST?max-connections=100");
pool.setUser("USER");
pool.setPassword("PASSWORD");连接的最大数目是100。现在,让我们创建100个线程:
for (int i = 0; i < 100; ++i) {
Thread t = new Thread(new Client(i, pool));
t.start();
}这是在每个线程中运行的代码:
class Client implements Runnable {
int id;
MysqlConnectionPoolDataSource pool;
public Client(int id, MysqlConnectionPoolDataSource pool) {
this.id = id;
this.pool = pool;
}
public void run() {
while (true) {
try {
Connection conn = pool.getConnection();
ResultSet set = conn.createStatement().executeQuery("SELECT * FROM SOMETHING");
if (set.next()) {
System.out.println(id + " finished.");
}
set.close();
conn.close();
return;
}catch (Exception e) {
System.out.println("ERROR " + id + " -> " + e.getMessage());
}
}
}
}因此,我有一个具有100个最大连接的池,然后100个线程试图使用每个连接。
然而,表格中有几个错误:
错误30 ->用户已经有超过“max_user_connections”活动连接
但是为什么,如果连接的最大数目是100?
事实上,即使你把它改为
pool.setURL("jdbc:mysql://1.2.3.4:3306/TEST?max-connections=300");问题依然存在。
当然,最终建立了连接,我可以执行查询。但我不明白为什么我会超过联系的数量。
发布于 2014-11-25 23:37:45
max_user_connections是my.ini中的服务器设置:参见这里。它与连接池、Java等无关。
发布于 2014-11-25 23:56:50
除非您是应用服务器供应商,否则不应该使用MysqlConnectionPoolDataSource.
ConnectionPoolDataSources是而不是连接池。它们是连接池代码的供应商。除了创建这些物理连接之外,ConnectionPoolDataSource不应该做任何其他事情。
在任何情况下,物理连接直到您调用PooledConnection.close()时才会消失,调用conn.close()只会关闭逻辑连接,这要求调用ConnectionPoolDataSource上的任何侦听器,以便它可以恢复,但不能关闭物理连接以便再次分发。
因此,如果您在应用程序服务器中工作,请使用应用服务器的DataSources提供的池。
如果您需要独立的连接池,请使用第三方连接池,如BoneCP、c3p0或Apache DBCP。
https://stackoverflow.com/questions/27138175
复制相似问题