私は、多くのコーダーの手を経たこのプロジェクトに取り組んでいます。このアプリケーションは、Web とバッチの 2 つの部分で構成されています。Web パーツは、ユーザーが構成を設定するための基本的な UI を提供します。JDBC/JNDI/non-Spring を使用しており、DAO はそれに基づいて作成されています。
バッチ部分は、PDF、PostScript、XML などのファイルを生成します。このビットは JDBC/Spring を使用し、DAO はそれに基づいて作成されました。
現在、コードベースは 1 つしかありませんが、コードは Web (war ファイル)、Batch (.bat または .sh から実行される Java アプリ)、および Commons (jar ファイル) の複数のフォルダーまたはモジュールに分かれています。Web とバッチの両方で同じ Commons jar ファイルを使用しますが、DAO は非常に断片化されているため、Web とバッチの両方にデプロイされたコードで使用できる共有 DAO を使用して新しいモジュールを作成するのは困難です。
私はこのプロジェクトをかなり長くサポートすることになるので、改善を開始することにしました。何よりもまず、新しいモジュールが統合された 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);
...
}
}