我有一个远程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 - &gt;用户已经拥有超过'max_user_connections'的活动连接
但是,如果最大连接数为100,为什么呢?
事实上,即使你把它改为
pool.setURL("jdbc:mysql://1.2.3.4:3306/TEST?max-connections=300");
问题仍然存在。
当然,最终,连接已经完成,我可以执行查询。但我不明白为什么我应该超过连接数。
答案 0 :(得分:3)
max_user_connections
是my.ini
中的服务器设置:请参阅here。它与连接池,Java等无关。
答案 1 :(得分:2)
除非您是应用服务器供应商,否则您不应该使用 MysqlConnectionPoolDataSource 。
ConnectionPoolDataSources
不连接池。它们是连接池代码连接的供应商。除了创建这些物理连接外,ConnectionPoolDataSource
不应该做任何其他事情。
在任何情况下,在您致电PooledConnection.close()
之前,物理连接不会消失,呼叫conn.close()
只会关闭逻辑连接,这需要{{1>}上的所有侦听器{1}}被调用以便回收但不会关闭物理连接以便可以再次发布
因此,如果您在应用程序服务器中工作,请使用应用程序服务器的ConnectionPoolDataSource
提供的池
如果您需要独立连接池,请使用第三方连接池,如BoneCP,c3p0或Apache DBCP