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

Java MYSQL错误连接关闭后不允许操作,java,mysql,eclipse,database-connection,Java,Mysql,Eclipse,Database Connection,我真的被这个问题困住了,所以我很高兴有人能帮我解决这个问题 我用java创建了一个登录页面,并在其中创建了一个MYSQL连接。如果您第一次尝试登录,代码工作正常,但在您注销并再次尝试登录后,我收到以下错误: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作 This is my code: import java.sql.*; import java.io.IOException

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

我用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();
            }
        }
    }
}

问题在于连接对象的类级实例化,在将解决问题的方法中实例化。此外,servlet中不应存在正在接近的连接,请从servlet中删除实例化并关闭连接,因为此代码应在db manager中。

粘贴完全可读的堆栈跟踪格式化。还有你得到异常的相关代码。看到你代码中的所有静态了吗?他们都得走了。当你学习了足够多的正确的Java编程和代码设计,不需要创建一个静态的地狱,您会发现,您当前的问题似乎神奇地消失了。如果我们删除静态,它只会显示更多的错误。我删除了一些错误,但现在只剩下:java.lang.Error:未解决的编译问题:无法对非静态方法getInstance()进行静态引用从类型connectionDb无法静态引用非静态字段DbManager.authentication无法静态引用非静态字段DbManager.authentication无法静态引用非静态字段DbManager.authentication能否请您举例说明我们如何做到这一点?是的,当然……请列出登录、保存数据库等步骤,这样可以帮助您解决问题。您是指我们如何登录的步骤吗?1.我们转到login.jsp2。我们输入登录信息并按下登录按钮3。然后,登录servlet启动并创建到数据库的连接,以检查userinfo 4。然后连接关闭5。直到这里一切都很好。6.但是,如果您重新执行此过程,我们会得到一个错误com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作。我将向您提供步骤1-在登录管理器类validateUser中创建两个方法,第二个是loginsUser方法将从db manager类中获取连接对象,并确保在同一方法中关闭连接。这将解决此问题
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;
    }

}