2

私は、多くのコーダーの手を経たこのプロジェクトに取り組んでいます。このアプリケーションは、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);
        ...
    }
}
4

1 に答える 1

0

私は常にこの戦略を実際に使用しており、その解決策に基づく問題に精通していません。スプリングも使用している場合は、プールされたデータソースをアプリケーション スコープのシングルトン Bean として定義し、それをモジュールに挿入します。

于 2013-02-26T17:02:38.657 に答える