2015-12-14 12 views
-1

我正在使用JPA/HIBERNATE來管理我的mysql數據庫(請參閱&寫),同一個數據庫被其他應用程序使用(只讀)。 我想要做的是:雖然我編輯我的數據庫在Java(休眠)我希望所有其他應用程序可以讀取舊值,當我的程序完成時,我想切換到程序修改的新值。如何通過Hibernate在java中使用它時鎖定對數據庫的訪問?

我該怎麼做?

下面是代碼

public static Integer (Equipment equipment) 
     { 
      Session session = factory.openSession(); 
      Transaction tx = null; 
      Integer equipementID = null; 
      try{ 
       tx = session.beginTransaction(); 
       equipementID = (Integer) session.save(equipment); 
       tx.commit(); 
      }catch (ConstraintViolationException e) { 
       if (tx!=null) tx.rollback(); 
      }finally { 
      } 
      return equipementID; 
     } 


    public static void parseFile (String filePath1) throws IOException 
      { 
      Scanner s1 = new Scanner(new File(filePath1)); 
      s1.useDelimiter("\\s*fish\\s*"); 

      while (s1.hasNextLine()) 
      { 
       Scanner s2 = new Scanner (s1.nextLine()); 
       s2.useDelimiter(";"); 

       while (s2.hasNext()) { 
        String hostName = s2.next(); 
        int asNum=s2.nextInt(); 
        String type=s2.next(); 
        String addrIp=s2.next(); 
        String vendor=s2.next(); 
        String model=s2.next(); 
        String version=s2.next(); 
        String function=s2.next(); 
        String usage=s2.next(); 

        if (asNum==3215) 
         addEquipmentToDatabase(new Equipment(hostName,0,addrIp,"ftipnn",asNum,model,type,vendor,function,usage,version,1,0)); 
else 
        updateEquipment(equipment,new Equipment(hostName,0,addrIp,"domain",asNum,model,type,vendor,function,usage,version,1,0)); 
      } 


       } 
       s2.close(); 
      } 
      s1.close(); 
      } 



    public static void updateEquipment (Equipment actualEquipment,Equipment newEquipment) 
     { 
      Transaction tx = session.beginTransaction(); 
      Query query = session.createSQLQuery("UPDATE equipment SET hostName = '"+newEquipment.getHostName()+"'," 
                    +"parity= '"+newEquipment.getParity()+"'," 
                    +"addrIP= '"+newEquipment.getAddrIP()+"'," 
                    +"domainExtension= '"+newEquipment.getDomainExtension()+"'," 
                    +"asNum= '"+newEquipment.getAsNum()+"'," 
                    +"model= '"+newEquipment.getModel()+"'," 
                    +"type= '"+newEquipment.getType()+"'," 
                    +"vendor ='"+newEquipment.getVendor()+"'," 
                    +"function= '"+newEquipment.getFunction()+"'," 
                    +"utilization= '"+newEquipment.getUtilization()+"'," 
                    +"version= '"+newEquipment.getVersion()+"'," 
                    +"idSite= '"+newEquipment.getIdSite()+"'," 
                    +"idProfile= '"+newEquipment.getIdProfile()+"' "+ 
                    "WHERE hostName LIKE '"+actualEquipment.getHostName()+"'") ; 
      query.executeUpdate(); 
      tx.commit(); 
     } 
+1

請分享您迄今使用過的任何代碼。看到這裏:http://stackoverflow.com/help/mcve – AGE

+1

我加入了一個操縱數據庫的代碼的例子。 – Marouane

回答

1

你描述的涉及將適當ISOLATION水平。

有四種不同類型的隔離級別:

  • 讀未提交
  • 讀取已提交
  • 重複讀
  • 序列化

大多數數據庫通常執行讀犯下默認情況下,這意味着由anoth改變呃事務在任何其他查詢中都不可見,直到該事務已經提交了它的工作,但是允許讀取現有的(沒有更改的數據)。

提交讀取的缺點是,如果一個事務正在更改足夠的行,那麼這些鎖可以升級到更高級別(頁面或表)並導致性能瓶頸問題。這通常是爲什麼建議在批量操作期間執行小的提交點以防止表被鎖定以進行其他事務。

MySQL是有點不同,因爲它的默認值是可重複讀取

betweeen 重複的差異讀取提交讀是MySQL將保留讀取鎖,直到事務結束在那裏,其他數據庫會立即釋放一個讀鎖上的資源。換句話說,如果讀取應用程序執行長時間運行的事務,則其他應用程序的讀取操作可能會影響您在寫入應用程序中的寫入能力,反之亦然。

+0

謝謝 這是一個屬性,我應該添加hibernate的屬性? – Marouane

+0

可以在數據庫中配置隔離級別(如果您想要更改整個數據庫的全局狀態),或者在創建它時在單個事務中配置隔離級別。這與hibernate無關。 – Naros

+0

謝謝,這非常有幫助! – Marouane

相關問題