【问题标题】:Hazelcast cache implementation in my application我的应用程序中的 Hazelcast 缓存实现
【发布时间】: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>

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

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

  2. 我打算从数据库中加载一些主数据(两个应用程序都需要这些数据),所以我不确定我应该如何以及在哪里将这些数据加载到内存中。 注意:我不想做延迟加载;我想先加载这个主数据。

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

更新

另外,通过实施这种方法,我将有 2 个缓存副本分别用于应用程序还是一个副本将在两者之间共享?

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

【问题讨论】:

    标签: java caching web-applications hazelcast jcache


    【解决方案1】:

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

    就您在一个(Tomcat)JVM 中拥有多少个实例而言,如果您实例化 Hazelcast 两次,您将拥有两个。它会自动增加端口。但是,只要集群名称相同,两者都将属于同一个集群(您称为“缓存”)。所以除了看起来有点傻(在单个 JVM 上进行分片),你很好。为避免这种情况,您可以配置其中一场战争来实例化 HazelcastClient。实用程序 jar 可以相同。它应该都在一些例如Spring config - 每场战争都有自己的副本。或者您可以将该配置放入两个外部目录并添加到 catalina 类路径中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-08
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多