我有一個賬單應用程序,如果客戶已經付款,如果沒有付款,它會觸發一個賬單API,然後更新數據庫中的響應,並在數據庫中進行請求檢查。使用數據庫和URL進行併發處理
當客戶多次點擊「Bill me」按鈕多次發送請求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 ;
}
我真心希望這是代碼沒有被用於實際計費。 – Kayaman
實際上這不是現場,我正在試圖讓一個..讓我知道你的想法。 –
我認爲你對此太缺乏經驗。結算涉及金錢,並且沒有人會將資金信任給無法正確處理交易的軟件。 – Kayaman