【问题标题】:Understanding Forward Only ResultSet了解仅转发结果集
【发布时间】:2015-05-11 07:36:12
【问题描述】:

我在 mysql 数据库中有一个表,其中有一些行可用。我想从我的 jdbc 程序中的表中检索数据,其中 ResultSet 仅转发。我的代码是:

import java.sql.*;

public class Test1 {
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Connection con=null;
        Statement st=null;
        ResultSet rs=null;
        int id=0;
        String name=null;
        try {
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/hiitstudents","root", "rustyiron");
            st=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.TYPE_SCROLL_INSENSITIVE);
            String query="select * from students";
            rs=st.executeQuery(query);
            while(rs.next()){
                id=rs.getInt(1);
                name=rs.getString(2);
                System.out.println(id+"\t"+name);
            }               ;
            while(rs.previous()){
                id=rs.getInt(1);
                name=rs.getString(2);
                System.out.println(id+"\t"+name);
            }
            } catch (SQLException e) {
                e.printStackTrace();
        }finally{
            try{
                if(rs!=null)
                    rs.close();

                if(st!=null)
                    st.close();

                if(con!=null)
                    con.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
    }
}

但由于默认结果集是转发的,我们不能在其中调用previous(),否则它不应该工作,但在我的程序中这样做也会以相反的顺序检索数据。我的代码有什么问题?

【问题讨论】:

  • 好的,那么如何检查结果集是否只转发?

标签: java jdbc


【解决方案1】:

MySQL 就是这样处理它的,其他数据库的行为可能会有所不同。

默认情况下,ResultSet 被完全检索并存储在内存中。

如果您正在使用具有大量行的结果集或 大值并且无法在 JVM 中为内存分配堆空间 必需,您可以告诉驱动程序将结果返回一行 一次。

要启用此功能,请在 方式如下:

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

Connector/J Reference Implementation Notes

【讨论】:

  • 这与我的问题有关吗?只是问,因为我不明白
  • 默认情况下,整个结果集都存储在内存中,因此 MySQL 驱动程序允许您随意遍历它。如果您想查看异常,您应该尝试使用提供的代码 sn-p 获取 ResultSet。许多 JDBC 选项只是对驱动程序的提示,因此实际行为可能与 javadoc 有很大不同。
  • 是的,我明白了!你能解释一下 stmt.setFetchSize(Integer.MIN_VALUE) 的作用吗
  • 通常意味着当需要更多数据时通过网络获取多少行。假设您有 1000 个结果,fetchSize 是 100,如果您遍历结果集,它将执行 10 次网络操作以获取更多数据。然而,在这种情况下,它是一个神奇的数字(负值),告诉驱动程序一次通过网络获取一行。
  • 没问题。 JDBC API 非常模糊,所描述的功能在很大程度上取决于所使用的数据库驱动程序,而且承诺的功能通常没有效果,因为它是“对驱动程序的提示”,而驱动程序通常不能或不会实现额外的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2011-04-10
  • 1970-01-01
  • 2020-05-07
  • 2012-01-25
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多