【问题标题】:Java and MySql connection problemJava和MySql连接问题
【发布时间】:2011-05-17 05:52:19
【问题描述】:

我正在使用 Java+MySql。我正在尝试添加批量数据(大约 4000 万条记录)。我的应用程序适用于几十万条记录,但之后它开始给我以下异常:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.GeneratedConstructorAccessor5.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at net.jboss.Database.DatabaseConnection.getConnection(DatabaseConnection.java:48)
    at net.jboss.emp.idm.adta(mde.java:96)
    at net.jboss.emp.idm.main(mde.java:69)
Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
    ... 16 more

我搜索了这个问题并尝试了几乎所有选项(更新 Windows 注册表、更改 my.cnf 文件、更改 mysql 全局参数等),但它不起作用。

【问题讨论】:

  • 请您随时在此处发布您的 jdbc 驱动程序注册代码
  • 请向我们展示您的代码。我的猜测是您正在为每条记录打开连接,但忘记关闭它(您应该只打开一次,然后使用参数化查询)。

标签: java mysql database jdbc connection


【解决方案1】:

几个小时前我遇到了类似的问题。使用默认设置,我可以在单个事务中写入大约 15K 条记录。尝试写更多的东西给了我完全相同的消息(“没有可用的缓冲区空间(达到最大连接数?):连接”)。

然后我将事务分解为 1000 条记录的块(我的应用程序要求允许这样做),并且在第 15 次迭代后我仍然收到了消息。我的应用程序正在努力创建一个新的 EntityManager 并在每次迭代时关闭它。

解决方案是在迭代之间清除该特定类型实体的缓存(您也可以按实体清除缓存)。

EntityManagerFactory.getCache().evictAll 或 evict(...)

【讨论】:

    【解决方案2】:

    似乎连接没有正确关闭。我建议你使用 connection-pooling

    另见

    【讨论】:

    • 感谢您的回复,我正在正确打开和关闭连接。如果是这种情况,为什么它适用于前几十万条记录?
    • 错误消息说(maximum connections reached?) 可能是在某些事务连接未正确关闭之后导致结果..
    • 我仔细检查并没有发现连接总数有任何问题。
    【解决方案3】:

    这可能是与 mysql 失去连接或 您的代码无法关闭现有的连接,因为您说它可以用于启动一些记录。如果mysql接受来自其他程序的连接,则增加与mysql的最大连接或尝试与其他程序检查时收到此错误消息。

    【讨论】:

      【解决方案4】:

      我遇到了完全相同的问题,每次调用可执行语句后,我都通过connectionname.close(); 语句修复了它。

      【讨论】:

        【解决方案5】:

        现在可以解决您的问题 :) CommunicationsException

        【讨论】:

        • 请在此处发布答案,而不是链接到您的 wordpress
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 2014-12-17
        • 2020-02-01
        相关资源
        最近更新 更多