0

preparebatch メソッドはサイズ 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();
    }

}
}

私のメインクラスはメソッドのオブジェクトを作成し、そこからメソッドを呼び出します。私の配列は0,1,0,1,1,1,1,1,,0,0,0,0,0,0,0,1,0です(これは一例です。851364 行すべてにそのようなデータが含まれています)

たとえば、私の arr が 0,1,0 の場合、sum+= arr[index]*2 (power index) を計算しています..このように..

Springs についての知識はありません。それ以外の場合は、Springs を使用して自分のサイズのデータ​​を処理していたでしょう。

メソッドpreparedBatchで、なぜ結果セットを閉じる必要があるのか​​ を理解してください。

また、これの最適化されたコードを提案してください。85136行を読んでそれぞれの合計を挿入するのに、約9分かかりました..

4

0 に答える 0