Skip to content

Instantly share code, notes, and snippets.

@ndzj081221130
Created March 12, 2014 05:36
Show Gist options
  • Select an option

  • Save ndzj081221130/9501446 to your computer and use it in GitHub Desktop.

Select an option

Save ndzj081221130/9501446 to your computer and use it in GitHub Desktop.
2014_2_28_EntityBean
In EJB 3.0, entity beans primarily serve as a persistence data model. They do not provide remote services. Hence, the entity bean clustering service in EJB 3.0 primarily deals with distributed caching and replication, instead of load balancing.
实体Bean不考虑LB,而是考虑分布式缓存和复制。
JBoss EJB 3.0 entity beans are implemented by Hibernate, which has support for a second-level cache. The second- level cache provides the following functionalities:
• Ifyoupersistacache-enabledentitybeaninstancetothedatabaseviatheentitymanager,the entity will be inserted into the cache.
• If you update an entity bean instance, and save the changes to the database via the entity manager, the entity will be updated in the cache.
• Ifyouremoveanentitybeaninstancefromthedatabaseviatheentitymanager,theentitywill be removed from the cache.
• If loading a cached entity from the database via the entity manager, and that entity does not exist in the database, it will be inserted into the cache.
prop.setProperty("java.naming.provider.url", "192.168.70.104:1099,192.168.45.146:1099");
创建两个数据库,node1使用account,node2使用test。
实验发现,第一次插入的数据同步了。
但是第二次插入的数据没有同步。
why?
----------
JBoss集群中,对JBoss Cache的使用。
1 stateful session bean
每次state发生变化时,都需要在cluster中进行复制和同步。
配置的话,直接加上@CacheConfig
方法调用是通过LB的策略,默认是FirstAvailable,方法调用会stick到一个随机选择的node上。
复制是一个costly操作,可以优化,只对修改过的Bean进行复制。
Cache Manager是JBoss Cache实例的注册和工厂服务。
Eviction(逐出),cache的内存管理
CacheLoader,支持SFSB钝化,当bean被逐出cache时,cache loader会将bean钝化
Buddy复制,只将状态复制到一组backup服务器,而非集群中的所有服务器。
----------
2 entity Bean
实体bean需要在所有节点中保持同步,如果实体bean提供remote服务,还要做到LB(一般只要保证同步即可)。
EJB3.0基于Hibernate,支持second-level cache(二级缓存使用的是session factory对象,可以使用query level cache)。底层的**二级缓存**使用JBoss cache实现的。
- 当通过Entity Manager实例化一个cache-enabled的实体Bean实例到数据库时,实例会被插入缓存。
- 当更新entity bean的实例,并且通过entity maanger保存到数据库时,entity会被更新到cache。
- 当通过entity manager删除database中的entity bean的实例时,缓存中的实例也会被删除。
- 当通过entity manager load一个不在数据库中的cached实体时,实体会被插入缓存。
配置entity bean的cache
@Cache(...)
有一个cache **region的概念**。
----------
Query结果的缓存
当创建一个entity的命名查询时,可以在xml中告诉Hibernate,需要缓存查询结果
----------
HTTP session状态复制
使用sticky_session去报一个session中的客户端的请求总是发向同一个服务节点。但是sticky session在节点down后,所有的session数据都会丢失,因此,一个更加可靠的做法是**在集群中的所有节点中复制session data**。
配置:在web.xml中加上 < distributable/>
还可以在jboss-web.xml中设置< replication-config>,可以设置复制的trigger,
- SET_AND_GET
- SET_AND_NON_PRIMITIVE_GET
- SET
HTTP Session的钝化和激活:
钝化是将内存中的session存储到硬盘等外存,
激活就是将persistent store中的session恢复到内存中。
JBoss AS5支持HTTP Sesssion的钝化。
- 当container创建一个新的session时,如果当前活跃session数超过limit时。
配置JBoss Cache实例,用于session状态复制:
使用CacheManager获取JBossCache实例,
cacheMode可以是同步或者异步(发送同步请求后,是否等待回复)
buddyReplicationConfig
2、 使用Clustered Single Sign On
在一个web app上登录,但是可以在同一个virtual host上的所有web app都识别。无论是否部署在集群中的同一个机器。
Authentication复制:
----------
----------
Quesion: JBoss是**如何**做缓存的,我的回答是,JBoss是在什么情况下做缓存的。
那么,JBoss是如何做复制和同步的呢?
5种cache mode
本地缓存
复制、失效
同步、异步
消息通信借助于JGroups
----------
1.1) First-level cache
First-level cache always Associates with the **Session object**. Hibernate uses this cache by default. Here, it processes one transaction after another one, means wont process one transaction many times. Mainly it reduces the number of SQL queries it needs to generate within a given transaction. That is instead of updating after every modification done in the transaction, it updates the transaction only at the end of the transaction.
1.2) Second-level cache
Second-level cache always associates with the **Session Factory object**. While running the transactions, in between it loads the objects at the Session Factory level, so that those objects will be available to the entire application, not bound to single user. Since the objects are already loaded in the cache, whenever an object is returned by the query, at that time no need to go for a database transaction. In this way the second level cache works. Here we can use **query level cache** also. Later we will discuss about it.
Quoted from: http://www.javabeat.net/articles/37-introduction-to-hibernate-caching-1.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment