使用Java swing hit sales交易开发的POS系统,用于mysql服务器托管的mysql数据库中的表。当前版本是8.0(之前使用的是5.6)。我们使用JDBC连接与db通信。第一年的实时运行非常完美,没有任何与数据库记录相关的问题。那一年,我们将系统和数据库托管在同一台POS机中。 数据库是POS本地的。明年,我们将数据库移至另一台服务器,并将POS保持在连接在同一LAN中的POS机中。然后几个月后开始出现问题,即销售交易表中的记录随机丢失(不仅该记录在其他表中丢失了其他记录)。请注意,现在有2台POS机将销售交易插入同一数据库。两台机器都有单独的日志在他们本地。
为了找到解决问题的方法,我们将所有交易记录在POS文本文件中。在此处查找https://drive.google.com/file/d/1t5xjQxl1g6ebZ7-bRE1O-LKN--4S3-70/view?usp=sharing
此日志仅记录将记录插入表后的命中。交易ID是销售交易表的ID,它是在插入后通过使用其他值作为过滤器参数查询记录而获得的。参数非常独特,因为我们也使用了交易时间。
问题甚至在命中日志后,某些事务不在表中。例如,假设在日志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;
}
没有引发错误。
我们也检查了网络超时,但这很好,没有网络超时。
用户在急于与客户联系时报告了销售中的POS冻结。
还有用户报告例如: 他向系统输入了33个爆米花,并在下午1点左右的报告中检查了所有列出的33个。当他在下午2点左右重新运行报表时,显示0
我需要确定这是java连接问题还是数据库服务器问题。
在数据库服务器中,我们使用具有完全授予特权的root用户。 允许root用户进行远程访问。
有人曾经历过吗?请帮助我
预先感谢