我的应用程序

时间:2015-05-06 15:16:46

标签: java caching web-applications hazelcast jcache

以下是我从“应用程序”角度出发的方案。

我们有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>

现在我对这种方法有几个疑问。

  1. 这是实现内存缓存的好方法(目前我们不寻找群集缓存),这段代码应该放在常见的自定义jar中还是其他地方?

  2. 我计划加载一些来自数据库的主数据(两个应用程序都需要这些数据),因此不确定应该如何以及在何处将此数据加载到内存中。 注意:我不想进行延迟加载...我想先加载这些主数据。

  3. 我应该在哪里添加缓存关闭代码以避免内存泄漏问题,因为这两个应用程序共享此缓存。

  4. 感谢您的任何其他建议或帮助。

    更新

    同样通过实施这种方法,我将为应用程序分别提供2份缓存副本,或者两者都共享一份副本。?

    我已经在我的应用程序中实现了这种方法,并且从Hazelcast管理控制台我可以看到只创建了一个缓存,但它说GET在此缓存上执行了两次......

1 个答案:

答案 0 :(得分:0)

Hazelcast是您尝试做的完美解决方案。绝对没有延迟加载。如果你有共享内存,你不需要这样的东西。

到目前为止,在一个(Tomcat)JVM中有多少个实例,如果你实例化两次Hazelcast,你就有两个实例。它自动增加端口。但是,只要群集名称相同,两者都属于同一个群集(您调用&#34;缓存&#34;)。除了看起来有点傻(在单个JVM上分片)之外,你没事。为避免这种情况,您可以配置其中一个战争来实例化HazelcastClient。实用工具罐可以是相同的。它应该都在某些例如Spring配置 - 每个战争都有自己的副本。或者您可以将该配置放入两个外部目录并添加到catalina类路径。

关闭代码属于您实例化Hazelcast的同一个地方,即您的两场战争将有两次关机调用。您可以在Spring的任何高级配置(或自动装配)bean的destroy()中执行此操作,或将其放在Web App会话侦听器中。