2013-02-26 84 views
2

我正在研究這個已經通過許多編碼器'手的項目。該應用程序是兩部分 - Web和批處理。 Web部件爲用戶提供了一個基本UI,用於設置一些配置。它使用JDBC/JNDI /非Spring,DAO是基於此編寫的。緩存javax.sql.Datasource對象的單個實例是個好主意嗎?

批處理部分生成PDF,PostScripts,XML等文件。該位使用JDBC/Spring,DAO是基於此編寫的。

現在只有一個代碼庫,但代碼在幾個文件夾或模塊(Web(War文件),Batch(Java應用程序從.bat或.sh運行)和Commons(jar文件))中分開。雖然Web和Batch都使用相同的Commons jar文件,但DAO如此分散,以至於很難編寫一個具有共享DAO的新模塊,這些模塊既可以用於Web和批處理中,也可以用於代碼中。

因爲我會支持這個項目很長一段時間,所以我決定開始改進。首先,以一種新模塊組合所有DAO,將使用一組統一的DAO和舊模塊來使用現有的脆弱代碼。

下面,com.abc.core2.dao.ABCDAO將持有對DataSource的單個實例的引用,並使用該網頁或批處理來獲取來自數據庫的連接。 DataSource對象來自每個模塊的核心DAO,並將其緩存在ABCDAO.dataSource實例變量中。

有沒有人做過這樣的事情?在重新啓動應用程序之前保持單個DataSource對象的任何問題?

雖然這種變化仍然是一個原型。我的客戶將一些其他簡單的更改外包給一羣人。

通用(jar文件)

package com.abc.core2.dao; 
public class ABCDAO { 
    private static ABCDAO abcdao = new ABCDAO(); 
    private DataSource dataSource; 
    public void setInternalDataSource(DataSource dataSource) {this.dataSource = dataSource;} 
    public DataSource getInternalDataSource() { return this.dataSource; } 
    public static ABCDAO getInstance() { return this.abcdao; } 
    ... 
} 
public class NewModuleJdbcDao implements NewModuleDAO { 
    ... 
    public List<XYZBean> getXYZ(SearchBean sb) { 
     Connection con = ABCDAO.getInstance().getInternalDataSource().getConnection(); 
     ... 
     con.close(); 
     return listOfXYZBeans; 
    } 
} 

批量應用

import com.abc.core2.dao.ABCDAO; 
public abstract InformixBaseDAO extends ABCBaseDAO { 
    { 
     // via Spring JDBC XML configuration 
     ABCDAO.getInstance().setDataSource(NewConnectionPooler.getInstance().dataSource()); 
    } 
    public Connection getConnection() throws SQLException { 
     // pre-existing method. It does NewConnectionPooler.getInstance().getConnection() 
     ... 
     return connection; 
    } 
} 

// Use same NewModuleJdbcDao in Web application 
public class NewModuleClass001 { 

    public void show(SearchBean bean) { 
     ... 
     NewModuleJdbcDao dao = new NewModuleJdbcDao(); 
     List<XYZBean> list = dao.getXYZ(bean); 
     ... 
    } 
} 

Web應用程序

import com.abc.core2.dao.ABCDAO; 
public class DBConnection { 
    private static DataSource dataSource = null; 
    { 
     if(dataSource == null) { 
      dataSource = ServiceLocator.getInstance().getDataSource(...); // via JNDI 
      ABCDAO.getInstance().setDataSource(dataSource); 
     } 
    } 
    public static Connection() { 

     // Spring JDBC 
     ... 
    } 
} 

// Use same NewModuleJdbcDao in Web application 
public class NewModuleClass001 { 

    public void show(SearchBean bean) { 
     ... 
     NewModuleJdbcDao dao = new NewModuleJdbcDao(); 
     List<XYZBean> list = dao.getXYZ(bean); 
     ... 
    } 
} 

回答

0

我一個我在實踐這個策略時習慣使用,並且不熟悉基於該解決方案的任何問題。如果您也在使用spring,將您的池化數據源定義爲應用程序範圍的單例bean並將其注入模塊中。

+1

我使用OSGI,它與Spring有點不同,我們可以在不同的bean組件之間成功共享相同的數據源。我想春天也很好。 – vikingsteve 2013-02-26 17:19:42

相關問題