我有EmployeeDAOImpl.java和DepartmentDAOImpl.java。現在我從數據服務層調用這兩個。 EmployeeDAO和DepartmentDAO是界面,他們只有刪除CRUD方法。在服務層,我有兩個方法調用createEmployee(Employee employee)和createDepartment(Department department)。這兩個調用應該在同一個事務中,這意味着只有在兩次調用成功後才能關閉連接。現在你們有沒有想法如何提供連接。我不想在DepartmentDAOImpl和EmployeeDAOImpl的構造函數中提供連接。另外我不想使用Spring AOP或ThreadLocale,有沒有解決方案可以做到這一點?DAO設計模式和連接處理
-1
A
回答
1
你不解釋爲什麼你不想提供連接到DAO構造函數或使用Spring AOP或ThreadLocale。
我想說,連接獲取是交易管理的一部分,這是服務層的責任。它應該爲DAO提供連接數據庫所需的東西。
你說過你不會這樣做,但沒有提出如何做的想法。
我想說,服務應該從池中獲取連接,將其提供給DAO,管理事務並在用例完成時將連接返回到池中。
由於您不想使用Spring,因此我會將實現細節留給您。可以使用直接JDBC來完成。你只需要努力工作就可以做到。
如果你堅持不使用Spring AOP或者,您的服務代碼將是這個樣子:
package service;
public class FooServiceImpl implements FooService {
public void saveFoo(Foo f) {
Connection connection = null;
Statement st = null;
try {
connection = ConnectionPool.checkout();
connection.setAutoCommit(false);
// do something here
connection.commit();
} catch (Exception e) {
rollback(connection);
e.printStackTrace();
} finally {
close(st);
close(connection);
}
}
}
春AOP將在這裏受益。它會消除樣板代碼。這是你的選擇。
1
我不想使用Spring AOP或ThreadLocale
不幸的是,這是Spring是如何處理事務和連接(?) - (簡稱),一旦你從非事務上下文進入@Transactional
方法,它把數據庫連接負責該交易ThreadLocal
。通過這種方式,該事務中的每個方法都使用相同的連接,即相同的事務。這是完全透明的,您只需使用DataSource
抽象或JdbcTemplate
(優雅地隱藏了這種複雜性)。
請注意,作爲構造函數參數傳遞連接在多線程環境中完全中斷。您應該改爲通過DataSource
。 Spring(或者EJB)可以處理低級別的東西。
稍微更好的方法是將Connection
傳遞給每個DAO的每個方法。但是,這是20世紀90年代......你能詳細說說你不喜歡Spring方法嗎?
相關問題
- 1. JdbcTemplate - DAO設計模式 - 連接查詢
- 2. ORM和DAO設計模式
- 3. API設計和DAO模式
- 4. DAO設計模式
- 5. 如何處理連接池和DAO?
- 6. Rest Dao設計和異常處理
- 7. DAO設計模式界面
- 8. DAO和服務層的設計模式
- 9. 服務和DAO設計模式
- 10. 連接器設計模式?
- 11. DAO和連接
- 12. 預處理與代理設計模式
- 13. DAO設計模式與加入
- 14. 設計模式:異常/錯誤處理
- 15. 錯誤處理的設計模式
- 16. 狀態設計模式:錯誤處理
- 17. Java - 消息處理器設計模式
- 18. 設計模式 - 事件處理
- 19. 處理事件的設計模式
- 20. 設計模式:連接的對象池
- 21. 設計模式 - 使用DAO?或者使用其他類型的設計模式?
- 22. 使用什麼設計模式?連接和UI模型
- 23. 瞭解DAO模式和接口
- 24. ORM和DAO - 設計問題
- 25. 管理到遠程API的連接的設計模式
- 26. 用於memcache-client-like連接管理的設計模式?
- 27. 設計模式來處理瀑布處理
- 28. 設計和連接分區格式
- 29. 「讀取,處理,保存」模式的設計模式?
- 30. 不同模式的命令處理器的設計模式
+1 - 一個寫得很好,周到的答案。我會再次推薦重新考慮Spring。 – duffymo