Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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_Database_Multithreading_Parallel Processing - Fatal编程技术网

如何使用java从数据库中读取大数据?

如何使用java从数据库中读取大数据?,java,database,multithreading,parallel-processing,Java,Database,Multithreading,Parallel Processing,我的表中有超过2gb的数据,我需要从单个表中读取更多1gb的数据,我知道在db端可以使用各种选项来实现这一点,但我需要更好的java代码方法,任何人都可以从示例java代码(如多线程中的并行处理)中看出这一点 示例代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statemen

我的表中有超过2gb的数据,我需要从单个表中读取更多1gb的数据,我知道在db端可以使用各种选项来实现这一点,但我需要更好的java代码方法,任何人都可以从示例java代码(如多线程中的并行处理)中看出这一点

示例代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class SelectRowsExample {
  
  public static void main(String[] args) {
 
    Connection connection = null;
    try {
 
  // Load the MySQL JDBC driver
 
  String driverName = "com.mysql.jdbc.Driver";
 
  Class.forName(driverName);
               
  String serverName = "localhost";
 
  String schema = "test";
 
  String url = "jdbc:mysql://" + serverName +  "/" + schema;
 
  String username = "username";
 
  String password = "password";
 
  connection = DriverManager.getConnection(url, username, password);
 
   
 
  System.out.println("Successfully Connected to the database!");
 
   
    } catch (ClassNotFoundException e) {
 
  System.out.println("Could not find the database driver " + e.getMessage());
    } catch (SQLException e) {
 
  System.out.println("Could not connect to the database " + e.getMessage());
    }
 
    try {
 
       
Statement statement = connection.createStatement();
 
ResultSet results = statement.executeQuery("SELECT * FROM employee orderby dept");
         
while (results.next()) {
   
  String empname = results.getString("name");
 
  System.out.println("Fetching data by column index for row " + results.getRow() + " : " + empname);
 
   String department = results.getString("department");
 
  System.out.println("Fetching data by column name for row " + results.getRow() + " : " + department);
 
 
}
 

        } catch (SQLException e) {
 
  System.out.println("Could not retrieve data from the database " + e.getMessage());
    }
 
  }
}

在这里,我的查询将返回名称和部门详细信息,每个部门的1gb数据将更多。如果我使用这种方式,它将明显减慢应用程序的速度。这就是为什么我想在多线程中进行并行处理。任何人都可以建议我快速阅读大量数据。

在您的示例中,您不必使用大口径火炮式平行飞行。此外,它不一定能解决您的问题,因为正如luk2302所提到的,由于硬件、网络等原因,可能会有很多瓶颈

有两个更简单的调整:

  • 仅选择您真正需要的数据。即使您的员工记录有3列,您也可以保留1/3的数据,从而提高速度并降低内存消耗。更不用说它是否有更多的专栏了
  • 默认的fetchSize不够。它的值取决于驱动程序,但例如,默认情况下,当Oracle JDBC运行查询时,它会从数据库游标一次检索10行的结果集。我知道你正在使用MySql,但应该是一样的。增加它可以减少数据库游标的总行程计数,这是非常昂贵的。因此,我建议将其增加到500或1000,但您甚至可以尝试更高的值。有关fetchSize的详细信息:
  • +1-System.out.println也会降低代码的速度。您可以在此处阅读:但最好使用记录器库进行替换,或者至少出于测试目的,您可以使用以下内容:
比尔,
Nandor

是什么让你认为并行处理或多线程可以改善这里的一切?您当前从数据库读取的代码是什么,以什么方式读取的代码太慢?您的目标速度是多少,java应用程序运行在什么硬件上,服务器运行在什么硬件上?等等……@luk2302我正在寻找更好的方法来实现这一点。如果我尝试读取超过1GB的数据,通常会影响应用程序的性能。不,不会。什么是“正常”?不。没有性能问题,除非你非常清楚地说明你想要达到的性能。“性能问题”是一个很好的时髦词,它本身毫无意义。“如果我用这种方式,它会大大降低应用程序的速度”-那又怎样?您的用例是什么,您的需求是什么?注:1gb以上的数据量是很小的。如果你读取1TB的数据,你可能会遇到麻烦。在这两种情况下,java无法单独解决问题,它取决于数据库、网络、硬件等。您没有提供任何上下文。
ResultSet results = statement.executeQuery("SELECT name, department FROM employee orderby dept");
Statement statement = connection.createStatement();
statement.setFetchSize(1000);
if(results.getRow()%1000 == 0) {
    System.out.println("Fetching data by column index for row " + results.getRow() + " : " + empname);
}