首页 > 解决方案 > 使用不需要的值在 Java 中执行两次(错误)的查询

问题描述

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

当我尝试在另一个表中插入我的值时,查询似乎被执行了两次,因为我多次得到相同的时间戳......

这是我的代码的一部分:

    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;
    }

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

标签: javamysqljfreechart

解决方案


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

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

  • 为了学习,暂时将查询直接传递给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平移/缩放控件来检查数据;添加合适的按钮(此处显示),如果它能让同事更容易看到您的发现。

  • 按照设计,JDBCXYDataset执行由 a 定义的查询String。如果您的设计需要显示由 a 定义的查询中的数据PreparedStatement,您可以使用现有的实现作为指导。

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

推荐阅读