Иногда не синхронизирую таблицы в реальном времени
В моем коде я пытаюсь синхронизировать таблицу в режиме реального времени. Пример: Если пользователь, который использует это программное обеспечение, использует другое устройство и добавляет запись или изменяет запись в БД, то другой пользователь сможет увидеть ее, используя свою таблицу вида сетки устройства.
В моей базе данных у меня есть столбец с именем "updDate" для каждой строки для хранения текущего "datetime", когда пользователь обновляет одну из своих записей в БД. Я использую два списка типа String для хранения 'updDate', чтобы получать значения из БД каждые 4 секунды, используя таймер.
два списка строковых типов... 01. 'initialArray' 02. 'actualArray'
'initialArray' вызывается при запуске программы, а сохранение значений в 'actualArray' вызывается с помощью пользовательского имени функции updateTableRecords(). Функция initTableRecords() используется для первоначального присвоения значений, а updateTableRecords() вызывается каждые 4 секунды, чтобы проверить, было ли изменено значение для updDate для синхронизации таблиц. "showTable" - это функция, которую я использовал для отображения "dataGridView", и она отлично работает.
Мой код иногда работает, а иногда не работает (не синхронизирует таблицы). Я не могу понять проблему. Вот мой код...
public class notify extends javax.swing.JFrame {
List<String> initialArr = new ArrayList<String>();
List<String> actualArr = new ArrayList<String>();
public notify() {
initTableRecords();
syncTable();
public void syncTable() {
Timer t = new Timer(4000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateTableRecords();
}
});
t.start();
}
public void initTableRecords() {
Connection conn = new ConnectorNew().ConnectorNew();
query1 = "select * from notify_prod";
try {
stmt1 = conn.createStatement();
rs1 = stmt1.executeQuery(query1);
while (rs1.next()) {
initialArr.add(rs1.getString("updDate")) ;
}
conn.close();
}
catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Something went wrong", "Error",
JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void updateTableRecords() {
Connection conn = new ConnectorNew().ConnectorNew();
query1 = "select * from notify_prod";
try {
stmt1 = conn.createStatement();
rs1 = stmt1.executeQuery(query1);
actualArr.clear();
while (rs1.next()) {
actualArr.add(rs1.getString("updDate")) ;
}
if(initialArr.size() != actualArr.size()) {
initialArr.clear();
initTableRecords();
}
for(int i=0; i<actualArr.size(); i++) {
if( !(actualArr.get(i).equals(initialArr.get(i))) ) {
DefaultTableModel model = (DefaultTableModel)notPr_table.getModel();
model.setRowCount(0);
showTable();
initialArr.clear();
initTableRecords();
}
}
conn.close();
}
catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Something went wrong", "Error",
JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}