【问题标题】:MySQL only shows some data that is inserted by HibernateMySQL 只显示 Hibernate 插入的一些数据
【发布时间】:2019-05-30 17:43:39
【问题描述】:

我有一个 Java 应用程序,它通过 Hibernate 将数据从一个非常大的文本文件加载到 MySQL。到目前为止,该应用程序似乎工作正常 - 数据已加载。

然后我想在应用程序插入数据的同时监控它的进度,所以我写了一个小的命令行实用程序,基本上查询select count(*) from my_table;

第一次运行此查询时(从 CLI 或 MySQL Workbench),我得到了正确数量的记录,正如预期的那样。此查询的所有后续执行返回完全相同的数字!即使数据加载应用程序仍在运行!

如果我停止并启动 MySQL 进程,查询记录数会显示 正确 数字,因为数据加载应用程序会报告它。

我以前从未见过这样的事情。看起来这里发生了一些奇怪的 MySQL 缓存问题,我担心它可能会导致其他可能想要访问此数据库的非 Hibernate 应用程序出现问题。

有谁知道如何调整 MySQL(或者可能是 Hibernate)以便 MySQL 始终显示正在添加到数据库中的内容?

技术细节:

  • MySQL:5.7.26,在 docker 容器中,使用 InnoDB 存储
  • 休眠版本:5.4.2.Final
  • 春季版:5.1.7.RELEASE

【问题讨论】:

  • MySQL 不会向您显示运行导入的事务尚未提交的任何内容。这就是 ACID 中的 I:事务之间的隔离。
  • 我让框架通过使用@Transactional (org.springframework.transaction.annotation.Transactional) 注释来注释持久化数据的方法来管理事务。我认为用@Transactional 注释的方法会在方法的末尾提交,并且该方法应该插入1行。所以我希望能够在插入新数据时看到它。
  • 调用FLUSH TABLES 似乎可以解决这个问题,因为在我刷新表之后,我可以看到应用程序添加了多少记录。我只是不确定为什么需要显式刷新表。

标签: java mysql hibernate mysql-5.7


【解决方案1】:

调用FLUSH TABLES 似乎可以解决这个问题,因为在我刷新表之后,我可以看到应用程序添加了多少记录。

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多