Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Same hibernate L2 cache for different webapps using Hazelcast's multicasting

We've been using Hazelcast as Hibernate L2 cache provider for our application with same DB and deployed as two different web apps.

webApp1.war : using DB1

webApp2.war : using DB1

hazelcast configuration for both the web apps are same as:

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

Group name and password is also same for both the web apps.

Hazelcast adds them to the cluster with different Nodes which is visible on Hazelcast's Management centre as well.

Hazelcast creates two different Maps for same DB entity for these web apps. So, for e.g. If an Entity 'meal' is updated by "webApp1", it will not be reflected in "webApp2".

Management centre shows, it has created two different maps for 'meal' i.e. webApp1.war:meal and webApp2.war:meal

Can you please suggest, using multicasting, how to use same L2 cache for two different webapps in same cluster.

Edit - 1: Hibernate Configuration - 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 Configuration - Hazelcast.xml (similar to provided in 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" />

like image 743
jack Avatar asked Apr 13 '26 04:04

jack


1 Answers

Resolved this one by setting a property in my persistence.xml

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

if this property is not set, it restricts hibernate to append the app name to map created in memory, so only one map exists for both the web apps irrespective of if they are using same DB or not.

like image 119
jack Avatar answered Apr 14 '26 18:04

jack



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!