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