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
Hibernate 何时进行缓存/二级缓存?有具体的实际情况吗?_Hibernate_Caching_Ehcache_Second Level Cache_Oscache - Fatal编程技术网

Hibernate 何时进行缓存/二级缓存?有具体的实际情况吗?

Hibernate 何时进行缓存/二级缓存?有具体的实际情况吗?,hibernate,caching,ehcache,second-level-cache,oscache,Hibernate,Caching,Ehcache,Second Level Cache,Oscache,我正在开发一个基于web的应用程序,它属于一家汽车制造商,是在SpringHibernate中使用MSSQLServer2005数据库开发的 通过该应用程序,最终用户可以通过基于web的界面请求创建汽车、公共汽车、卡车等。当用户登录时,会显示一个HTML表单,用于捕获车辆的技术规格,例如,如果有人想要请求车辆,他可以指定发动机品牌/型号、轮胎、底盘细节等。创建车辆请求屏幕上总共有100个表单元素,其中30%是用于显示选项的下拉选择框,即允许用户选择其中一个选项。这些选择框由数据库主数据中存储的值

我正在开发一个基于web的应用程序,它属于一家汽车制造商,是在SpringHibernate中使用MSSQLServer2005数据库开发的

通过该应用程序,最终用户可以通过基于web的界面请求创建汽车、公共汽车、卡车等。当用户登录时,会显示一个HTML表单,用于捕获车辆的技术规格,例如,如果有人想要请求车辆,他可以指定发动机品牌/型号、轮胎、底盘细节等。创建车辆请求屏幕上总共有100个表单元素,其中30%是用于显示选项的下拉选择框,即允许用户选择其中一个选项。这些选择框由数据库主数据中存储的值填充。通过在后端运行存储过程,此主数据每周至少更改一次

该应用程序在全球约有10000名用户,我们预计新车申请每天最多可点击5000次,即显示5000次创建车辆表单

我的问题是,我是否需要使用二级缓存选项来存储从主数据显示的表单字段的值

由于这些值是从一组每周只更改一次的主表中显示的,因此我认为主数据的缓存将有助于提高性能,但我不太确定,因为我还没有将我的应用程序转移到生产环境中,以查看真正的性能,以及是否真的需要缓存

如果我使用缓存,我可能需要花一两周的时间研究如何配置它,我不想花一两周的时间看不到任何真正的好处


在这方面需要专家的帮助。另外,如果有人能够分享实际场景,那么真正需要缓存的地方也会有很大帮助。

每天5000次点击听起来像是流量很大,但请记住,这只是每分钟3.5次点击。假设您的数据库可以在不到几百毫秒的时间内执行呈现页面所需的所有查询,您可能就没事了

也就是说,缓存是很好的下一步。听起来查询缓存可能对您有用,因为您的数据很少更改

我的问题是,我是否需要使用二级缓存选项来存储从主数据显示的表单字段的值

你不需要,但你可以。和只读数据或大部分已读数据,如不可变参考数据国家/地区、州/地区、税务代码,或者在您的情况下,发动机、轮胎、底盘等,都是二级缓存和查询缓存(如果需要)的完美候选

由于这些值是从一组每周只更改一次的主表中显示的,因此我认为主数据缓存将有助于提高性能

嗯,取决于硬件的多少、集群的大小等,你的应用程序可能只能处理负载。但正如我所写,缓存只读数据非常常见:

每次访问数据库都没有实际意义 从长远来看,即使现在不是问题,避免这些打击也不会有什么坏处 它们不会经常更改,缓存它们很容易处理并且工作得很好 请记住,缓存对象意味着它们的对象表示不会被垃圾收集,因此可能会增加内存需求

但我不太确定,因为我还没有将我的应用程序转移到生产环境中,以查看真正的性能,以及是否真的需要缓存

老实说,您不应该等到生产时才知道是否存在性能问题。您应该在专用环境中加载或压力测试您的应用程序,然后调整您的应用程序、JVM、应用程序服务器、数据库等。别忘了,您无法改进无法衡量的东西

如果我使用缓存,我可能需要花一两周的时间研究如何配置它,我不想花一两周的时间看不到任何真正的好处

这并不复杂。您需要在Hibernate配置中激活二级缓存和查询缓存,并选择缓存提供程序。我的建议是使用EhCache,相关属性包括:

hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
然后,将相关实体标记为可缓存,如果不按id加载,则缓存用于检索数据的查询


如果您决定使用二级缓存,则必须手动退出缓存,因为您不是通过Hibernate API更新数据,而是在SessionFactory上使用包含退出方法的存储过程。这将需要一些代码行。如果可以,重新启动应用程序将是另一种选择。

非常感谢。这回答了我的问题。