Я хочу сравнить два списка с объектами одного типа, которые имеют около 30 значений.Когда есть различия, новое значение должно быть обновлено в базе данных.
Часть, где мой код становится действительно очень медленным, например, одно обновление каждую минуту, - это когда данные должны обновляться.
чтение всехнаборы данных из БД и Excel быстро.Но когда дело доходит до приведенного ниже кода, он уже начинает почти останавливаться после 200 наборов данных.
Я не могу предоставить полный код для вас, так как метод getLists () вызывает много функций, которые будут слишком много кодапо-моему.Но, может быть, вы все еще можете помочь мне с моей проблемой, поскольку соответствующая часть, где производительность падает при данном коде.
Может быть, каким-то образом создается много объектов или что-то в этом роде?
РЕДАКТИРОВАТЬ: я запускаю программу с IntelliJ.Когда я закрываю работающее приложение и запускаю его снова, оно загружает уже медленно загруженные наборы данных из предыдущего раза очень быстро, но затем снова замедляется.Может, что-то с кешем не так?
Вот мой код:
public class MainWindow_Controller {
List<Pensioner> pensionerDB = new ArrayList();
List<Pensioner> pensionerExcel = new ArrayList();
Boolean checkStatusChange = false;
String pathDB = "";
@FXML
private TextField tfDBPath;
/**
* This method compares the pensioners from database with the ones from the excel head file.
* Based on matching pensionInsuranceNumbers the method checks if the status is different.
* If it is different, the status gets updated.
*
* @param event
*/
@FXML
void getStatusChange(ActionEvent event) throws FileNotFoundException, IllegalAccessException, SQLException {
String type = "Statuswechsel";
if (pensionerDB.isEmpty() || pensionerExcel.isEmpty()) {
getLists();
}
pathDB = tfDBPath.getText();
//load pensioners from database in first list
pensionerDB = array[0];
//load pensioners from excel head file in second list
pensionerExcel = array[1];
//compare pensionInsuranceNumber from first list with pensionInsuranceNumber from second list and move missing datasets to third list
List<Pensioner> result = new ArrayList();
Database.connect(pathDB);
//iterates over the two lists with pensioners in database and pensioners in excel files and adds the dataset with matching pensionInsuranceNumbers into the result list.
for (int i = 0; i < pensionerExcel.size(); i++) {
System.out.println("Processing Excelrow Number: " + i);
for (int j = 0; j < pensionerDB.size(); j++) {
updatePensionerData(pensionerExcel, pensionerDB, pathDB, i, j);
if (pensionerExcel.get(i).getPensionInsuranceNumber() == pensionerDB.get(j).getPensionInsuranceNumber() && pensionerExcel.get(i).getStatusOld() != pensionerDB.get(j).getStatusOld()) {
checkStatusChange = true;
pensionerDB.get(j).setStatusNew(pensionerDB.get(j).getStatusOld());
pensionerDB.get(j).setStatusOld(pensionerExcel.get(i).getStatusOld());
result.add(pensionerDB.get(j));
break;
} else if (pensionerExcel.get(i).getPensionInsuranceNumber() == pensionerDB.get(j).getPensionInsuranceNumber() && pensionerExcel.get(i).getStatusOld() == pensionerDB.get(j).getStatusOld()) {
break;
}
}
}
Database.close();
}
public void updatePensionerData(List<Pensioner> pensionerExcel, List<Pensioner> pensionerDB, String pathDB, int i, int j) {
if (pensionerExcel.get(i).getPensionInsuranceNumber() == pensionerDB.get(j).getPensionInsuranceNumber()) {
if (pensionerExcel.get(i).getIdkz() != pensionerDB.get(j).getIdkz()) {
Database.updateIdkz(pensionerExcel.get(i), pathDB);
}
if (!pensionerExcel.get(i).getCompany().equals(pensionerDB.get(j).getCompany())) {
Database.updateCompany(pensionerExcel.get(i), pathDB);
}
if (pensionerExcel.get(i).getPersonelId() != pensionerDB.get(j).getPersonelId()) {
Database.updatePersonelId(pensionerExcel.get(i), pathDB);
}
if (!pensionerExcel.get(i).getBirthDate().isEqual(pensionerDB.get(j).getBirthDate())) {
Database.updateBirthDate(pensionerExcel.get(i), pathDB);
}
//...
//26 more if statements for the other values
//...
}
}
}
Методы моей базы данных:
public static void updateIdkz(Pensioner p, String pathDB) {
String update = String.format("UPDATE Pensionär SET idkz = ?");
try {
ps = connection.prepareStatement(update);
ps.setInt(1, p.getIdkz());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void updatePersonelId(Pensioner p, String pathDB) {
String update = String.format("UPDATE Pensionär SET PersNr = ? Where pknr = ?");
try {
ps = connection.prepareStatement(update);
ps.setInt(1, p.getPersonelId());
ps.setInt(2, p.getPensionInsuranceNumber());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void updateBirthDate(Pensioner p, String pathDB) {
String update = String.format("UPDATE Pensionär SET Geburtsdatum = ? Where pknr = ?");
try {
ps = connection.prepareStatement(update);
ps.setDate(1, Date.valueOf(p.getBirthDate()));
ps.setInt(2, p.getPensionInsuranceNumber());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
Спасибоза вашу помощь