我正在研究这个已经通过许多编码员手的项目。该应用程序由两部分组成 - Web和Batch。 Web部件为用户提供了用于设置某些配置的基本UI。它使用JDBC / JNDI /非Spring,并且DAO是基于此编写的。
批处理部分生成PDF,PostScripts,XML等文件。这个位使用JDBC / Spring,DAO是基于此编写的。
现在只有一个代码库,但代码在几个文件夹或模块中分开 - Web(war文件),Batch(从.bat或.sh运行的java应用程序)和Commons(jar文件)。虽然Web和Batch都使用相同的Commons jar文件,但DAO是如此分散,以至于很难编写一个带有共享DAO的新模块,可以在Web和批处理中部署的代码中使用它们。
由于我将在很长一段时间内支持这个项目,所以我决定开始改进。首先,以一种新模块的方式组合所有DAO将使用一组统一的DAO和旧模块来使用现有的脆弱代码。
下面,com.abc.core2.dao.ABCDAO将保存对单个DataSource实例的引用并使用该实例 在Web或批处理中从数据库获取连接。 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);
...
}
}
网络应用
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 :(得分:0)
我总是在练习这个策略时使用,并且不熟悉基于该解决方案的任何问题。如果您正在使用spring,则将池化数据源定义为应用程序范围的单例bean,并将其注入模块中。