Java 生产中与数据库的通信错误
我在生产中部署了一些web应用程序。但几个小时后(看起来像8小时),我无法与DB通信 这是我的Connect.javaJava 生产中与数据库的通信错误,java,mysql,jdbc,Java,Mysql,Jdbc,我在生产中部署了一些web应用程序。但几个小时后(看起来像8小时),我无法与DB通信 这是我的Connect.java package util; import java.sql.Connection; import java.sql.DriverManager; import javax.xml.ws.Response; public class Connect { public static Connection connection = null; public st
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.xml.ws.Response;
public class Connect {
public static Connection connection = null;
public static Connection getConnection() {
if (connection != null) {
return connection;
} else {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost/DBPRK?autoReconnect=true&useUnicode=true&characterEncoding=utf8";
String username = "prk";
String password = "prk";
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
System.out.println("ERROR");
}
return connection;
}
}
}
下面是我从tomcat日志中得到的错误消息:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Software caused connection abort: socket write error
STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2616)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2547)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1512)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1622)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2370)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1183)
at controller.GetAllClients.processRequest(GetAllClients.java:39)
at controller.GetAllClients.doGet(GetAllClients.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)
** END NESTED EXCEPTION **
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2634)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2547)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1512)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1622)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2370)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1183)
at controller.GetAllClients.processRequest(GetAllClients.java:39)
at controller.GetAllClients.doGet(GetAllClients.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)
顺便说一句,我使用纯jsp,没有框架。
非常感谢您的帮助。在以下情况下可能会出现此问题:
因此,在您的程序中,尝试在使用后关闭连接,并获得一个新连接。这将在代码中的以下行显示异常:
at controller.GetAllClients.processRequest(GetAllClients.java:39)
at controller.GetAllClients.doGet(GetAllClients.java:73)
导致此异常的原因可能是,在获取和使用连接后,您可能没有关闭连接
在任何计算机系统中,可用于连接的插座数量有限,这在很大程度上取决于硬件规格和用于连接的驱动程序
与数据库的连接在资源和性能方面成本很高。每次考虑连接到数据库时,都必须注意这一点
现在假设一种情况,你有5辆自行车和7名骑手,所有骑手都需要一辆自行车,所以你可以为每个骑手分配1辆自行车,但最多只能分配5名骑手,那么剩下的2名呢?。所以现在唯一的选择是等待任何两个车手完成他们的骑行并归还自行车,这样你就可以把它分配给其他两个车手。。。但在您的案例中,前5名拿走了自行车(连接到数据库),完成了骑行(执行对数据库的查询),但没有返回自行车(未关闭连接)
同样,在您的情况下,它正在分配,但在使用后不会释放,这反过来会占用所有可用的套接字,并且没有可用的套接字来提供连接。
我假设您正在捕获“con”变量中的“connection”(由getConnection()
方法返回)
现在,
只是这需要写在那里
还有一件事,目前所有套接字都已被占用,您需要重新启动数据库服务器(MySQL等)和project server(Tomcat等)。数据库使用结束后,在所有位置添加以上1行代码。伙计,在
字符串Url中的连接中添加端口号(3306)当出现异常时,您是否能够从cmd或任何其他客户端连接到DB?是否已检查到运行DB服务器的机器的网络连接?如果您没有收到此信息,请让我知道。。我会尝试用不同的方式帮助你。。。祝你有一个愉快的一天…事实上你使用了一个报价块,这表明你是从另一个来源复制的,请添加一个链接到该来源。如果这是你自己的文本,是专门为这个问题写的,那么不要使用引号块。@MarkRotterveel Dude,我是StackOverflow.com的新手,所以如果这是你所说的写作方式,我会注意下一次。这些是我的文字,当我键入Stackoverflow.com时,我会建议这样的事情来抓住读者的注意力,以便快速阅读要点。@MarkRotteveel我不相信抄袭。哈哈哈。。。谢谢你,伙计。@ManojShukla我已经试过conn.close()。但它会导致其他问题。当我这样做的时候,我收到一条错误消息,上面写着“连接关闭后不允许操作”是的,连接长时间处于绝对空闲状态。如何获得到DB的新连接?在每个方法中使用后关闭DB连接,并在需要再次与DB通信时调用Connect.getConnection()以获得新连接。
con.close();