生产中与数据库错误的通信

时间:2016-06-11 03:10:41

标签: java mysql jdbc

我做了一些在生产中部署的网络应用程序。但几个小时后(看起来像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 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。 任何帮助都非常感激。

3 个答案:

答案 0 :(得分:1)

以下情况可能会发生此问题:

  1. 当我们尝试获取太多数据库连接时。
  2. 当数据库连接空闲很长时间时。
  3. 因此,在您的程序中尝试在使用后关闭连接,并获得新连接。

答案 1 :(得分:0)

这在您的代码中显示以下行的异常:

at controller.GetAllClients.processRequest(GetAllClients.java:39)
at controller.GetAllClients.doGet(GetAllClients.java:73)

可能导致此异常的原因是,一旦获取和使用,可能不会关闭连接。

在任何计算机系统中,可用于连接的插座数量有限,这在很大程度上取决于您用于连接的硬件规格和驱动程序。

与数据库的连接在资源和性能方面具有高成本。每次想到连接数据库时都必须注意这一点。

现在假设一个情况,你有5辆自行车和7名车手,所有车手都需要一辆自行车,所以你可以为每个车手分配1辆自行车,但只有5名车手,那么休息2呢?所以现在唯一的选择是等待任何两个完成骑行并返回自行车的骑手,以便你可以将它分配到其他两个......但在你的情况下,前5个拿走自行车(连接到数据库),完成他们的骑行(对数据库执行他们的查询)但没有返回自行车(没有关闭连接)。

同样,在你的情况下,它被分配但在使用后没有被释放,而占据了所有可用的套接字,并且没有套接字可用于提供连接。

我认为你正在追赶"连接" (通过getConnection()方法返回)在" con" 变量中。

现在,

con.close();

只有这一点需要写在那里。

还有一件事,目前所有套接字都被占用,你需要重新启动数据库服务器(MySQL等)和项目服务器(Tomcat等)。在数据库使用结束后,在任何地方添加以上1行代码。

答案 2 :(得分:0)

好友,在FILE

中添加连接中的端口号(3306)