如何关闭java中的dao

如何关闭java中的dao,java,spring,performance,dao,Java,Spring,Performance,Dao,在这段代码中,我需要关闭dao。调用daoClose()方法。但我什么时候能打电话给它,在哪里?这是最有效的。 我需要确定哪个连接已经挂起,然后关闭它。如何抓住这一刻 public class UserController extends HttpServlet { private static final long serialVersionUID = 7589862078860584987L; private static String INSERT_OR_EDIT = "/user.jsp

在这段代码中,我需要关闭dao。调用daoClose()方法。但我什么时候能打电话给它,在哪里?这是最有效的。 我需要确定哪个连接已经挂起,然后关闭它。如何抓住这一刻

public class UserController extends HttpServlet {
private static final long serialVersionUID = 7589862078860584987L;
private static String INSERT_OR_EDIT = "/user.jsp";
private static String LIST_USER = "/listUser.jsp";
private UserDao dao;

private long begin = System.nanoTime ();



public UserController() {
    super();
    dao = new UserDao();
} 



private void delete(HttpServletRequest request, HttpServletResponse response) {
     int userId = Integer.parseInt(request.getParameter("userId"));
     dao.deleteUser(userId);
     request.setAttribute("users", dao.getAllUsers());
}

private void edit(HttpServletRequest request, HttpServletResponse response) {
     int userId = Integer.parseInt(request.getParameter("userId"));
     User user = dao.getUserById(userId);
     request.setAttribute("user", user);
}

private void listUsers(HttpServletRequest request, HttpServletResponse response) {
     request.setAttribute("users", dao.getAllUsers());
}


private void common (HttpServletRequest request, HttpServletResponse response) {

    String forward="";
    String action = request.getParameter("action");

    if (action.equalsIgnoreCase("delete")){
        delete(request, response);
        forward = LIST_USER;
    } else if (action.equalsIgnoreCase("edit")){
        forward = INSERT_OR_EDIT;
        edit(request, response);
    } else if (action.equalsIgnoreCase("listUser")){
        forward = LIST_USER;
       listUsers(request, response);
    } else {
        forward = INSERT_OR_EDIT;
    }

    RequestDispatcher view = request.getRequestDispatcher(forward);
    try {
        view.forward(request, response);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }



}
private void commonSec( HttpServletRequest request, HttpServletResponse response) {

    User user = new User();
    user.setFirstName(request.getParameter("firstName"));
    user.setLastName(request.getParameter("lastName"));
    try {
        Date dob = new SimpleDateFormat("MM/dd/yyyy").parse(request.getParameter("dob"));
        user.setDob(dob);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    user.setEmail(request.getParameter("email"));
    String userid = request.getParameter("userid");
    if(userid == null || userid.isEmpty())
    {
        dao.addUser(user);
    }
    else
    {
        user.setUserid(Integer.parseInt(userid));
        dao.updateUser(user);
    }

    RequestDispatcher views = request.getRequestDispatcher(LIST_USER);
    listUsers(request, response);
    try {
        views.forward(request, response);
    } catch (ServletException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    common(request, response);
    System.out.println(delta);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    commonSec(request, response);
    System.out.println(delta);

 }

private void daoClose() {

    dao.closeCn();
    System.out.println("run");
}

private long end = System.nanoTime ();
private long delta = end - begin;




 }
在这段代码中,我需要关闭dao。调用daoClose()方法。但我什么时候能打电话给它,在哪里?这是最有效的。 我需要确定哪个连接已经挂起,然后关闭它。如何抓住这一刻

public class UserController extends HttpServlet {
private static final long serialVersionUID = 7589862078860584987L;
private static String INSERT_OR_EDIT = "/user.jsp";
private static String LIST_USER = "/listUser.jsp";
private UserDao dao;

private long begin = System.nanoTime ();



public UserController() {
    super();
    dao = new UserDao();
} 



private void delete(HttpServletRequest request, HttpServletResponse response) {
     int userId = Integer.parseInt(request.getParameter("userId"));
     dao.deleteUser(userId);
     request.setAttribute("users", dao.getAllUsers());
}

private void edit(HttpServletRequest request, HttpServletResponse response) {
     int userId = Integer.parseInt(request.getParameter("userId"));
     User user = dao.getUserById(userId);
     request.setAttribute("user", user);
}

private void listUsers(HttpServletRequest request, HttpServletResponse response) {
     request.setAttribute("users", dao.getAllUsers());
}


private void common (HttpServletRequest request, HttpServletResponse response) {

    String forward="";
    String action = request.getParameter("action");

    if (action.equalsIgnoreCase("delete")){
        delete(request, response);
        forward = LIST_USER;
    } else if (action.equalsIgnoreCase("edit")){
        forward = INSERT_OR_EDIT;
        edit(request, response);
    } else if (action.equalsIgnoreCase("listUser")){
        forward = LIST_USER;
       listUsers(request, response);
    } else {
        forward = INSERT_OR_EDIT;
    }

    RequestDispatcher view = request.getRequestDispatcher(forward);
    try {
        view.forward(request, response);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }



}
private void commonSec( HttpServletRequest request, HttpServletResponse response) {

    User user = new User();
    user.setFirstName(request.getParameter("firstName"));
    user.setLastName(request.getParameter("lastName"));
    try {
        Date dob = new SimpleDateFormat("MM/dd/yyyy").parse(request.getParameter("dob"));
        user.setDob(dob);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    user.setEmail(request.getParameter("email"));
    String userid = request.getParameter("userid");
    if(userid == null || userid.isEmpty())
    {
        dao.addUser(user);
    }
    else
    {
        user.setUserid(Integer.parseInt(userid));
        dao.updateUser(user);
    }

    RequestDispatcher views = request.getRequestDispatcher(LIST_USER);
    listUsers(request, response);
    try {
        views.forward(request, response);
    } catch (ServletException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    common(request, response);
    System.out.println(delta);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    commonSec(request, response);
    System.out.println(delta);

 }

private void daoClose() {

    dao.closeCn();
    System.out.println("run");
}

private long end = System.nanoTime ();
private long delta = end - begin;




 }

为了确保无论成功/失败都关闭dao,您可以使用
finally

范例

try {
    // use your dao
} catch (Exception e) {
    // handle error
} finally {
    daoClose();
}

finally块中的任何代码都保证运行,因此无论是否发生错误,您都可以确保dao在最后关闭

最好使用
try(UserDao=new UserDao())
,不要将其作为类的成员,因为它不会是线程安全的。我建议您多读一点关于交易的知识,并遵循开始学习时的常规方式。

请参阅。我有一个dao连接。我转向servlet并做一些事情,然后我再次转向servlet,一个新的连接已经发生,有一个很大的负载,如果每次连接关闭,那么这是对资源的浪费,需要另一种方法。当连接不再使用时,应计算并关闭连接。如何做?如何抓住连接未被使用的时刻?您建议事务如何在此处应用它们?我如何使用HttpSessionListener?我建议您遵循一些标准的hello world MVC控制器、dao、服务类型教程,遵循该模式,然后您将不需要处理任何类似的资源。请参阅。我有一个dao连接。我转向servlet并做一些事情,然后我再次转向servlet,一个新的连接已经发生,有一个很大的负载,如果每次连接关闭,那么这是对资源的浪费,需要另一种方法。当连接不再使用时,应计算并关闭连接。如何做?如何抓住连接未被使用的时刻?我如何使用HttpSessionListener?正如您标记spring一样,请简要介绍一下dao层。作为编码标准的一部分,应该自动调用close。你不必明确地称呼它。使用SpringJPA,它会自动为您实现这一点。或者至少尝试阅读有关自动关闭接口的内容。