java - 使用 Hazelcast 的多播对不同的 Web 应用程序使用相同的 hibernate L2 缓存

标签 java hibernate caching hazelcast cpu-cache

我们一直在使用 Hazelcast 作为我们应用程序的 Hibernate L2 缓存提供程序,该应用程序具有相同的数据库并部署为两个不同的 Web 应用程序。

webApp1.war:使用 DB1

webApp2.war:使用 DB1

两个网络应用程序的 hazelcast 配置相同:

        <multicast enabled="true">
            <multicast-group>224.2.2.3</multicast-group>
            <multicast-port>54327</multicast-port>
        </multicast>

两个网络应用的组名和密码也相同。

Hazelcast 将它们添加到具有不同节点的集群中,这在 Hazelcast 的管理中心也可见。

Hazelcast 为这些网络应用程序的同一个数据库实体创建两个不同的 map 。所以,例如如果“webApp1”更新了实体“膳食”,则它不会反射(reflect)在“webApp2”中。

管理中心显示,它为“膳食”创建了两个不同的 map ,即 webApp1.war:meal 和 webApp2.war:meal

能否请您建议,使用多播,如何为同一集群中的两个不同 web 应用程序使用相同的 L2 缓存。

编辑 - 1: Hibernate 配置 - Persistence.xml

    <jta-data-source>java:jboss/datasources/mealsDS</jta-data-source>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

    <properties>
        <property name="hibernate.connection.pool_size" value="1" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.region.factory_class" value="com.hazelcast.hibernate.HazelcastCacheRegionFactory"/>
    </properties>
</persistence-unit>

Hazelcast 配置 - Hazelcast.xml(类似于 hazelacast.jar 中提供的)

<group>
    <name>local</name>
    <password>local-pass</password>
</group>

<management-center enabled="true">http://localhost:8080/mancenter
</management-center>
<network>
    <port auto-increment="true" port-count="100">5701</port>
    <outbound-ports>
        <ports>0</ports>
    </outbound-ports>
    <join>
        <multicast enabled="true">
            <multicast-group>224.2.2.3</multicast-group>
            <multicast-port>54327</multicast-port>
        </multicast>
        <tcp-ip enabled="false">
            <interface>127.0.0.1</interface>
        </tcp-ip>
        <aws enabled="false">
            <access-key>my-access-key</access-key>
            <secret-key>my-secret-key</secret-key>
            <region>us-west-1</region>
            <host-header>ec2.amazonaws.com</host-header>
            <security-group-name>hazelcast-sg</security-group-name>
            <tag-key>type</tag-key>
            <tag-value>hz-nodes</tag-value>
        </aws>
    </join>
    <interfaces enabled="false">
        <interface>10.10.1.*</interface>
    </interfaces>
    <ssl enabled="false" />
    <socket-interceptor enabled="false" />
    <symmetric-encryption enabled="false">
        <algorithm>PBEWithMD5AndDES</algorithm>
        <salt>thesalt</salt>
        <password>thepass</password>
        <iteration-count>19</iteration-count>
    </symmetric-encryption>
</network>
<partition-group enabled="false" />
<executor-service name="default">
    <pool-size>16</pool-size>
    <queue-capacity>0</queue-capacity>
</executor-service>
<queue name="default">
    <max-size>0</max-size>
    <backup-count>1</backup-count>
    <async-backup-count>0</async-backup-count>
    <empty-queue-ttl>-1</empty-queue-ttl>
</queue>
<map name="default">
    <in-memory-format>BINARY</in-memory-format>
    <backup-count>1</backup-count>
    <async-backup-count>0</async-backup-count>
    <time-to-live-seconds>0</time-to-live-seconds>
    <max-idle-seconds>0</max-idle-seconds>
    <eviction-policy>NONE</eviction-policy>
    <max-size policy="PER_NODE">0</max-size>
    <eviction-percentage>25</eviction-percentage>
    <min-eviction-check-millis>100</min-eviction-check-millis>
    <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy
    </merge-policy>
</map>
<multimap name="default">
    <backup-count>1</backup-count>
    <value-collection-type>SET</value-collection-type>
</multimap>
<multimap name="default">
    <backup-count>1</backup-count>
    <value-collection-type>SET</value-collection-type>
</multimap>
<list name="default">
    <backup-count>1</backup-count>
</list>
<set name="default">
    <backup-count>1</backup-count>
</set>
<jobtracker name="default">
    <max-thread-size>0</max-thread-size>
    <queue-size>0</queue-size>
    <retry-count>0</retry-count>
    <chunk-size>1000</chunk-size>
    <communicate-stats>true</communicate-stats>
    <topology-changed-strategy>CANCEL_RUNNING_OPERATION
    </topology-changed-strategy>
</jobtracker>
<semaphore name="default">
    <initial-permits>0</initial-permits>
    <backup-count>1</backup-count>
    <async-backup-count>0</async-backup-count>
</semaphore>
<serialization>
    <portable-version>0</portable-version>
</serialization>
<services enable-defaults="true" />

最佳答案

通过在我的中设置一个属性解决了这个问题 持久性.xml

<property name="hibernate.cache.region_prefix" value="myApp"/>

如果未设置此属性,它会限制 hibernate 将应用程序名称附加到在内存中创建的映射,因此无论它们是否使用相同的数据库,这两个 Web 应用程序都只存在一个映射。

关于java - 使用 Hazelcast 的多播对不同的 Web 应用程序使用相同的 hibernate L2 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30192396/

相关文章:

java - 无法使用 apache poi 4.0.1 创建数据透视表

java - 如果元素未出现在 selenium webdriver java 中,如何重新加载页面

java - @Transactional 不在独立应用程序中启动事务

.net - 如何利用Redis缓存实现自动刷新

javascript - 如何确保为客户端加载最新版本的 javascript 代码?

java - try/catch block 中的多个语句 - Java

java - 将 DAO 注入(inject) CXF 服务

java - 使用 Spring CrudRepository 的 Hibernate LazyInitializationException

hibernate - 如何在带有注释的 hibernate 中以编程方式验证数据库模式?

caching - 如何在 TYPO3 中进行缓存预热