Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同时从数据库中选择多个数据_Java_Sql_Multithreading - Fatal编程技术网

Java 同时从数据库中选择多个数据

Java 同时从数据库中选择多个数据,java,sql,multithreading,Java,Sql,Multithreading,我正在创建一个java应用程序,它需要收集大量数据,将数据处理成对象,并将对象作为列表返回 收集的所有数据都来自数据库中的不同表(有些表已连接,但所有表都是不同的SQL调用) 我曾考虑通过不同的线程获取这些数据,但由于多个线程不能使用相同的连接来访问数据库中的数据,因此我必须为每个线程创建一个新的连接 我的问题是:同时访问和处理数据库中的多个数据的最佳方法是什么?如果您有足够的内存,我会使用一个完整的第二级更改同步到数据库。使用缓存可以使其速度极快。如果服务器/客户机上没有足够的内存,可以在sq

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

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

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


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

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


否则,您可以将线程池与线程一起使用,从而将queryresults插入到共享对象中以获得结果

我使用的是
Spring框架
。假设存在一个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;
   }
}
公共类课程报告daoimpl扩展了jdbcdao支持{
公共列表fetchList(){
字符串查询=”;
List templast=new ArrayList();
列表记录=getJdbcTemplate().queryForList(查询);
用于(映射结果=记录){
/*创建ModelBean的新实例*/
model=newmodelbean();
/*“name”是从数据库获取的列名*/
model.setName(result.get(“name”).toString);
/*现在在圣殿骑士中设置模型*/
add(ModelBean);
}
返回圣殿骑士;
}
}
若您有许多连接,那个么您可以在这里创建许多列表并将其设置到ModelBean类中。
我认为这将对您有所帮助。

理想情况下,数据库的设计应确保您能够在单个查询中获得所有相关数据(可能是通过连接)。不确定在你的情况下这是否可能实现

有三种可行的选择,一种是您已经尝试过的,创建多个线程并获取数据。我将只添加一个输入到该方法中,您可以尝试优化。创建数据提取程序线程以从不同的表中提取数据,并创建一个数据处理器线程以处理数据提取程序线程提取的数据

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

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


祝你好运

如何创建第二级更改?这是我第一次听到这个消息当你使用JPA时,你通常会将每个查询结果缓存在entitymanager的一级缓存中。为实体定义缓存时,这些实体将作为二级缓存存储在内存中。您可以在JPA规范第3.7章中阅读更多关于这方面的内容,感谢您的回复-我需要做的唯一一件事就是基本上:1。打开连接2。执行selectStatement 3。密切联系。但是我有大约5个线程需要这样做,Spring框架仍然是一个好主意吗?我的程序收集数据并对其进行处理,然后将其显示为许多不同的图表,因为所有数据或多或少都不同,一次只能选择一个