2011-05-17 103 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();聲明。