【发布时间】: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