Java和MySql连接问题
Posted
技术标签:
【中文标题】Java和MySql连接问题【英文标题】:Java and MySql connection problem 【发布时间】: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 驱动程序注册代码 请向我们展示您的代码。我的猜测是您正在为每条记录打开连接,但忘记关闭它(您应该只打开一次,然后使用参数化查询)。 【参考方案1】:几个小时前我遇到了类似的问题。使用默认设置,我可以在单个事务中写入大约 15K 条记录。尝试写更多的东西给了我完全相同的消息(“没有可用的缓冲区空间(达到最大连接数?):连接”)。
然后我将事务分解为 1000 条记录的块(我的应用程序要求允许这样做),并且在第 15 次迭代后我仍然收到了消息。我的应用程序正在努力创建一个新的 EntityManager 并在每次迭代时关闭它。
解决方案是在迭代之间清除该特定类型实体的缓存(您也可以按实体清除缓存)。
EntityManagerFactory.getCache().evictAll 或 evict(...)
【讨论】:
【参考方案2】:似乎连接没有正确关闭。我建议你使用 connection-pooling
另见
Connection pooling with MySQL Connector/J【讨论】:
感谢您的回复,我正在正确打开和关闭连接。如果是这种情况,为什么它适用于前几十万条记录? 错误消息说(maximum connections reached?)
可能是在某些事务连接未正确关闭之后导致结果..
我仔细检查并没有发现连接总数有任何问题。【参考方案3】:
这可能是与 mysql 失去连接或 您的代码无法关闭现有的连接,因为您说它可以用于启动一些记录。如果mysql接受来自其他程序的连接,则增加与mysql的最大连接或尝试与其他程序检查时收到此错误消息。
【讨论】:
【参考方案4】:我遇到了完全相同的问题,每次调用可执行语句后,我都通过connectionname.close();
语句修复了它。
【讨论】:
【参考方案5】:现在可以解决您的问题 :) CommunicationsException
【讨论】:
请在此处发布答案,而不是链接到您的 wordpress以上是关于Java和MySql连接问题的主要内容,如果未能解决你的问题,请参考以下文章