DAO 可以使用本身封装了数据源对象的对象吗?
Can DAO use an object that itself incapsulates a dataSource object?
我有一个 DAO
,(称之为 PlayerDao
)具有以下方法:
public interface PlayerDao{
//Other methods
public Collection<Integer> getPlayerRegisteredIds();
}
现在我需要为该方法提供两个实现:
我。直接在数据源上执行 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 class 提供两种不同的实现。对吗?
在 official DAO
-pattern's description 中说 DAO
就像是业务对象和 DataSource
之间的适配器,但在我的例子中它使用了一个本身使用数据源的对象。
问题:我们是否应该始终坚持在 DAO 中直接使用数据源对象?这是必要的要求吗?
我认为您计划使用的内容没有任何根本性错误:DAO 使用并包含该特定方法的接口是一种 策略 ,并且 DAO 将委托给一个或其他策略实现。
DAO 仍然具有包含 daa 访问方法的作用,并且可以按照自己想要的方式自由实现它们,即使这包括委托给其他组件。
我有一个 DAO
,(称之为 PlayerDao
)具有以下方法:
public interface PlayerDao{
//Other methods
public Collection<Integer> getPlayerRegisteredIds();
}
现在我需要为该方法提供两个实现:
我。直接在数据源上执行 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 class 提供两种不同的实现。对吗?
在 official DAO
-pattern's description 中说 DAO
就像是业务对象和 DataSource
之间的适配器,但在我的例子中它使用了一个本身使用数据源的对象。
问题:我们是否应该始终坚持在 DAO 中直接使用数据源对象?这是必要的要求吗?
我认为您计划使用的内容没有任何根本性错误:DAO 使用并包含该特定方法的接口是一种 策略 ,并且 DAO 将委托给一个或其他策略实现。
DAO 仍然具有包含 daa 访问方法的作用,并且可以按照自己想要的方式自由实现它们,即使这包括委托给其他组件。