【发布时间】:2015-07-16 20:02:06
【问题描述】:
以下是我从应用程序角度来看的场景。
我们有 2 个应用程序 (.war) 文件将在同一个应用程序服务器实例(主要是 Tomcat 8)中运行,在生产中我们可以将 App1 部署在 100 个服务器上,而 App2 仅部署在这 100 个服务器中的 50 个服务器上(App2不需要分发那么多)
现在这 2 个应用程序 (.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 服务器提供程序,因为我正在做内存集群,即缓存将在应用程序内存中。
下面是我的代码的 sn-p。
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 管理控制台我可以看到只创建了 1 个缓存,但它说 GET 在这个缓存上执行了两次。
【问题讨论】:
标签: java caching web-applications hazelcast jcache