0

我正在创建一个需要收集大量数据、将数据处理为对象并将对象作为列表返回的 java 应用程序。

收集的所有数据都来自我数据库中的不同表(有些是连接的,但它们都是不同的 SQL 调用)

我正在考虑通过不同的线程获取这些数据,但是由于多个线程不能使用相同的连接来访问数据库中的数据,我必须为每个线程创建一个新连接。

我的问题是:同时访问和处理数据库中的多个数据的最佳方法是什么?

4

3 回答 3

1

如果您有足够的内存,我会使用同步到数据库的完整二级更改。使用缓存使其速度非常快。如果您在服务器/客户端上没有足够的内存,您可以在 sqlserver 上缓存您的查询,并使用一个包含查询中的所有值的表,并且该表每秒更新一次。

否则,您可以使用带有线程的线程池,它将查询结果插入到结果的共享对象中。

于 2013-05-02T11:53:55.357 回答
0

理想情况下,数据库应该以这样一种方式设计,即您应该能够在单个查询中获取所有相关数据(可能使用 JOINS)。不确定在您的情况下是否可以实现。

有三个可行的选项,您已经尝试过创建多个线程并获取数据。我将只为该方法添加一个输入,您可以尝试以防优化。创建 Data Fetcher 线程以从不同的表中获取数据,并创建一个 Data Processor 线程来处理 Data Fetcher 线程获取的数据。

或者

第二种方法是创建一个存储过程,它将直接在数据库上运行并可以为您进行一些数据处理。这将避免在您的 java 代码中创建太多线程并进行大量处理。

或者

混合这两种方法以获得最佳结果。

祝你好运!

于 2013-05-02T12:25:31.280 回答
0

我正在使用Spring framework。假设存在声明所有常量的 ModelBean 类。在 ModelBean 中,类名是声明的字段。

public class CurriculumReportDaoImpl extends JdbcDaoSupport{
   public List<String> fetchList(){
      String query="";
      List<ModelBean > tempList=new ArrayList<ModelBean >();
      List<Map<String,Object>> record = getJdbcTemplate().queryForList(query);

      for(Map<String,Object> result=record){
         /*create new instance of ModelBean*/
         model=new ModelBean();
         /*"name" is the column name which are fetch from db*/
         model.setName(result.get("name").toString);
         /*now set model in tempList*/
         tempList.add(ModelBean );
      }

      return tempList;
   }
}

如果你有很多连接那么你可以在这里创建很多 List 并设置到 ModelBean 类中。我想这会对你有所帮助。

于 2013-05-02T12:14:25.760 回答