我在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()或它不起作用,但是在我的程序中这样做也将以相反的顺序检索数据。我的代码有什么问题?

最佳答案

这是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

09-11 17:30