【问题标题】:How to improve the select query performance in Java ? Is there a way to do select query using multi threading?如何提高 Java 中的选择查询性能?有没有办法使用多线程进行选择查询?
【发布时间】:2015-07-17 08:59:23
【问题描述】:

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

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;
}

【问题讨论】:

  • 请告诉我们您是如何读取数据库的。
  • 第一个问题一如既往:你真的需要内存中的所有数据吗?
  • 是的,我需要将它存储到一个文件中。
  • 是否可以将数据处理部分移动到数据库中,然后只获取处理后的结果?

标签: java sql-server multithreading jdbc jtds


【解决方案1】:

正如您已经知道的那样,一旦可用内存的大小开始减少,应用程序的性能就会下降,这将在更频繁的 GC 周期中返回。

有没有更好的从数据库读取的方法?

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

自适应缓冲旨在检索任何类型的大值数据,而不会产生服务器游标的开销。应用程序可以执行SELECT 语句,该语句产生的行数超过了应用程序可以存储在内存中的行数。自适应缓冲提供了在不需要服务器游标的情况下对任意大的结果集进行forward-onlyread-only 传递的能力。

当使用get<Type>Stream 方法读取一次大值,并且ResultSet 列和CallableStatement OUT 参数按SQL Server 返回的顺序访问时,自适应缓冲将应用程序内存使用量降至最低处理结果时。

您可以查看此 MSDN 库帖子以了解有关 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);

希望对你有所帮助。

【讨论】:

  • JTDS 驱动是否支持自适应缓冲?
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多