2016-11-29 70 views
0

我有一個轉移表,其中用戶可以從一個人正在使用Spring MVC中使用Hibernate創建Web services.I上午理解匯款到another.I一個應用程序,當多個人通過相同的web服務發送請求,多個線程會被調度servlet.Now它每個線程將被創建以進去控制器定義class.Now我有我已與控制器類自動裝配一個daoImplementation類相應的web方法。現在,每個請求線程將使用autowired daoImplementation對象來訪問daoImplementation類方法。 現在,我的第一doubt- 如何一個daoImplementation對象(其單)可以處理多個請求?如果假設千人發送請求需要訪問daoImplementation類方法僅需10秒,每個請求然後第1000請求延遲將是10000秒。如何會話處理多個請求用SpringMVC與和hiberate

現在,之後,請求去了daoImplementation方法,將做數據庫工作。在daoImplementation類我有自動裝配SessionFactory也是單身和線程安全(這意味着每個請求它將創建一個會話線程)。在我的方法我正在創建會話對象來完成我的事務。 現在我的第二doubt- 假設萬人試圖訪問同樣的方法在daoImplementation類,所以1000會話對象將是這些created.How千個對象將與數據庫進行交互,這樣就會出現在每個請求,以及如何沒有多少延遲數據庫將保持一致性? 同樣會是線程安全的,它會如何影響我的系統。現在

我的第三個doubt- 對於轉移,首先我需要得到目前在發件人帳戶的電流量,然後檢查是否是小於,他是想轉移到接收器賬戶的金額,然後從扣除多少金額發件人帳戶,然後添加量多的接收器帳戶,然後關閉session.Being一個初學者,我會寫我的代碼像這個 -

public class CommonDAOImpl{ 
    private SessionFactory sessionFactoryCommon; 
    public void setSessionFactoryCommon(SessionFactory sessionFactoryCommon) { 
     this.sessionFactoryCommon = sessionFactoryCommon; 
     System.out.println("SessionFactory is set"); 
    } 
    public void addMoney(String userId,double amount) { 
     Session session = this.sessionFactoryCommon.openSession(); 
     try{ 
      String hqlQuery = "HQL query to update Amount Table where userId = userId"; 
      session.createQuery(hqlQuery).executeUpdate(); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      session.close(); 
     } 
    } 
    public void transferMoney(String fromUserId, String toUserId, double amount) 
    { 

     Session session = null; 
     try 
     { 
      session = this.sessionFactoryCommon.openSession(); 
      query = "HQL query to get previous amount from sender account"; 
      double prevSenderamount = (double) query.uniqueResult(); 
     if(prevAmount>=amount) 
     { 
     String query1 = "HQL query to update sender account"; 
     session.createQuery(hqlQuery).executeUpdate(); 
     String query1 = "HQL query to get previous amount from receiver account"; 
     double prevReceiveramount = (double) query.uniqueResult(); 
     String query3 = "HQL query to update receiver account"; 
     session.createQuery(hqlQuery).executeUpdate(); 
     } 
     else 
     { 
     throw myException("Insufficient Amount"); 
     } 

      System.out.println("1. Employee save called without transaction, id="+id); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("Exception Block"); 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      session.close(); 
     } 
    } 
} 

是做數據庫調用這個正確的方式? 請嘗試用簡化的方式解釋 - 提前致謝。

回答

1

如何一個daoImplementation對象(其單)可以處理多個請求?如果假設千人發送請求需要訪問daoImplementation類方法僅需10秒,對於每個請求,然後爲1/1000請求的延遲將是10000秒。

不,因爲線程的原理是它們同時執行。 DAO方法不應該同步,因此線程會同時愉快地調用您的DAO,就像控制器一樣。

在daoImplementation類我已經自動裝配的SessionFactory這也是單身人士和線程安全的(這意味着每個請求將創建一個會話線程)

號這只是意味着所有的線程可以使用相同的SessionFactory實例併發沒有任何問題。不會創建額外的線程。

假設萬人試圖訪問同樣的方法在daoImplementation類,所以1000會話對象將是這些created.How千個對象將與數據庫進行交互,這樣就會出現在每個請求,以及如何DATABSE沒有太大的延遲會保持一致性嗎?會話也是線程安全的,它將如何影響我的系統。

數據庫使用其ACID屬性確保所有事務都是隔離的,並且是並行運行的。會話不是線程安全的,但這不是問題,因爲每個線程都使用自己的會話,而不是與其他線程共享。現在

,關於你的代碼,不,它不會做正確的事:

  • 你不應該打開並自行關閉會話。相反,你只需要詢問當前的會話,哪個Spring爲你打開和關閉,哪些綁定到當前事務。
  • 您通常不應該使用Hibernate的更新查詢。只需獲取實體,修改它們,Hibernate就會爲你保存它們的狀態。這就是使用ORM的全部原則。
+0

嗨JB ...你可以舉一些例子,它可以通過休眠來實現數據庫調用的最佳方式。 – RHUL