Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于范围分页的数据库缓存策略_Java_Mysql_Database_Caching - Fatal编程技术网

Java 用于范围分页的数据库缓存策略

Java 用于范围分页的数据库缓存策略,java,mysql,database,caching,Java,Mysql,Database,Caching,需要关于缓存和分页的建议。情况是这样的。。 用户给变量范围(比如变量X从x1到x2,变量Y从y1到y2),我从数据库中获取数据,然后一些逻辑对结果进行排序,并将第一页返回给用户 对于每个用户,这些(X&Y)都是不同的。 问题开始当用户要求第二页时,我必须启动查询并再次排序结果,然后给出第二页结果 必须针对每个用户请求执行此操作。。 你能为我推荐一些缓存策略吗。。 (Java+mysql) 如果我不清楚,请告诉我 如果对DB访问使用hibernate,则可以允许second\u level\u c

需要关于缓存和分页的建议。情况是这样的。。 用户给变量范围(比如变量X从x1到x2,变量Y从y1到y2),我从数据库中获取数据,然后一些逻辑对结果进行排序,并将第一页返回给用户

对于每个用户,这些(X&Y)都是不同的。 问题开始当用户要求第二页时,我必须启动查询并再次排序结果,然后给出第二页结果

必须针对每个用户请求执行此操作。。 你能为我推荐一些缓存策略吗。。 (Java+mysql)
如果我不清楚,请告诉我

如果对DB访问使用
hibernate
,则可以允许
second\u level\u caching
自动获取EhCache缓存结果。阅读更多相关内容

我假设用户可以请求eg x1到x100,并获得100个结果,并且您希望同时显示使用eg 10结果分页的结果

我有三个建议,每个都有不同的优点

依靠MySQL进行缓存。
MySQL非常擅长缓存。如果您多次重复同一查询,MySQL将尝试为您缓存结果,使后续查询非常快速(它们来自内存,不接触磁盘)。如果您查询x1到x100,并且只显示x1到x10,那么当您想要显示第2页时,您可以再次查询x1到x100,MySQL可以使用自己的内部缓存。MySQL缓存显然使用RAM,所以您需要确保您的DB服务器有足够的RAM,以便能够有效地进行缓存。您必须估计需要缓存多少数据,并看看这是否可行

这是一个简单的解决方案,硬件(RAM)相当便宜*

内部缓存
将整个x1到x100结果保存在应用程序中(例如在用户会话中),并显示所请求页面的相关结果。这类似于使用MySQL进行缓存,但您正在将缓存移到更靠近需要缓存的位置。如果您这样做,您必须自己考虑缓存管理之类的事情(例如缓存何时过期、管理内存使用)。为此,您可以使用现有的缓存工具,如ehcache

预取而不是缓存
缓存需要大量内存。如果缓存是不可行的,那么您可能需要考虑预取策略。如果没有缓存,您可能会遇到响应速度慢的问题,但通过预取,问题会有所缓解。在这里,用户查看一个页面后,您可以异步查找用户可能查看的其他页面(通常是下一页和上一页)。查找可能很慢,但您是在用户请求之前进行查找的,因此当用户需要时,它会立即准备好

预取是web应用程序中相当常见的技术;当用户查看页面时,当用户查看当前页面时,应用程序可以使用ajax在后台将上一页和下一页加载到DOM中。当用户单击“下一步”链接时,应用程序修改DOM以显示下一页,而不必触摸服务器。对于用户来说,响应似乎是即时的


*我曾经参加过MySQL管理课程,在谈到性能时,导师说任何人都应该做的第一件事就是为服务器安装尽可能多的RAM。大多数服务器都可以使用RAM(100 Gb)来填充,但所需费用低于3天性能调整课程的费用。

还有一点需要说明的是,变量范围可能与其他用户请求重叠。但我仍然必须对查询结果进行排序,才能找到下一页。。我可以有一些标记,或者可以存储ID列表吗?使用hibernate,您仍然可以使用
ORDER BY
在质量级别进行排序。您想在应用程序(而不是数据库)级别进行排序吗?我将使用您的第二个选项。。触发查询并不是什么大问题,逻辑顺序是消磨时间的方式。。我想缓存x100结果,并可以给出下一页。。预回迁在我的情况下不起作用。。因为我必须加载100个结果才能使它们有序。所以在下一页我仍然需要前10页来进行适当的排序,其他方面我无法知道,哪10个结果出现在了第一页…我想在前面介绍我在问题评论中提到的另一件事。这个变量的范围可以相互重叠,所以如果我可以有一些数据结构以范围格式存储这个信息,那么对于其他用户,我也可以映射到其他用户的结果。。我懂一些我的语言,模糊的语言解释了我的问题。。一定要让我知道什么部分是不可理解的。。