我正在研究這個已經通過許多編碼器'手的項目。該應用程序是兩部分 - 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);
...
}
}
我使用OSGI,它與Spring有點不同,我們可以在不同的bean組件之間成功共享相同的數據源。我想春天也很好。 – vikingsteve 2013-02-26 17:19:42