Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Database 是否在ehcache查询缓存未命中后禁用数据库往返?_Database_Hibernate_Ehcache_Roundtrip - Fatal编程技术网

Database 是否在ehcache查询缓存未命中后禁用数据库往返?

Database 是否在ehcache查询缓存未命中后禁用数据库往返?,database,hibernate,ehcache,roundtrip,Database,Hibernate,Ehcache,Roundtrip,我使用hibernate+ehcache并正确配置缓存属性。在应用程序启动时,我们初始化缓存,并通过ORM向数据库发出所有可能的查询。 如果输入了“有效的参数组合”,则此操作非常有效,否则会导致缓存未命中,从而导致到数据库的往返。数据完全是静态的 70%的情况都是未命中的,因此,如果缓存未命中可以按查询/实体级别进行不同的处理,我们可以获得很多好处 如果在预热后发生缓存未命中,是否有方法阻止hibernate+ehcache进入数据库?hibernate中可能有API钩子吗 在理想情况下,缓存预

我使用hibernate+ehcache并正确配置缓存属性。在应用程序启动时,我们初始化缓存,并通过ORM向数据库发出所有可能的查询。 如果输入了“有效的参数组合”,则此操作非常有效,否则会导致缓存未命中,从而导致到数据库的往返。数据完全是静态的

70%的情况都是未命中的,因此,如果缓存未命中可以按查询/实体级别进行不同的处理,我们可以获得很多好处

如果在预热后发生缓存未命中,是否有方法阻止hibernate+ehcache进入数据库?hibernate中可能有API钩子吗

在理想情况下,缓存预热后根本不执行DB访问

短暂性脑缺血发作


Frank

考虑到您的配置,您有几个选择:

  • 在Ehcache级别终止
  • 在休眠级别终止
  • 在JDBC级别终止
免责声明:下面提到的两个都不是完整的解决方案-事实上,它们可能无法实现。但我会从那里开始挖掘

我认为在Ehcache级别可以做的事情不多,因为如果元素不存在,缓存层只返回
null
,Hibernate收回控件并从数据库中获取条目。您可以返回一些预定义的值(您知道该值无效,意味着不存在),但这有点代码味道

在Hibernate级别,您可以定义一个响应
LoadEvent
。但不确定这是否可以应用于查询


与Hibernate类似,您也可以使用。这可能并不理想,因为您仍然会有Hibernate开销,但这仍然比等待数据库往返(我想每个请求大约50毫秒?)要好得多。

是的,得出了相同的结论,我同意Hibernate可能应该用于实现所需的行为。我浏览了HibernateJava文档,根据我的理解,我必须处理:*SingletoneCacheProvider。。。作为缓存orm管道*QueryKey*StandardQueryCache*StandardQueryCacheFactory*Hibernate拦截器的入口点(我还不知道在这方面我能从中获得什么,请看)