如何在 Java 中提高 select 查询性能?有没有办法使用多线程进行 select 查询?

How to improve the select query performance in Java ? Is there a way to do select query using multi threading?

我需要从我在数据库中创建的队列中执行 select 查询,该视图有大约 30,00,000 行,需要大约 2 分钟来读取此数据并将其存储在本地内存使用 JTDS JDBC 驱动程序。我读取数据的顺序无关紧要。现在我只是使用准备好的语句并从结果集中读取。有没有更好的方法从数据库中读取? 我正在从 MS SQL 服务器读取数据。 我现在的阅读方式是

public ResultSet getData(String view_name) throws SQLException { 
    String SQL="select * from "+view_name; 
    PreparedStatement stmt=conn.prepareStatement(SQL); 
    resultSet= stmt.executeQuery(); 
    resultSet.setFetchSize(8000); 
    return resultSet;
}

如您所知,一旦可用内存的大小开始减少,应用程序的性能就会下降,这将 return 在更频繁的 GC 周期中。

Is there a better way to read from data base ?

您是否尝试过 ResultSet 的流式传输和自适应缓冲的使用? What is adaptive response buffering and why should I use it?

自适应缓冲旨在检索任何类型的大值数据,而无需服务器游标的开销。应用程序可以执行 SELECT 语句,该语句生成的行数多于应用程序可以存储在内存中的行数。自适应缓冲提供了 forward-only read-only 传递任意大结果集的能力,而无需服务器游标。

当使用get<Type>Stream方法读取一次大值时,ResultSet列和CallableStatementOUT参数的访问顺序为[=39] =]由 SQL 服务器编辑,自适应缓冲最大限度地减少了处理结果时应用程序内存的使用。

您可以查看此 MSDN 库 post,了解有关 Using Adaptive Buffering 的更多信息。

不确定 MS SQL,但在 MySQL 中可以启用 resultset 的流式传输,如下所示。

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                    java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

希望对您有所帮助。