在 Java 中使用不需要的值执行了两次(错误)查询

Query executed twice (by error) in Java with unwanted values

我正在使用 JFreeChart 在 Java 和 MySQL 中创建图表。

当我尝试将我的值插入另一个 table 时,查询似乎被执行了两次,因为我多次以相同的时间戳结束...

这是我的部分代码:

    private JDBCXYDataset createDataset() {
        try {
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:bd?serverTimezone=UTC","MySQL", "MySQL");
           
            conn.setAutoCommit(false);
            SQLException savedException = null;
            
            Statement st = conn.createStatement();
            st.execute("DROP TABLE IF EXISTS test ");
            st.execute("create table test(Table timestamp, Table float,Table float)");
            
            String Date_Debut = "2020-06-25 00:00:00";
            String Date_Fin = "2020-06-26 00:00:00";
            String sql1 = "INSERT INTO test (Table ,Table ,Table ) "
                    + "SELECT Table ,Table ,Table "
                    + "FROM Table "
                    + "WHERE Table BETWEEN ? AND ? ";
            
           try ( PreparedStatement ps = conn.prepareStatement(sql1)){
           
            ps.setString(1,Date_Debut);
            ps.setString(2, Date_Fin);
         
            ps.executeUpdate();
            ps.close();
            
            JDBCXYDataset jds = new JDBCXYDataset(conn);
            
            st.close();
            
            jds.executeQuery("SELECT Table ,Table ,Table FROM test");
            
            
            conn.commit();
            return jds;
           } catch (SQLException ex) {
               savedException = ex;
               conn.rollback();
           } finally {
               conn.setAutoCommit(true);
               if(savedException != null) {
                   throw savedException;
               }
           }
       } catch (SQLException ex1) {
           
       }
        return null;
    }

编辑:实际上,这些错误似乎是直接来自数据库的,版主可以根据需要删除此 post。但是,我对 Trashgod 的回复进行了验证,因为它非常有用。 对于可能遇到类似问题的每个人,请首先详细检查您的数据库,看看它是否不是来自那里而不是您的代码。

追查数据中的异常是艰巨的,但 JFreeChart 至少可以使结果更容易可视化。一些启发式测试:

  • 要验证表格列表中假定的重复项确实是重复项,请将时间戳格式化为包括毫秒,例如添加 SSimpleDateFormatADateTimeFormatter.

  • 为了学习,暂时把query直接传给JDBCXYDataset,加一个ORDER BY子句(未测试):

    jds.executeQuery(
          "SELECT Date_Heure, PV, SV FROM cmd3 "
        + "WHERE Date_Heure BETWEEN "
        + "2020-06-25 00:00:00 AND 2020-06-26 00:00:00 "
        + "ORDER BY Date_Heure");
    
  • 一样在 ChartFactory 中启用工具提示,以 就地 查看数据值。这可能会为您的 WHERE 子句建议附加条件,例如PV BETWEEN 5.1 AND 5.9.

  • 使用交互式 JFreeChart pan/zoom 控件,已讨论 to examine the data; add suitable buttons, shown ,如果它能让同事更容易看到您的发现。

  • 按照设计,JDBCXYDataset executes a query defined by a String. If your design needs to display data from a query defined by a PreparedStatement, you can use the existing implementation 作为指导。

    public class PreparedDataset extends AbstractXYDataset
        implements XYDataset, TableXYDataset, RangeInfo {
    
        private final PreparedStatement ps;
    
        public PreparedDataset(PreparedStatement ps) {
            this.ps = ps;
        }
        …
    }