POS-система, которая разработана с использованием транзакции продажи java swing hit для таблицы в базе данных mysql, размещенной на сервере mysql. текущая версия 8.0 (ранее мы использовали 5.6). Мы использовали соединение JDBC для связи с БД. Первый год live run работал отлично, без каких-либо проблем, связанных с записью в БД. В этом году мы размещаем систему и дБ в той же POS-машине.
База данных является локальной для POS. В следующем году мы перенесли базу данных на другой сервер и сохранили POS на машине POS, подключенной к той же локальной сети. Затем, через несколько месяцев, возникла проблема: случайно пропущенные записи в таблице транзакций продаж (не только из-за того, что в записях пропущены некоторые другие записи в другой таблице). Обратите внимание, что теперь 2 POS-машины вставляют транзакции продаж в одну и ту же базу данных. У обоих компьютеров есть отдельные журналы местный для них.
Чтобы найти решение проблемы, мы зарегистрировали все транзакции в POS в текстовом файле. Найдите здесь https://drive.google.com/file/d/1t5xjQxl1g6ebZ7-bRE1O-LKN--4S3-70/view?usp=sharing
Этот журнал записи ударил только после вставки записи в таблицу. Идентификатор транзакции - это идентификатор продающей таблицы транзакций, получаемой путем запроса записи с использованием других значений в качестве параметра фильтра сразу после вставки. Параметры являются уникальными, поскольку мы также использовали время транзакции.
Проблема в том, что даже после попадания в журнал некоторые транзакции отсутствуют в таблице. Например, допустим, в журнале записано 1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016
. Но в базе данных есть только 1000,1001,1002,1003,1004,1008,1009,1010,1011,1014,1015,1016
.
Операции по продаже 1005,1006,1007,1012,1013
отсутствуют.
Изначально мы использовали mysql 5.6, а теперь мы использовали 8.0 в обеих версиях, и у нас возникла одна и та же проблема.
Это код для подключения к базе данных
package databaseconfigurationmodule;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import util.PropertyUtil;
public class DBConnectionManager {
private String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private Connection connection;
private static DBConfigInfo dbcI;
public Connection getConnection() {
return connection;
}
private DBConnectionManager() {
//JDBC_DRIVER = "com.mysql.jdbc.Driver";
JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
try {
dbcI = PropertiesManager.getDBConfigurationInfo(PropertyUtil.propertyConfigFile);
Class<?> forName;
forName = Class.forName(JDBC_DRIVER);
connection = DriverManager.getConnection("jdbc:mysql://"+dbcI.getHost()+":3306/"+dbcI.getDatabase()+" ?autoReconnect=true&useSSL=false", dbcI.getUserName(), dbcI.getPassword());
} catch (ClassNotFoundException | SQLException ex) {
MessagesManager.displayMessage(ex.getMessage()+"\n"
+"1.Check database host server is up and running"+"\n"
+"2.Check database host server firewall is blocking the access"+"\n"
);
}
}
public static DBConnectionManager getInstance() {
return DBConnectionManagerHolder.INSTANCE;
}
private static class DBConnectionManagerHolder {
private static final DBConnectionManager INSTANCE = new DBConnectionManager();
}
}
Вот как мы используем соединение для вставки записей
public static int save(Object object,boolean isLog){
try {
Transaction transaction = (Transaction)object;
String sql = "insert into transactions (ID,CUSTOMER_ID,CUSTOMER_NAME,CUSTOMER_TYPE,PAYMENT_TYPE,TRANSACTION_DATE,USER,USER_NAME,TOTAL_VALUE,TIME,SPLIT_CREDIT,CANCEL,IS_BY_PRE_ORDER)"
+ " values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
Connection con = DBConnectionManager.getInstance().getConnection();
PreparedStatement prs = con.prepareStatement(sql);
prs.setInt(1,transaction.getId());
if (transaction.getCustomer()!=null) {
prs.setInt(2,transaction.getCustomer().getId());
prs.setString(3,transaction.getCustomer().getName());
prs.setString(4,transaction.getCustomer().getType());
}
prs.setString(5, transaction.getPaymentType());
prs.setDate(6, transaction.getTransactionDate());
if (transaction.getUser()!=null) {
prs.setInt(7, transaction.getUser().getId());
prs.setString(8, transaction.getUser().getName());
}
else{
prs.setInt(7, transaction.getUser().getId());
prs.setString(8, transaction.getUser().getName());
}
prs.setDouble(9, transaction.getTotal_value());
prs.setTime(10, transaction.getTransactionTime());
if(transaction.getSplitCredit()!=null){
prs.setDouble(11, transaction.getSplitCredit());
}
else{
prs.setDouble(11, 0);
}
prs.setBoolean(12, false);
prs.setBoolean(13, transaction.getIsByPreOrder());
prs.executeUpdate();
ResultSet res = view(FROM_ALL_COLUMNS, transaction);
res.next();
int id = res.getInt(1);
transaction.setId(id);
if (isLog) {
CommonUtil.getInstance().logTransactionInsert(transaction);
}
return id;
} catch (Exception ex) {
Logger.getLogger(TransactionOperations.class.getName()).log(Level.SEVERE, null, ex);
}
return 0;
}
Пожалуйста, учтите также следующие факторы
Ошибка не выдана.
Мы также проверили время ожидания сети, но оно нормально, время ожидания сети отсутствует.
Пользователь сообщает о каком-то зависании кассовых терминалов в продажах, когда спешит с покупателем.
А также пользователь сообщил, что, например:
Он ввел в систему 33 поп-корна. Он проверил это в отчете около 13:00 по всем 33 перечисленным. Когда он перезапускает отчет около 14:00, отображается 0
.
Мне нужно выяснить, связано ли это с проблемой java-соединения или с db-сервером.
На сервере базы данных мы используем root с полностью предоставленными привилегиями.
удаленный доступ разрешен для пользователя root.
Кто-нибудь испытывал это раньше? Пожалуйста, помогите мне
заранее спасибо