【问题标题】:Database persist in background数据库在后台持续存在
【发布时间】:2016-12-08 16:35:38
【问题描述】:

我正在开发一个字典应用程序并使用许多外部资源来收集数据。 这些数据仅是第一次从这些来源收集,之后我将其保存到我的数据库并从他们那里获取。

我面临的问题是,像 set、cut、put 等一些词有 100 种含义,还有很多例子。将所有这些数据持久化到 mysql 大约需要 10 秒。我正在使用 mybatis 来持久化数据。正因为如此,响应时间被搞砸了。如果没有这个数据库持久化,我会在 400-500 毫秒内得到响应,如果我在从源获取数据后直接显示数据。

我正在尝试找到一种在后台保存数据的方法。我使用的是 MVC 模式,所以 dao 层是分开的。

在 dao 层中使用线程作为解决方案是个好主意吗?或者我应该使用像 Kafka 这样的消息传递工具来发送消息以在后台保留给定的单词?我还可以做些什么?

注意:我现在更喜欢 MySQL 作为数据库,以后可能会使用 redis 进行缓存。

【问题讨论】:

  • 10 秒将数据保存到 MySQL 意味着您没有有效地使用硬盘的 I/O。用事务块包装您的插入查询。您不需要 redis 进行缓存,如果使用得当,MySQL 速度非常快(遗憾的是,人们不知道如何做到这一点,他们也不研究)。您的插入应该足够快。请注意使用InnoDB 引擎,并且您的innodb_buffer_pool_size 变量足够高,因此MySQL 不必为所有事情都使用您的HDD。
  • 它实际上是一个接一个地触发这些多个请求。所以这就像 100 个插入查询。此外,日志记录需要时间,但即使我禁用日志记录,我认为它也不会很快持续。谢谢。我将增加 innodb 缓冲区大小并使用事务块,并让您知道结果
  • 因此将这 100 个查询包装在 1 个事务中。您将花费 1 次而不是 100 个 I/O。这样会很快。
  • 看看 spring-batch,如果你对使用 spring-batch 不感兴趣,你可以通过 MyBatisItemWriter 实现,它在单个事务中批处理并执行你的插入查询/或者如果需要您可以使用 writer 属性更改为多个事务。 mybatis.org/spring/apidocs/reference/org/mybatis/spring/batch/…
  • 如何在 mybatis 中使用事务。我正在从 config xml 文件加载所有配置。使用 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);获取 sqlSessionFactory.. 最后是 sqlSessionFactory.openSession(true);开始一个会话。我无法理解,我如何开始交易?另外,我正在用 xml 编写查询,而不是使用注释。你能帮助如何开始交易吗? @KarthikPrasad

标签: java mysql multithreading mybatis


【解决方案1】:

我对问题的全球回答 + 进一步的 cmets:

不要使用 Mybatis foreach 批量插入。相反,您应该使用 ExecutorType ReuseBatch(Read the documentation) 在要存储的对象列表的 java 迭代中执行语句。

对于事务,在main mybatis-config xml中,配置环境:

  • transactionManager 在代码session = sessionFactory.openSession(); session.commit(); session.rollback(); 中输入JDBC 来管理事务
  • transactionManager 输入 MANAGED 让容器管理。

此外,您可以让网络应用发送响应,而新线程则需要时间来存储数据。

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 2014-03-10
    • 2019-03-05
    • 2015-06-10
    • 2018-03-11
    • 2023-03-02
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多