我正在研究这个已经通过许多编码器'手的项目。该应用程序是两部分 - 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