【发布时间】:2015-11-10 21:14:28
【问题描述】:
我有一个计费应用程序,如果客户已经付款,它会在数据库中进行请求检查,如果没有付款,它会点击计费 API,然后更新数据库中的响应。
当客户通过单击“计费”按钮 3-4 次多次发送请求时,我遇到了问题。所有请求都以毫秒为单位到达服务器。结果,客户被多次收费,因为结果没有得到更新,因为第一个请求需要一些时间,同时第二个请求从数据库中读取状态并再次进行收费。下面是代码。请让我知道我应该遵循哪些最佳实践来防止这种情况发生。我试过制作servlet SingleThreadModel,但没有帮助
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
String mobilenumber = request.getParameter("mobilenumber");
String param2 = request.getParameter("param2");
String checkifthecustomerischarged = checkifcharge(mobilenumber);
if (checkifthecustomerischarged.equals("NOTOK")) {
String status = hittocharge(mobilenumber, param2);
int i = updatestatus(mobilenumber, status);
if (i > 0) {
out.println("Status Updated ");
} else {
out.println("Status Not update Updated ");
}
} else {
out.println("Already Charged");
}
}
}
我在这里查看表格
private String checkifcharge(String mobilenumber) {
String st = "NOTOK" ;
try {
Connection conn = null ;
ResultSet rs = conn.createStatement.executeQuery("select sno from table where mobilenumber = "+mobilenumber);
if(rs.next()){
st = "OK";
}
} catch (Exception e) {
e.printStackTrace();
}
return st ;
}
我在这里更新状态
private int updatestatus(String mobilenumber, String status) {
int st = 0 ;
try {
Connection conn = getConnection() ;
st = conn.createStatement.executeQuery("update table set status =1 where mobilenumber ="+mobilenumber);
releaseConnection(conn);
} catch (Exception e) {
e.printStackTrace();
}
return st ;
}
【问题讨论】:
-
我真诚地希望这是代码不用于实际计费。
-
实际上这不是现场直播,我正在尝试制作一个.. 让我知道您对此的想法。
-
我觉得你太缺乏经验了。计费涉及金钱,没有人会相信不能正确处理交易的软件。
标签: java concurrency