Java 为什么在处理大型数据集时关闭结果集

Java 为什么在处理大型数据集时关闭结果集,java,mysql,jdbc,bigdata,Java,Mysql,Jdbc,Bigdata,preparedbatch方法获取大小为1000的结果集。 我使用准备好的语句和批处理插入数据 使用LIMIT,我从mysql数据库java中提取了1000行。。并从每行的列值中计算一些值 public class Method { void preparedBatch (ResultSet rs, PreparedStatement insert) throws Exception{ int y; int arr[]= new int[40]; while (rs

preparedbatch方法获取大小为1000的结果集。 我使用准备好的语句和批处理插入数据

使用LIMIT,我从mysql数据库java中提取了1000行。。并从每行的列值中计算一些值

public class Method {

void preparedBatch (ResultSet rs, PreparedStatement insert) throws Exception{

    int y;
    int arr[]= new int[40];

    while (rs.next()){


        for(y=2;y<=41;y++){

            arr[y-2]=rs.getInt(y);
        }

        insert.setString(1, rs.getString(1));
        insert.setLong(2, calculate(arr));

        insert.addBatch();

    }


    {

        insert.executeBatch();
        insert.clearBatch(); // I did this to avoid oOM
    }
    rs.close(); //if I do not close, then I get OOM error


}

long calculate (int[] arr){
    long sum =0;

    for(int k=0;k<40;k++){

        sum+= arr[k]*pow(2,k);          
    }

    return sum;
}

long  pow(long  base, int exponent)
{
    if (exponent == 0)
        return 1;  // base case;
    double temp = pow(base, exponent/2);

    if (exponent % 2 == 0)
        return (long) (temp * temp); 

    else
        return (long) (base * temp * temp);
}

void method(){

    Method k = Insert.m1;
    System.out.println("in metho");
    Database d1= new Database(); // for reading from tables

    d1.setPassword("abc");
    d1.setUrl("jdbc:mysql://localhost/DB");
    d1.setUser("root");


    // object to calculate 2 raise to 39 stuff

    ResultSet rs =null;// result set for 2500 lines selected

    PreparedStatement ps=null,insert=null; //ps for selecting 1000 lines //insert for inserting into binary table


    final  Connection con;
    try {
        con = DriverManager.getConnection(d1.getUrl(), d1.getUser(), d1.getPassword());
        con.setAutoCommit(false);

        insert = con.prepareStatement("insert into binarydata values(?,?)");
        int z;
        for(z=0;z<=850000;z=z+1000)
        {
            ps =  con.prepareStatement("select * from  table1 LIMIT "+z +", 1000");

            rs= ps.executeQuery();


            try {
                k.preparedBatch(rs,insert);//k is global object of Methodclass
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            rs.close();
                if(z%200000==0){
                    System.out.println(z +" inserted this time");
                }

                if(z==850000){
                    System.out.println(z +"mouse");
                }



        }

        {



            ps =  con.prepareStatement("select * from table1 LIMIT 851000 , 364");
            insert = con.prepareStatement("insert into binarydata values(?,?)");
            rs= ps.executeQuery();
            try {
                k.preparedBatch(rs,insert);
                System.out.println("finally inserting");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println(rs.getString(1));
            }
            rs.close();

        }

        try {
            con.commit();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        finally{
            con.close();
            ps.close();
            insert.close();
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}
公共类方法{
void preparedBatch(ResultSet rs,PreparedStatement insert)引发异常{
int-y;
int arr[]=新int[40];
while(rs.next()){

对于(y=2;这看起来代码编写得很糟糕。整个方法看起来很奇怪,因为您在其中同时传递一个ResultSet和一个PreparedStatement。您最好在finally块中关闭您的ResultSet和语句,但在没有看到其余代码的情况下,很难说它还有什么问题。@Kayama-谢谢您的评论。我知道现在代码很奇怪。我正处于学习阶段。如果我没有通过结果集和准备好的语句,还有什么其他方法可以对结果集进行工作/筛选并插入到新表中?@专家:请指导我。