java - 使用不需要的值在 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 的回复得到验证,因为它不仅有帮助。对于可能遇到类似问题的每个人,请首先详细检查您的数据库,看看它是否来自那里而不是来自您的代码。
解决方案
追踪数据中的异常是艰巨的,但JFreeChart
至少可以使结果更易于可视化。一些启发式测试:
要验证表格列表中假定的重复项确实是重复项,请将时间戳格式化为包括毫秒,例如将 an 添加
S
到 aSimpleDateFormat
或A
aDateTimeFormatter
。为了学习,暂时将查询直接传递给
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; } … }
推荐阅读
- javascript - 带有 Javascript 的正则表达式
- qt - 在 Wayland 下运行 Qt 应用程序
- jquery - 如何在单击或点击时获取 jQuery 以运行相同的功能
- python - sentry POST 数据未传播到 UI
- python - 在 PySpark 中合并两个数据框
- oracle - 00904 创建表时
- git - 为什么 .. 和 ... 的含义在 git diff 和 git log 之间翻转?
- python - 将列表列表随机分成两半
- git - Git - 在从远程拉取之前保留并忽略文件更改
- mysql - 如何在 MYSQL 中插入来自不同数据库的新表值及其匹配 id