以下是我从“应用程序”角度出发的方案。
我们有2个应用程序(.war)文件将在同一个应用程序服务器实例(主要是Tomcat 8)中运行,在生产中我们可以在100个服务器上部署App1,而App2仅部署在100个服务器上的50个服务器上(App2)不需要如此分配)
现在这两个应用程序(.war)依赖于一个常见的自定义jar(一些实用程序类)
我打算在我们的应用程序中使用Jcache API和hazelcast实现。我在我的pom.xml中添加了以下依赖项
<!-- JSR 107 JCache -->
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- Hazelcast dependency -->
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>3.4</version>
</dependency>
计划是在这个常见的自定义jar中编写一个实用程序CacheManager,它将由App1和App2共享
我打算只在内存群集中使用 hazelcast服务器提供程序,即缓存将在应用程序内存中。
以下是我的代码片段。
public class PPCacheManager {
// Loads the default CacheProvider (HazelCast) from hazelcast.xml which is
// in classpath
private static CachingProvider defaultCachingProvider = Caching.getCachingProvider(); //
// Loads the default CacheManager from hazelcast.xml which is in classpath
private static CacheManager defaultCacheManager = defaultCachingProvider.getCacheManager();
// Some more code goes here...
我的hazelast.xml
<hazelcast xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.4.xsd"
xmlns="http://www.hazelcast.com/schema/config">
<cache name="commonClientCache">
<key-type class-name="java.lang.String"></key-type>
<value-type class-name="java.lang.Object"></value-type>
<statistics-enabled>true</statistics-enabled>
<management-enabled>true</management-enabled>
<read-through>true</read-through>
</cache>
</hazelcast>
现在我对这种方法有几个疑问。
这是实现内存缓存的好方法(目前我们不寻找群集缓存),这段代码应该放在常见的自定义jar中还是其他地方?
我计划加载一些来自数据库的主数据(两个应用程序都需要这些数据),因此不确定应该如何以及在何处将此数据加载到内存中。 注意:我不想进行延迟加载...我想先加载这些主数据。
我应该在哪里添加缓存关闭代码以避免内存泄漏问题,因为这两个应用程序共享此缓存。
感谢您的任何其他建议或帮助。
更新
同样通过实施这种方法,我将为应用程序分别提供2份缓存副本,或者两者都共享一份副本。?
我已经在我的应用程序中实现了这种方法,并且从Hazelcast管理控制台我可以看到只创建了一个缓存,但它说GET在此缓存上执行了两次......
答案 0 :(得分:0)
Hazelcast是您尝试做的完美解决方案。绝对没有延迟加载。如果你有共享内存,你不需要这样的东西。
到目前为止,在一个(Tomcat)JVM中有多少个实例,如果你实例化两次Hazelcast,你就有两个实例。它自动增加端口。但是,只要群集名称相同,两者都属于同一个群集(您调用&#34;缓存&#34;)。除了看起来有点傻(在单个JVM上分片)之外,你没事。为避免这种情况,您可以配置其中一个战争来实例化HazelcastClient。实用工具罐可以是相同的。它应该都在某些例如Spring配置 - 每个战争都有自己的副本。或者您可以将该配置放入两个外部目录并添加到catalina类路径。
关闭代码属于您实例化Hazelcast的同一个地方,即您的两场战争将有两次关机调用。您可以在Spring的任何高级配置(或自动装配)bean的destroy()中执行此操作,或将其放在Web App会话侦听器中。