gpt4 book ai didi

java - 使用 JDBC 和 MySQL 更新大型结果集

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:27 24 4
gpt4 key购买 nike

我正在尝试更新大量行(大约 500 万行)。我首先遇到了在结果集中获取如此多行的堆溢出问题。因为我不想增加这台机器上的堆大小,所以我想知道是否有一种有效的方法可以做到这一点。

我尝试设置 setFetchSize(Integer.MIN_VALUE) 但是当我调用更新函数时出现此错误:

流式结果集 com.mysql.jdbc.RowDataDynamic@2087c268 仍然有效。当任何流式结果集在给定连接上打开并正在使用时,不得发出任何语句。在尝试更多查询之前,请确保您已对任何 Activity 的流式处理结果集调用了 .close()

如果我在结果集上调用 close(),我当然无法更新它。这是我的代码

public void getRows()
{
Statement stmt = null;
ResultSet rs = null;
int countSpecialChars = 0;
int upper = 0, lower = 0, digits =0;
String pass = null;
int id = 0;

char thisChar;
String query = "select id,pass from datatable";
try {
this.conn.setAutoCommit(false);
stmt = this.conn.createStatement();
stmt.setFetchSize(Integer.MIN_VALUE);
rs = stmt.executeQuery(query);

while (rs.next()) {
pass = rs.getString(2).trim();
id = rs.getInt(1);
for (int i=0; i<=pass.length()-1; i++)
{
thisChar= pass.charAt(i);
if (thisChar >= 65 && thisChar <= 90) {
upper++;
} else if (thisChar >= 97 && thisChar <= 122) {
lower++;
} else if( thisChar >= 48 && thisChar <= 57) {
digits++;
}
else
{countSpecialChars++;}
}
Entropy entropy = new Entropy();
double naiveEntropy = entropy.naiveEntropy(pass);
NumberFormat formatter = new DecimalFormat("#0.00");
this.updateRow(id, pass.length(), digits, upper, lower, countSpecialChars, Double.parseDouble(formatter.format(naiveEntropy)));
countSpecialChars = 0;
upper=digits=0;
lower = 0;
}
rs.close();
}
catch (SQLException e)
...
}

public void updateRow(int id, int length, int numbers, int upper,
int lower, int specialChars, double naiveEntropy )
{
PreparedStatement updatePassEntry = null;

String updateString = "update cwlCompatiblePassUnique " +
"set length = ?, numbers = ?, upper = ?, lower = ?, specialChars = ?, ShannonEntropy = ? where id = ?";
try {
this.conn.setAutoCommit(false);
updatePassEntry = this.conn.prepareStatement(updateString);
updatePassEntry.setInt(1, length);
...
updatePassEntry.setInt(7, id);
updatePassEntry.executeUpdate();
this.conn.commit();
}
catch (SQLException e)
...
}

关于可以做什么的任何想法?

谢谢

最佳答案

您在 rs.next() 循环中调用 updateRow() 方法;它试图对当前正在 while (rs.next()) 循环中处理的 SQL 字段 (id) 进行 SQL 更新。这会引发你得到的错误。作为第一步,我建议您编写一个方法来拉取 rs 并将它们存储在 java 对象 vector 中。此方法将在退出后关闭 rs。然后编写另一种方法来对缓存的 vector 对象进行处理和更新数据。像这样:

    private void Vector<DataSet> getDataSet(){
Vector<DataSet> data=new Vector<DataSet>();
String query = "select id,pass from datatable";
try {
this.conn.setAutoCommit(false);
stmt = this.conn.createStatement();
stmt.setFetchSize(Integer.MIN_VALUE);
rs = stmt.executeQuery(query);

while (rs.next()) {
pass = rs.getString(2).trim();
id = rs.getInt(1);
data.addElement(new DataSet(id,pass));
}

}catch(Exception e){

// here close connection and rs
}
}
private void udpateData(Vector<dataSet> data){
//process data and update her
}

static class DataSet{
int id;
String pass;
//constructor here
}

关于java - 使用 JDBC 和 MySQL 更新大型结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6435416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com