JPA工厂bean还是缓存管理器
您将开发您的站点,并将其部署到生产中。假设您有大量的通信量,您将需要优化您的资产(javascript和CSS)。有些东西对于图像也是有效的,但是还有更多的话要说,所以我将重点讨论CSS和javascript。比你想的要复杂得多。以下是步骤:
- Merge-所有的javascript和CSS文件都应该合并到一个文件中,这样浏览器只会触发一个请求。框架有时会有标记来实现这一点,否则您必须在构建中合并它们,然后使用合并的版本。
- Minify-在文件合并之前或之后,您需要缩小它们。也就是说,去掉所有无用的符号,这些符号使文件可读,但增加了文件的大小。通常在构建应用程序时会发生这种情况,尽管小型化的即插即用缓存也是一个很好的选择。
- 版本/散列-通常您的资产应该被浏览器缓存很长时间,所以当您进行更改时,您需要一个很好的方法来使浏览器刷新它们。这就是为什么您可以在应用程序中配置的版本(/样式/1/main.css),或者计算资源的散列并将其用作自动版本的原因。(当然,总是将长到期头设置为资产,以便每个用户只请求它们一次)
- Gzip-在合并和缩小文件之后,您应该在将它们发送到浏览器之前将它们压缩。这是由大多数服务器和/或框架处理的,因此听起来很容易。但是读下去会有一些并发症
- CDN/资产服务器/服务器缓存--这是造成混乱的困难部分。您不希望您的资产在每次服务时都从磁盘加载、合并、缩小和压缩,因为这需要资源,而且资产也不会经常更改。这就是为什么您将它们放置在CDN中,或者使用带有某些缓存的自定义资产服务器,比如前面的Varish。理想情况下,您应该能够将CDN指向您的服务器,该服务器动态地执行上述所有操作。但通常情况下,您应该预先生成该资产的版本化、压缩、合并和缩小版本,并将其部署到某个地方。
还有一个复杂的问题:开发模式。您的应用程序应该支持非缓存的,动态的,通过上述步骤。有许多实用程序可以帮助您实现这一点。罗尔便说一句,我不推荐)其他人也有自己的选择。但是,有一件重要的事情您应该尝试遵循:始终喜欢动态地生成资产的最终形式(通过站点/框架),并且避免在构建过程中执行上述任何操作。如果您将其放入构建中,它会自动变得更加繁琐--您需要发布两个版本(gzip和non-gzip),合并Web上下文之外的资源(构建与web无关),在构建期间追加资产版本(如果您不使用基于哈希的自动版本控制)。然后,打包的资产需要以某种方式分发给CDN或您的资产服务器。如果你把它变成动态的,你只需要你的框架来支持网页中使用的“资产url”属性。这是如何运作的:
https://www.xiaohongshu.com/discovery/item/618c9fef000000000102fce7
- 生成页面时,将使用资产url指向资产服务器/cdn。
- 您的应用程序仍然能够动态地为资产提供服务,以便cdn/Asset服务器能够获取它们。
这意味着您应该将资产打包在应用程序中,而不是在应用程序之外。这是有争议的,有些人更喜欢将它们分别打包并分发,但是随着上述所有步骤的完成,管理起来就变得更加困难了。这里的最后一点是如何将更改部署到资产--它是与整个应用程序一起进行的,还是只与CSS和js文件一起部署的?如果资产是单独打包的,则可以单独部署它们。否则,您将不得不部署整个应用程序(或手动复制文件)。选择哪一个更适合你。但是要记住,这并不容易,您应该在开发过程的早期对它进行一些思考。
如果使用Spring和JPA,则很可能使用ehcache(或其他缓存提供程序)。您可以在两个不同的场景中这样做:JPA二级缓存和Spring方法缓存。
在配置应用程序时,通常会设置JPA提供程序的第二级缓存提供程序(在我的示例中是Hibernate),还可以使用“cache”命名空间配置Spring。一切看起来都很好,你继续做这个项目。但有个警告。如果您遵循最简单的方法,您将得到两个单独的缓存管理器,它们加载相同的缓存配置文件。这本身并不坏,但需要考虑的是--您真的需要两个缓存管理器以及由此可能产生的问题吗?
https://book.douban.com/review/13985266/
也许你不知道。所以你得辞掉多余的经理。为此,需要将Spring缓存管理器设置为Shared:
|
1
2
3
4
|
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="shared" value="true" /></bean> |
这意味着Spring不会创建缓存管理器的新实例,而是将重用Hibernate已经创建的实例。现在,这里需要考虑的是--这取决于bean创建的顺序--JPA工厂bean还是缓存管理器工厂bean将是第一个。幸运的是,这对最终结果并不重要,因为SingletonEhCacheRegionFactory如果找到现有缓存管理器实例,则重用它。
https://www.jianshu.com/p/708460d2990e
所以,现在您已经让缓存管理器JVM-singleton。但是,如果部署了多个应用程序,并且正在使用JMX,则可能会遇到另一个问题。缓存管理器将自己注册为JMXbean。但是,当您有单例时,多个应用程序将尝试多次注册相同的缓存管理器,这将失败。结果将是日志中的几个异常,以及无法控制多个模块的缓存管理器。如果使用类似Terracotta之类的东西(缓存管理器标识很重要),同样的问题会产生副作用。幸运的是,你有一个简单的解决办法。只需向上面显示的bean定义添加一个属性:
|
1
|
<property name="cacheManagerName" value="${module.name}" /> |
${module.name}属性解析为PropertyPlaceholderConfigurer并且每个Webapp都是可配置的,因此每个Webapp可以有不同的模块名。这样,缓存管理器就可以通过JMX以指定的名称访问。
总的来说,对缓存管理器要小心。即使您使用的是不同的缓存、JPA和DI提供程序,也应该验证上面描述的场景。

浙公网安备 33010602011771号