2013-01-08 118 views
-1

我有EmployeeDAOImpl.java和DepartmentDAOImpl.java。現在我從數據服務層調用這兩個。 EmployeeDAO和DepartmentDAO是界面,他們只有刪除CRUD方法。在服務層,我有兩個方法調用createEmployee(Employee employee)和createDepartment(Department department)。這兩個調用應該在同一個事務中,這意味着只有在兩次調用成功後才能關閉連接。現在你們有沒有想法如何提供連接。我不想在DepartmentDAOImpl和EmployeeDAOImpl的構造函數中提供連接。另外我不想使用Spring AOP或ThreadLocale,有沒有解決方案可以做到這一點?DAO設計模式和連接處理

回答

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方法嗎?

+0

+1 - 一個寫得很好,周到的答案。我會再次推薦重新考慮Spring。 – duffymo