1樓:匿名使用者
dao 在訪問 sessionfactory 的時候都不得不在多個資料來源中不斷切換,問題就出現了:如何讓 sessionfactory 在執 行資料持久化的時候,根據客戶的需求能夠動態切換不同的資料來源?我們能不能在 spring 的框架下通過少量修改得到解決?
是否有什麼設計模式可以利用 呢?
問題的分析。
我 首先想到在 spring 的 applicationcontext 中配置所有的 datasource 。這些 datasource 可能是各種 不同型別的,比如不同的資料庫: oracle 、 sql server 、 mysql 等,也可能是不同的資料來源:
比如 apache 提供的 、 spring 提供的 等。然後 sessionfactory 根據客戶的 每次請求,將datasource 屬性設定成不同的資料來源,以到達切換資料來源的目的。
但 是,我很快發現乙個問題:當多使用者同時併發訪問資料庫的時候會出現資源爭用的問題。這都是「單例模式」惹的禍。
眾所周知,我們在使用 spring 框架 的時候,在 beanfactory 中註冊的 bean 基本上都是採用單例模式,即 spring 在啟動的時候,這些 bean 就裝載到記憶體中, 並且每個 bean 在整個專案中只存在仔巨集乙個物件。正因為只存在乙個物件,物件的所跡祥有屬性,更準確說是例項變數,表現得就如同是個靜態變數(實際上「靜 態」與「單例」往往是非常相似的兩個東西,我們常常用「靜態念州冊」來實現「單例」)。拿我們的問題來說, sessionfactory 在整個專案中只有一 個物件,它的例項變數 datasource 也就只有乙個,就如同乙個靜態變數一般。
如果不同的使用者都不斷地去修改 datasource 的值,必然 會出現多使用者爭用乙個變數的問題,對系統產生隱患。
2樓:網友
我自己用的是hibernate+tomcatjdbc,通過spring管理。
為什麼用spring來管理hibernate
3樓:最愛寂寞的刺蝟
可以看出,hibernate操作的步驟如下:
1.獲得configuration物件。
2.建立sessionfactory
3.建立session
4.開啟事務。
5.進行持久化操作。比如上面的新增使用者操作。
6.提交事務。
7.發生異常,回滾事務。
8.關閉事務。
使用hibernate進行訪問持久層,每次都要進行這八個步驟。但是若使用spring對hibernate進行管理,又是怎麼樣的呢?
首先,spring對hibernate提供了hibernatetemple類。這個模版類對session進行封裝。並且spring會預設為自動提交事務。
所在在dao層直接寫入即可。
在實踐中,遇到了乙個問題,無法插入資料庫,經過一番折騰,多次實驗,驗證,總結一下原因,結果如下:
注意:所有的操作都必須在事務中進行。若單純的使用hibernate,則事務需要手動開啟提交關閉操作。當然也可以在hibernate配置檔案中,自動提交。
若使用spring管理hibernate,則預設的是自動提交事務。但是在此,需要注意的是:若使用spring在配置檔案中配置資料來源而不使用,則可以成功插入資料庫,因為hibernatetemple預設提供自動提交事務。
在spring的配置檔案配置資料來源如下:使用此資料來源需要的jar如下:,update
- 如果採用傳統的的方式,可以採用如下方式來簡化註冊的步驟,並且class為localsessionfactorybean-->
4樓:感性的熱一天
為什麼要用spring來管理hibernate呢?我們可以參考以下步驟。 首先我們來看一下hibernate進行操作的步驟。
比如新增使用者的乙個步驟。在此為了解釋提出的問題,只做乙個截圖,若想看完整**示例。
為什麼用spring來管理hibernate
5樓:福喜
update
若spring中不是直接配置資料來源,而是使用,則是無法若直接,則無法插入資料庫中,但是可以儲存中快取中。因為所有的操作都是在事務中執行的,而資料來源則預設是不是自動提交的。解決的辦法如下:
可以在中填寫:
true以下spring使用資料來源。
html] view plaincopyprint?
以上,介紹了spring來管理hibernate的好處在於,不用手動建立sessionfactory,session,不用手動開啟提交關閉事務,這一切完全都是由spring來管理。並且spring還提供了hibernatetemple的工具,使一切操作簡單方便。
dao層在spring配置檔案中配置如下:
html] view plaincopyprint?