Java MYSQL错误连接关闭后不允许操作
我真的被这个问题困住了,所以我很高兴有人能帮我解决这个问题 我用java创建了一个登录页面,并在其中创建了一个MYSQL连接。如果您第一次尝试登录,代码工作正常,但在您注销并再次尝试登录后,我收到以下错误: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作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
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;
}
}