DAO可以使用一个自身封装dataSource对象的对象吗?

时间:2015-08-31 06:37:50

标签: java design-patterns jdbc dao

我有一个DAO,(称之为PlayerDao),方法如下:

public interface PlayerDao{
    //Other methods
    public Collection<Integer> getPlayerRegisteredIds();
}

现在我需要为该方法提供两个实现:

I 即可。直接在dataSource上执行select查询,如下所示:

public class PlayerDaoImpl implements PlayerDao{

    private DataSource dataSource; //javax.sql.DataSource
    //Other methods
    public Collection<Integer> getPlayerRegisteredIds(){
        Collection<Integer> result = new ArrayList<Integer>();
        String query = "SELECT id FROM player WHERE registered_today = true";
        //Executing the query with the dataSource

        return result;
}

II 即可。按部分执行此查询。我的意思是将查询拆分为4个不相交的部分,并将每个部分执行到一个单独的线程中(为了提高性能)。

 public class ConcurrentPlayerDaoImpl implements PlayerDao{
    private static final NUMBER_OF_THREADS = 4;
    private DataSource dataSource; //javax.sql.DataSource
    //Other methods
    public Collection<Integer> getPlayerRegisteredIds(){
        final Set<Integer> set = Collections.synchronizedSet(new HashSet<Integer>());
        //It's going to consist of 4 queries 
        List<String> queriesToConcurrentExecution = new ArrayList<String>();     
        //Obtaining the queries
        ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
        for(final String sql : queriesToConcurrentExecution){
            executor.execute(new Runnable() {
                @SuppressWarnings("unchecked")
                @Override
                public void run() {
                    List<Integer> l = new JdbcTemplate(dataSource).queryForList(sql, Integer.class);
                    set.addAll(l);
                }
            });
        }
        executor.shutdown();

        return set;
}

问题是//Other methods的实现在两种情况下都是相同的。所以我倾向于将getPlayerRegisteredIds()包装到某个接口中,然后为它的构造函数提供相同Dao类的两个不同的实现。这是对的吗?

official DAO-pattern's description中说DAO就像bussines对象和DataSource之间的适配器,但在我的情况下,它使用一个本身使用dataSource的对象。

问题 :我们是否应始终坚持在DAO中直接使用对象?这是必要的要求吗?

1 个答案:

答案 0 :(得分:2)

我认为您打算使用的内容没有任何根本错误:DAO使用的接口和包含该特定方法的接口是策略,DAO将委托给一个或另一个策略实现。

DAO仍然具有包含daa访问方法的角色,并且可以按照自己的方式自由实现,即使这包括委托给其他组件。