MySQL连接池超过了Java中的最大连接数

时间:2014-11-25 22:42:59

标签: java mysql

我有一个远程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");

问题仍然存在。

当然,最终,连接已经完成,我可以执行查询。但我不明白为什么我应该超过连接数。

2 个答案:

答案 0 :(得分:3)

max_user_connectionsmy.ini中的服务器设置:请参阅here。它与连接池,Java等无关。

答案 1 :(得分:2)

除非您是应用服务器供应商,否则您不应该使用 MysqlConnectionPoolDataSource

ConnectionPoolDataSources 连接池。它们是连接池代码连接的供应商。除了创建这些物理连接外,ConnectionPoolDataSource不应该做任何其他事情。

在任何情况下,在您致电PooledConnection.close()之前,物理连接不会消失,呼叫conn.close()只会关闭逻辑连接,这需要{{1>}上的所有侦听器{1}}被调用以便回收但不会关闭物理连接以便可以再次发布

因此,如果您在应用程序服务器中工作,请使用应用程序服务器的ConnectionPoolDataSource提供的池

如果您需要独立连接池,请使用第三方连接池,如BoneCP,c3p0或Apache DBCP