当前位置: 首页 > 知识库问答 >
问题:

Java MYSQL错误连接关闭后不允许任何操作

屠锦
2023-03-14

我真的被这个问题困住了,所以我很高兴有人能帮我!

我用java创建了一个登录页面,并在其中创建了一个MYSQL连接。如果您第一次尝试登录,代码可以正常工作,但是在您注销并再次尝试登录之后,我得到了这个错误:com.mysql.jdbc.exceptions.jdbc4.mysqlnontransientconnectionException:连接关闭后不允许任何操作。

This is my code:
import java.sql.*;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    public static Connection conn = connectionDb.getInstance().getConnection();

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // get username and pass from the html page.
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String userName = request.getParameter("username");
        String password = request.getParameter("userpass");

        // put the username and variables in the getset.
        getset sets = new getset();
        sets.setUserName(userName);
        sets.setPassword(password);

        // send the data to the database 
        try {
            DbManager.Read(sets);
            // if the userinfo is correct following actions will perform:
            if (DbManager.authentication == true) {
                HttpSession session = request.getSession();
                session.setAttribute("user", "");
                // setting session to expiry in 30 mins
                session.setMaxInactiveInterval(30 * 60);
                Cookie username = new Cookie("user", userName);
                response.addCookie(username);
                response.sendRedirect("MyAccount.jsp");
                DbManager.authentication = false;
                // if the userinfo wasn't correct the following actions will perform:
            } else if (DbManager.authentication == false) {
                out.print("<p style=\"color:red\">Sorry username or password error</p>");
                RequestDispatcher rd = request
                        .getRequestDispatcher("login.jsp");
                rd.include(request, response);
            }
            // catches erros.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();//
        } finally {
            if (conn != null) {
                connectionDb.getInstance().close();
            }
        }
    }
}

和DBManager

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;

public class DbManager {

    public static Connection conn = connectionDb.getInstance().getConnection();
    public static boolean authentication;
    public static ResultSet rs;
    public static PreparedStatement pstmt, pstmt1, pstmt2;

    public static void Insert(getset set) throws ClassNotFoundException,
            SQLException {
        try {

            // insert username and password
            String sql = "INSERT INTO logininfo(username, password) VALUES (?,?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, set.getUserName());
            pstmt.setString(2, set.getPassword());
            pstmt.executeUpdate();
            // insert user info
            String sql1 = "INSERT INTO userinfo(fullName, email, dateOfBirth, phoneNumber, companyName, companyEmail, paymentMethod) VALUES (?,?,?,?,?,?,?)";
            pstmt1 = conn.prepareStatement(sql1);
            pstmt1.setString(1, set.getFullName());
            pstmt1.setString(2, set.getEmail());
            pstmt1.setString(3, set.getDateOfBirth());
            pstmt1.setString(4, set.getPhoneNumber());
            pstmt1.setString(5, set.getCompanyName());
            pstmt1.setString(6, set.getCompanyEmail());
            pstmt1.setString(7, set.getPaymentMethod());
            pstmt1.executeUpdate();
            connectionDb.getInstance().close();
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void Read(getset set) throws ClassNotFoundException,
            SQLException {
        try {
            String sql = "SELECT * FROM logininfo where username='"+ set.getUserName() +"' and password='"+ set.getPassword() +"';";
            pstmt2 = conn.prepareStatement(sql);
            System.out.println(set.getUserName());
            rs = pstmt2.executeQuery(sql);

            if (rs.next()) {
                authentication = true;
                connectionDb.getInstance().close();
            } else {
                authentication = false;
                connectionDb.getInstance().close();
            }
            pstmt2.close();
            rs.close();
            conn.close();
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            try {
                if (pstmt2 != null)
                    pstmt2.close();
            } catch (SQLException se2) {
            }
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }
}

and connectionDb
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class connectionDb {

    private static connectionDb instance = null;

    private final String USERNAME = "root";
    private final String PASSWORD = "!i1w2g3w#";
    private final String CONN_STRING = "jdbc:mysql://localhost:3306/mydb";

    private Connection conn = null;

    private connectionDb() {
    }

    public static connectionDb getInstance() {
        if (instance == null) {
            instance = new connectionDb();
        }
        return instance;
    }

    private boolean openConnection() {
        try {
            String driver = "com.mysql.jdbc.Driver";
            try {
                Class.forName(driver).newInstance();
                conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return true;
    }

    public Connection getConnection() {
        if (conn == null) {
            if (openConnection()) {
                System.out.println("Connection Opened");
                return conn;
            } else {
                return null;
            }
        }
        return conn;
    }
        //return conn;
    //}
    public void close(){
        System.out.println("Close connection");
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        conn=null;
    }

}

共有1个答案

陶烨赫
2023-03-14

问题在于连接对象的类级实例化,在解决问题的方法中实例化。此外,在servlet中不应该有连接关闭,从servlet中删除连接的实例化和关闭,因为这段代码应该在db管理器中。

 类似资料:
  • 我已经构建了一个应用程序,使用会话维护。它使用JDBC 当应用程序部署在服务器(Apache Tomcat 6)上时。我可以登录和注销会话。工作完全正常。 现在,我让服务器继续运行24小时。现在,第二天我在输入凭据后尝试登录系统,单击登录按钮,我在网页上看到如下错误:(这是什么原因?) Http状态500 例外 组织。阿帕奇。贾斯珀。JasperException:处理JSP页面/登录时发生异常。

  • 我尝试使用Flyway6.0.beta2BaseJavaMigration和Mysql 出于某种原因,我得到了一个错误 无法回滚事务java.sql.sqlnontransientConnectionException:连接关闭后不允许任何操作。 原因是什么

  • 我正在使用grails 3.3.9构建一个示例hello应用程序。当应用程序被部署时,它工作得很好。当我检查一天左右后,应用程序已经崩溃了。检查日志,我看到一个错误“连接关闭后不允许操作”。看起来mysql数据库连接在某个时候中断了。 下面是我在application.yml中使用的数据库配置 我很欣赏任何关于为什么数据库连接会在一段时间后自动关闭的见解。我该如何预防呢?谢谢你的反馈。

  • 问题内容: 我构建了一个应用程序,并在本地部署了……并且运行良好。我将其部署在远程服务器上,并开始获取主题行中提到的异常。这不是因为防火墙问题。 我更改了通过IP地址而不是本地主机进行连接的方式,现在我在本地部署的应用程序上获得了相同的超时。当我使应用程序运行超过一天时,出现此错误。 我自己提交事务或关闭会话之后,我不执行任何操作。我正在使用以下属性 引起原因:com.mysql.jdbc.exc

  • 我收到这个错误,我不知道为什么: SQLException: ResultSet关闭后不允许操作。错误出现在同时(rs1.next()){ 和consultaPortada方法:

  • 我使用Java应用程序前端与MySQL 5.6服务器上的数据库进行连接和交互。使用MySQL的JDBC连接器时,我遇到了连接到服务器的问题,当连接失败时,服务器没有关闭。调用close()。但当应用程序关闭时,所有连接都会断开。下面是用于进行查询的dao类。 接下来的代码是使用数据库验证应用程序用户的方法。有一些System.out.println()语句在整个过程中跟踪con变量。 运行该方法的