Java和MySql连接问题

标签 java mysql database jdbc connection

我正在使用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 全局参数等)但它不起作用。

最佳答案

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

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

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

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

关于Java和MySql连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6026772/

相关文章:

java - 使用 CMD 脚本安装 Java

php - SHOW COLUMNS 与预准备语句和 LIKE 一起使用时返回错误

mysql - elastic beanstalk docker app无法连接到mysql

database - connectionstring 和 dsn 有什么区别?

java - sessionfactory.openSession() 和 sessionfactory.openStatelessSession() 的区别?

java - java包和目录之间是否存在一对一的关系?

mysql - Liquibase介绍现有项目和MySQL

database - 在 Django 中存储具有昵称的匿名用户的优雅方式?

ios - 如何在 Realm 中创建 NSData 对象的可选列表(数组)?

java - 如何使用java在for循环中获取当前和下一个arraylist索引