代码之家  ›  专栏  ›  技术社区  ›  marvel308

如何提高Java中选择查询的性能?有没有一种方法可以使用多线程进行选择查询?

  •  0
  • marvel308  · 技术社区  · 9 年前

    我需要从我在数据库中创建的队列中执行一个选择查询。该视图有大约30万行,使用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;
    }
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   Shishir Kumar    9 年前

    正如您已经知道的,一旦可用内存的大小开始减少,应用程序的性能就会降低,这将导致更频繁的GC循环。

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

    你尝试过流媒体吗 ResultSet 以及自适应缓冲的使用? What is adaptive response buffering and why should I use it?

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

    使用 get<Type>Stream 方法,以及 结果集 列和 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);
    

    希望这对你有所帮助。