Mysql数据库记录丢失,但肯定已插入并记录在本地

时间:2018-08-28 14:27:30

标签: java mysql jdbc

使用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用户进行远程访问。

有人曾经历过吗?请帮助我

预先感谢

0 个答案:

没有答案