У меня есть БД с примерно 1600+ записями, все записи читаются медленно, поэтому у меня возникла идея использовать 2 потока для получения данных.У меня есть следующие функции, но я не чувствую, что это быстрее ...
private ArrayList<Worker> getWorkersOnMultipleThread() throws InterruptedException {
ArrayList<Worker> totalWorkers = new ArrayList<>();
ArrayList<Worker> totalWorkers2 = new ArrayList<>();
int total = db.getNumberOfWorkers();
int firstHalf, secondHalf;
firstHalf = total / 2;
if (total % 2 == 1) {
secondHalf = total / 2 + 1;
} else {
secondHalf = total / 2;
}
Thread t1 = new Thread() {
@Override
public void run() {
ArrayList<Worker> w1 = db.getHalfOfTheWorkers(firstHalf, true);
totalWorkers.addAll(w1);
}
};
Thread t2 = new Thread() {
@Override
public void run() {
ArrayList<Worker> w2 = db.getHalfOfTheWorkers(secondHalf, false);
totalWorkers2.addAll(w2);
}
};
t1.start();
t1.join();
t2.start();
t2.join();
totalWorkers.addAll(totalWorkers2);
return totalWorkers;
}
@Override
public ArrayList<Worker> getHalfOfTheWorkers(int limit, Boolean firstHalf) {
String sql;
ArrayList<Worker> workers = new ArrayList<>();
if (firstHalf) {
sql = "SELECT * FROM NAMES ORDER BY ID FETCH NEXT " + limit + " ROWS ONLY";
} else {
sql = "SELECT * FROM NAMES ORDER BY ID OFFSET " + limit + " ROWS";
}
try {
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
String name = rs.getString("name");
int id = rs.getInt("id");
workers.add(new Worker(id, name));
}
} catch (Exception ex) {
}
return workers;
}
Моя идея состояла в том, чтобы получить первые 50% записей в первом потоке, а вторые 50% во второмнить и, надеюсь, половину времени нужно для получения всех записейКажется, он не работает (я имею в виду, что он не выдает ошибку и прочее и имеет ту же скорость ...)
Main:
@Override
public void initialize(URL url, ResourceBundle rb) {
ArrayList<Worker> totalWorkers = new ArrayList<>();
try {
totalWorkers = getWorkersOnMultipleThread();
System.out.println(totalWorkers.size());
} catch (InterruptedException ex) {
Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
}
}