2013-02-26 85 views
2

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

回答

0

我一个我在实践这个策略时习惯使用,并且不熟悉基于该解决方案的任何问题。如果您也在使用spring,将您的池化数据源定义为应用程序范围的单例bean并将其注入模块中。

+1

我使用OSGI,它与Spring有点不同,我们可以在不同的bean组件之间成功共享相同的数据源。我想春天也很好。 – vikingsteve 2013-02-26 17:19:42

相关问题