2013-01-18 67 views
1

我應該在哪裏打開和關閉與存儲庫的連接?在文章「Dont repeat the DAO」記載:DAO和連接

的DAO不負責處理事務,會話或 連接。這些都在DAO之外進行處理以實現靈活性。

但有人建議我將@Resource DataSource對象注入DAO類並處理DAO方法中的所有連接......即,每個CRUD操作應打開並關閉與存儲庫的連接。

+0

我們不管理DAO內部的連接,因爲您可以有多個DAO使用同一個打開的連接來獲取實體。 –

回答

0

我個人使用Spring來管理數據源。

在您的應用程序上下文xml中配置數據源bean。將它自動裝入DAO,然後使用Spring處理DAO類中@Transactional批註的事務。

您的應用程序上下文中還需要<tx:annotation-driven/>

如果您使用的是Hibernate,您可以在應用程序上下文中配置SessionFactory

+0

對不起,但我不使用也不是春眠不休眠 – MyTitle

+0

DAO不應該負責處理連接,但它取決於他們。 @MyTitle如果你不使用Spring或Hibernate,那麼你必須在業務邏輯層處理這些連接以處理事務。從數據源獲取一個連接後,業務層組件會將其傳遞到您的DAO中。實際上Spring已經提供了一些方便的XXXDAOSupport類,它對於datasouce非常有效。 –

+0

@GavinXiong謝謝,在您發表評論後,我更清楚地瞭解這一過程。第二個問題(可能不太明確):使用EJB作爲DAO對象怎麼樣?然後在另一個EJB(即服務層)中重用這個DAO(實際上是EJB)。 – MyTitle

3

採取文章的建議。

最好你希望你的應用程序容器管理資源和連接池。如果您的連接已配置事務管理,那麼容器將能夠管理您的事務(因此不需要打開連接並進行提交)。

如果您要自己管理連接和事務,請首先打開連接,啓用事務並將打開的連接傳遞給DAO,提交事務,然後關閉連接(在DAO之外)。

一旦你的服務完成所有的DAO,關閉連接。

希望這會有所幫助。

+0

是的,我自己管理交易,連接。首先打開連接,啓用事務並將打開的連接傳遞給DAO。 - 我可以在服務層做這件事嗎?或者我需要創建一些包裝類來隱藏所有底層機制(打開連接,事務)並在服務層中使用這個包裝類?另外,我使用Java EE5,那麼我可以使用EJB的DAO嗎? – MyTitle

+0

要回答你所有問題**:是的! –

0

我同意您可以使用spring來管理交易,但同時請記住,管理交易不是DAO的義務。它們應該在負責管理業務邏輯的服務層中進行處理。

+0

我應該在服務層內處理連接(也作爲事務)嗎? I.e服務層將打開連接,然後打開事務,然後使用DAO對象進行某些業務邏輯,提交事務並關閉連接?這是真的? – MyTitle

+0

不,數據庫連接僅在DAO層處理。它的唯一交易將由服務層處理。 – Prateek