Java 为什么在处理大型数据集时关闭结果集
preparedbatch方法获取大小为1000的结果集。 我使用准备好的语句和批处理插入数据 使用LIMIT,我从mysql数据库java中提取了1000行。。并从每行的列值中计算一些值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
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-谢谢您的评论。我知道现在代码很奇怪。我正处于学习阶段。如果我没有通过结果集和准备好的语句,还有什么其他方法可以对结果集进行工作/筛选并插入到新表中?@专家:请指导我。