JDBC ERROR:08S01有时会发生

时间:2011-06-25 21:15:24

标签: java mysql multithreading jdbc

  

SQLState relac:08S01,thread:0

     

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通讯链接失败

     

成功发送到服务器的最后一个数据包是0毫秒前。驱动程序未收到来自服务器的任何数据包。   ...更多

     

引起:java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?):connect       at java.net.PlainSocketImpl.socketConnect(Native Method)       在java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)       在java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)       在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)       在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)       在java.net.Socket.connect(Socket.java:529)       在java.net.Socket.connect(Socket.java:478)       在java.net.Socket。(Socket.java:375)       在java.net.Socket。(Socket.java:218)       在com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)       在com.mysql.jdbc.MysqlIO。(MysqlIO.java:294)       ......还有20个

我使用N个线程,有时不会在特定时间(X分钟)

我尝试使用不同的驱动程序,但我无法解决问题。

2 个答案:

答案 0 :(得分:2)

你最有可能

  1. 打开套接字而不是关闭它们。随着时间的推移,打开的套接字的数量变得太大,应用程序崩溃。
  2. 你同时打开太多套接字。也许是因为你有很多线程。
  3. 我猜它是#1。仔细检查您的代码并确保关闭所有Connection对象和ResultSet对象。

    如果您遇到#2,那么您可能需要考虑使用更少的线程(在某个点上有太多线程弊大于利)或使用像c3p0这样只会创建的连接池一组连接并允许您的线程共享它们。一般来说,使用c3p0是一个好主意,也应该允许你更快地检测#1。

    第三种选择是使用更高级别的抽象,例如JPA或JDO,它将为您处理连接管理。

答案 1 :(得分:0)

在我的例子中,我们使用基于JbossSeam框架的JBoss服务器上的MsSQL服务器和应用程序。 此错误是由于hibernate和hsqldb的版本不匹配造成的。尝试更新两个库的最新版本和错误将消失。例如在maven下面,hibernate 4.3.6.Final与hsqldb 2.2.9完全兼容。 这种方式帮助了我们