看看官网的关于缓存的讲解,无奈自己的英语有限,只能边看边查,自己翻译的很生硬,结合网络上大神的指导,大概了解了一些内容。这篇文章就作为一个学习笔记吧。
咱们先了解几个名词:
ORM:对象关系映射
OXM:对象xml关系映射
我目前学习的水平,只知道hibernate支持ORM(其实也稍微支持OXM),mybatis支持OXM。
了解了EclipseLink之后,发现它不仅支持ORM,也支持OXM。
那么缓存肯定也会有ORM和OXM之分。
咱们先看官网上的例子:
比如Employee类:
@Entity @Cache( type=CacheType.SOFT, // 缓存一切东西,直到JVM内存不够为止. size=64000 // 使用64000作为初始缓存大小. expiry=36000000, coordinationType=CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS //将这个属性设置为缓存协调模式。代表只发送无效的消息) public class Employee { ... } |
在xml中应用缓存:
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_4.xsd" version="2.4"> <entity name="Employee" class="org.acme.Employee" access="FIELD"> <cache type="SOFT" size="64000" expiry="36000000" coordination-type="INVALIDATE_CHANGED_OBJECTS"/> </entity> </entity-mappings> |
对应的持久化的xml中的配置如下:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_2_0.xsd" version="2.0"> <persistence-unit name="acme" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.cache.shared.default" value="false"/> <property name="eclipselink.cache.shared.Employee" value="true"/> <property name="eclipselink.cache.type.Employee" value="SOFT"/> <property name="eclipselink.cache.size.Employee" value="64000"/> </properties> </persistence-unit> </persistence> |
EclipseLink使用@Cache代替了Java Persisitence API 的(@Cachable)来配置EclipseLink对象缓存。
在默认情况下,EclipseLink使用共享对象缓存来缓存所有对象。你可以在每个类的基础上配置缓存类型和选项,允许最优缓存。
实体entity缓存类型
Full :缓存所有查询到的实例,不会被GC回收
Weak:缓存以这个类型标识的实体查到的所有实例,会被GC回收
Soft:缓存以这个类型标识的实体查到的所有实例,当JVM内存不够的时候会被释放
Soft_weak(默认的):缓存所有以weak和soft标识的实体查到的所有实例。它会带有一个子缓存,用于存放经常读取的信息,这部分信息不会被GC回收。
Hard_weak:和soft_weak类似。只不过它的子缓存会用Hard引用存储。
Cache(不推荐使用):它使用map维护一个指定大小的缓存。
None(不推荐使用,可以使用isolation=ISOLATED代替)。
实体entity缓存隔离类型如下
----shared 实体实例将被缓存在EntityManagerFactory/ ServerSession级别的。
------isolated 实体和数据不是被缓存在共享缓存上,而是持久化在上下文/工作单元或者客户端session中
-----protected 实体状态信息将被缓存在共享缓存中,但实体实例将不共享。
使用@Cache的注意事项
如果你在继承的子类中用@Cache定义,这个注释将被忽略。
如果你用@Cache定义@Embeddable,EclipseLink将会抛出异常。
EclipseLink缓存是一个内存中的存储库存储读取或写入对象基于类和主键值
EclipseLink使用缓存是为了应对以下情况:
- 通过控制对象对内存的写入和读取,从而减少对数据库的访问来提高效率
- 管理锁定和隔离级别
- 管理对象的身份
官网上有一张图,可以说明缓存的工作流程:
对这个图的说明,引用了网络上一篇博客对官网的翻译:
http://www.cnblogs.com/bobsha/p/5702194.html
1. SessionCache,即 Persistence Unit Cache,属于系统级的缓存,所有client共享数据。数据来源主要有两种:
a)通过EntityManager进行数据读入时,会将读入的数据拷贝一份放到SessionCache;
b)Unit of Work Cache 进行Commit操作成功后,将数据同步到Session Cache中;
2. Unit of WorkCache,即Persistence Context Cache,属于隔离型缓存,属于单个client。由EntityManager进行管理,PersistenceContext中保存着读取过的Entity实例。当对Entity执行了Commit操作后会将更改后对数据同步到SessionCache。Flush,Clear操作不会触发同步Session Cache操作。
3. 数据查询过程。EntityManager根据实例唯一标识查看Persistence ContextCache中是否存在该实例,如果存在则返回该实例。如果不存在,则查询Persistence UnitCache中是否存在该实例,如果存在则直接返回该实例,如果不存在则访问数据库进行查询,得到数据结果后将此数据保存到Persistence Unit Cache和 Persistence Context Cache中。
需要简单了解的:
EntityManager对象的事务管理方式有两 种,分别为JTA和RESOURCE_LOCAL,即Java Transaction API方法和本地的事务管理。
RESOURCE_LOCAL 事务:数据库本地的事务。它是数据库级别的事务,只能针对一种数据库,不支持分布式的事务。对于中小型的应用,可以采用
JPA中的事务类 型通过persistence.xml文件中的“transaction-type”元素配置。
自己翻译的,有点力不从心,希望大家有研究的可以指正。