【问题标题】:MAX_USER_CONNECTIONS problem even though all the connections are closed properlyMAX_USER_CONNECTIONS 问题,即使所有连接都已正确关闭
【发布时间】:2011-08-22 13:31:29
【问题描述】:

我的java不太好。 我为客户创建了一个网站,但在交易过程中不断收到服务器连接失败之类的错误。由于基础异常:'com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 用户 root 已经有超过 'max_user_connections' 个活动连接'。 我使用的网站托管仅提供 10 个 max_user_connections。但是,如果我继续使用该网站,我会因为不断点击网络服务器而收到此错误。

这背后的原因是什么? 我没有关闭连接吗? 我已经使用con.close()关闭了所有连接。

请帮忙

问候阿普尔夫

打开我使用的连接

Connection con=null;
Statement st=null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
String useq="root";
String paq="manager";
String url="jdbc:mysql://localhost:3306/jayna?autoReconnect=true";
con=DriverManager.getConnection(url,useq,paq);
st=con.createStatement();

关闭我使用的连接

if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(con!=null){
con.close();
}

我没有使用数据库池,但是当我正确关闭每个连接时,它有什么用??

【问题讨论】:

  • 您使用的是什么服务器?你使用一些连接池机制吗?你有一些代码给我们看吗?
  • 好吧,如果服务器说你超过了分配的连接数,那可能是对的,所以你的代码中一定有一些东西导致连接保持打开,或者可能 10 个连接不是对于您的应用程序来说已经足够了,尤其是在没有使用连接池的情况下。在没有看到任何代码的情况下,很难甚至不可能确定发生了什么。
  • 幸好我不是你的客户。 :p
  • 嗨,Apurv,你使用 finally 块作为关闭连接代码吗?
  • 精英我第一次..请不要嘲笑我.:p。 Cyril 是的,我在 finally 块中使用过它。还有什么其他原因??

标签: java mysql sql jsp


【解决方案1】:

这似乎是连接泄漏的情况。

  1. 您确定已关闭所有连接吗?
  2. Conneciton.close() 抛出 IOException。检查是否能够成功关闭连接。
  3. 使用 netstat 或其他工具查看连接是否真的关闭或处于 WAITING 状态或其他状态。

【讨论】:

  • 我已经使用“SHOW PROCESSLIST”签入了 mysql,但它仍然没有关闭。有很多连接处于等待状态..
  • 没关系。您从客户端关闭与 db 的连接,但不在 db 服务器上。在进程列表中,您会看到准备好获取新查询的连接/线程。
  • 但是我的问题没有解决。你能给我一个如何正确关闭jsp中所有连接的链接吗?我需要一些关于这样做的纯粹建议,因为我的整个网站都已完成,而且这个错误已经从内部吞噬了我..:(
【解决方案2】:

我认为您应该增加连接数。因为如果有 10 个慢查询并且您收到 11 个对您站点的请求,则 11 个请求无法处理并且您会收到此错误。 所以:

  1. 尝试增加连接数。
  2. 尝试找到慢查询(使用慢查询日志)并优化它们

【讨论】:

  • 它来自网站托管方面。 EATJ.com 刚刚提供了最多 10 个。连接数,当我尝试增加连接数时,它有一个特权问题..:(
  • 您应该分析您的查询。我相信这个错误没有连接到java关闭问题。
  • 您能否从您的主机中获取有关您网站中查询缓慢的信息?它通过在 my.cnf 文件中启用 slow_query_log 来实现。
  • 如果没有,您应该获取每个查询并运行 EXPLAIN 查询。见dev.mysql.com/doc/refman/5.1/en/explain.html
【解决方案3】:

连接池是一种提供一组即用型连接的技术,其中一个优点是可以节省每次调用的创建/打开时间。另一个优点是连接池可以帮助检测放弃的连接,即应用程序忘记关闭的连接。

在 Tomcat 中有一个标准的连接池,对于 5.x 版本的 Tomcat,请查看 here 获取一些信息,对于版本 6,请查看 here,对于版本 7 的信息可以找到 here。它的 removeAbandonedlogabandoned 功能可以帮助您确定您的应用是否真的忘记关闭连接,或者 10 个还不够 - 请参阅 Andrej 的建议,您应该分析您的查询。

【讨论】:

    【解决方案4】:

    正如其他人所说,您要么没有关闭连接,要么您的应用程序在某些负载条件下只需要 10 个以上的并发连接。

    1. 如果错误总是出现在第 11 个请求中,则很可能您永远无法关闭连接。
    2. 如果它在以后的某个时间发生,并且出乎意料地自行消失,则很可能 10 根本不足以满足某些负载情况。
    3. 如果它稍后发生,不可预测,但永远不会自行消失,则您可​​能仅在并非每次都受到打击的特定情况下才关闭连接。

    如果对于某些负载情况(选项 2)来说 10 太小,您应该检查您的查询和代码逻辑,以确保您保持连接的时间不会超过必要的时间并且您可能应该尝试正如其他人所建议的那样,移动到连接池。除其他外,从头开始创建新连接比从池中重用它们的开销更大,因此可能会导致单个访问花费比必要更长的时间。

    【讨论】:

      【解决方案5】:

      这个问题可以通过使用 Singleton 类结构来初始化连接对象来解决。 使用 Singleton 模式,每当初始化连接对象时,它不会创建新对象,而是查找连接对象的现有实例并使用该实例(如果存在)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 2022-11-22
        相关资源
        最近更新 更多