2011-05-17 125 views
1

我正在使用Java + MySql。我正在尝试添加批量数据(大约4000万条记录)。我的应用程序工作正常,几百上千的记录,但之后它开始给我下面的异常:Java和MySql连接问题

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 

我GOOGLE了这个问题,并试图几乎每一个选项(更新Windows注册表,更改my.cnf文件,改变MySQL的全球参数等),但不起作用。

+0

请你可以随意张贴你的jdbc驱动注册码 – developer 2011-05-17 06:00:18

+1

请告诉我们你的代码。我的猜测是,你打开每个记录的连接,但忘记关闭它(你应该只打开一次,然后使用参数化查询)。 – Bobby 2011-05-17 07:35:12

回答

1

看来连接没有正确关闭。我建议你用c onnection-pooling

请参见

+0

感谢您的回复,我正确地打开和关闭连接。如果是这种情况,那么为什么它可以用于前几十万条记录呢? – user751637 2011-05-17 05:56:57

+1

错误消息说'(最大连接到达?)'可能在一些事务连接没有被正确关闭,所以结果.. – 2011-05-17 06:00:33

+0

我仔细检查,并没有发现任何连接总数的问题。 – user751637 2011-05-17 06:12:49

-1

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

+0

不行,它不起作用。 – user751637 2011-05-17 06:10:15

+0

plz在这里发布答案,而不是链接到你的wordpress – 2014-07-22 07:57:48

0

这可能是既可能失去连接用mysql或 你的代码无法关闭现有的connet正如你所说,它启动一些记录的工作。所以增加与mysql的最大连接或尝试检查与其他程序时,如果你得到这个错误消息,如果mysql接受来自其他程序的连接。

2

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

然后,我分解了1000个记录块(我的应用程序需求允许它)的交易,并且在第15次迭代后我仍然收到了该消息。我的应用程序正在努力创建一个新的EntityManager,并在每次迭代中关闭它。

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

EntityManagerFactory.getCache()。evictAll或逐出(...)

0

我有完全相同的问题,我的每一个可执行语句被称作时间后固定它通过connectionname.close();声明。