使用springboot从Mysql中获取100万个数据以执行业务逻辑[已关闭]

0s0u357o  于 2022-11-21  发布在  Mysql
关注(0)|答案(3)|浏览(306)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

三年前就关门了。
Improve this question
我在一个从Mysql到我的Springboot应用程序获得非常大量的数据的情况。
那么,有没有更好的方法来实现这种情况呢?

jmo0nnb3

jmo0nnb31#

最大的问题是:您希望如何处理这1000万条记录?JPA主要适用于加载有限的对象图,然后操作该对象图并将其刷新回数据库中。这只适用于相当有限的数据量。如果数据量很大,开销就会变得非常高,好处往往会消失。
如果没有更多的知识,我建议您放弃JPA,考虑使用更低级的方法来访问数据。尤其是Springs JdbcTemplate经常会派上用场。如果适用的话,还有使用RowCallbackHandler的方法,因为它不假设您将ResultSet转换为其他任何东西,而只是处理它,例如,为了将数据写入某个文本文件。
另一个需要注意的问题是处理大量数据时的Spring Batch

eiee3dmh

eiee3dmh2#

1.用户无法一次在UI中显示1000万条记录以供用户理解。我建议您通过UI导航保留每页上所需记录的数量。
1.如果这1000万条记录要在UI中再次进行事务处理,我建议您在保存时将事务处理过的数据保留在这些行中,这样就不需要再次迭代。
1.您可以标识唯一列并配置组合主键。这将减少查询时间。
1.最小化联接。如果联接的表太多,请减少联接数。不要过度规范化数据库。
1.如果要以某种格式将图像保存在数据库中,请将其移动到文件系统,然后将图像的文件系统路径和名称保存在数据库中。
1.减少列数。例如:在100个数据栏中,您可能只需要5或10个数据栏即可在任何时间点显示在UI中,请将这些数据栏保存在一个表格中,而将剩馀的95-90个数据栏储存在另一个表格中。请注意查询的长度。
1.使用连接池机制。

idfiyjo8

idfiyjo83#

如果加载100万行需要2-3秒,但加载1000万行需要24分钟,那么我认为这是内存问题。JPA维护了很多关于持久对象的附加信息,因此只要对象在事务内,内存需求就可能远远高于存储数据本身的实际需求。
因此,将数据以较小的数据块(比如100万个)* 加载到事务之外 *,然后手动将它们组装到一个集合中。如果您需要这些记录用于某种计算,那么就可以了。如果您还需要对它们进行修改,则需要手动处理修改并保存。
虽然我仍然相信如果你能和我们分享最初的问题我们会找到更好的解决方案...

相关问题