快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳门威泥斯人_酒文化网进入



工具 - 关系持久化是 Java EE 利用开拓中的一个紧张部分。Java Persistence API (JPA) 是工具 - 关系持久化的 Java EE 标准,从 Java EE 5 开始被引入。最新的 JPA 2.0(JSR-317) 规范是 Java EE 6 标准的一部分,它引入了新的工具 - 关系持久化 API,基于 JPA 1.0/1.2 作了更进一步的扩展和提升。Apache OpenJPA 是业界领先的开源 Java 持久化框架。WebSphere Application Server 的 JPA 实现是基于 Apache OpenJPA 的。WebSphere Application Server V7.0 的 JPA 2.0 功能部件包基于 OpenJPA 2.0.0,供给了 IBM 对 JPA 2.0 规范的实现,并增添 IBM 的增强特点,使得其能与 WebSphere Application Server 更好地集成。本文将向您系统的先容 WebSphere Application Server V7.0 中 JPA 2.0 功能部件包的新特点。

小序

工具 / 关系持久化是很多利用开拓场景中异常紧张的开拓需求。早在 JPA 之前,Java 领域中曾涌现出很多技巧规划,旨在办理数据持久化的问题,从最早的序列化(Serialization)、JDBC、关系工具映射(ORM)、工具数据库(ODB),再到 EJB2.x、Java 数据工具(JDO)。这些规划,除 JDO 之外都有各自的局限性,JPA 很好地降服了这些局限性,是持久化规划中一个不错的选择。表 1 中是 JPA 与其它持久化技巧的对照。

表 1. JPA 与其它持久化技巧的对照

序列化JDBCORM ODB EJB2 JDO JPA

持久化 JAVA 工具

高档面向工具对征

事务完备性

并发性

大年夜数据集

已有的模式

关系型或非关系型数据库

数据查询

严格标准 / 可移植性

简单性

JPA 交融了上面提到的每一种持久化技巧的优点。它的上风是:

简单易用,简化编程。经由过程 JPA 创建实体犹如创建序列化类一样的简单。与 JDO 和 EJB2.x 的实体 Bean 相澳门威泥斯人对照,JPA 不受现有繁杂规范的限定,能够做到简单易用。

JPA 支持大年夜数据集、数据同等性、并发性和 JDBC 的查询能力。

与工具关系软件和工具数据库一样,JPA 容许应用像承袭这样的高档面向工具技巧。

必要阐明的是,JPA 并不适用于所有的利用,但对付大年夜多半利用来说,相对付其它的持久化技巧,JPA 确凿是一个不错的选择。

最初,Java™ Persistence API (JPA) 作为 Enterprise JavaBean™ (EJB) 3.0 规范的一部分被引入到了 Java Platform Enterprise Edition (Java EE) 5 中,JPA 罗致了当前 Java 持久化技巧的优点,旨在规范、简化 Java 工具的持久化事情。在 Java EE 6 中,JPA 2.0 (JSR-317) 经由过程供给一些紧张的 API 增强了工具 / 关系映射和持久化的能力。

Apache OpenJPA 是业界领先的开源 Java 持久化框架。WebSphere Application Server 的 JPA 实现是基于 Apache OpenJPA 的。WebSphere Application Serve r 在 V6.1 版本的 EJB 3.0 功能部件包中支持 JPA 1.0 规范。WebSphere Application Server V7.0 中支持 JPA 1.2。WebSphere Application Server V7.0 的 JPA 2.0 功能部件包基于 OpenJPA 2.0.0,供给了 IBM 对 JPA 2.0 规范的实现,并增添 IBM 的增强特点,使得其能与 WebSphere Application Server 更好地集成。WebSphere Application Server 对 JPA 的支持是向前兼容的,也便是说 JPA 2.0 功能部件包同时也支持基于 JPA 1.0 和 JPA 1.2 规范开拓的利用。

由于基于 OpenJPA,以是基于 OpenJPA 利用不必要做任何变动就可以运行在 WebSphere Application Server 上。此外,WebSphere Application Server 支持其与 IBM 已有特点更好地集成,包括事务、安然、集群等。您可以在 IBM 供给的 Rational Application Developer 对象中开拓自己 JPA 利用。

WebSphere Application Server V7.0 JPA 2.0 功能部件包的新特点

WebSphere Application Server V7.0 的 JPA2.0 功能部件包供给了很多 JPA 2.0 的新特点,包括以下几个方面:

O/R 映射和域模型

消极锁的引入

运行时 API 的增强,EntityManagerFactory API,EntityManager API 和 Query API

经由过程 Criterial API 和 Metamodel 来构建基于工具的类型安然的查询

支持 Bean Validation(JSR 303),在持久化和删除实体时进行验证。

下面就对以上这几方面的新特点,进行具体的先容:

O/R 映射和域模型

Access Type(@Access):在 JPA1.0 中,只能在可持久化类型(实体、embeddables、MappedSuperclass)上应用 field 造访或 propery 造访。当应用 field 造访时,Persistence Provider 经由过程反射的要领直接造访实体的属性。当应用 property 造访时,Persistence Provider 能过 getter/setter 措施来造访实体的属性。Access 类型在 JPA2.0 中进行了扩展,它可以在每一个持久化类型上或者零丁的属性上应用,这为实体的定义以及应用实体的相关利用都来了很大年夜的机动性。

清单 1. Access 举例

Empoyee.java

@Access(FIELD)

@Entity public class Employee {

@Id

public int id;

String name;

@Access(PROPERTY)

public String getName()

…}

在 JPA1.0 中就已经有 Embeddables 类了,JPA2.0 中 Embeddables 的定义和用法在获得了扩展,使其包孕了 embeddables 聚拢、嵌套式 embeddables 和包孕与其他实体关系的 embeddables;

下面是一个 embeddables 聚拢的举例。由于在数据库表中,弗成能将多个值存储在同一行中,以是必要别的一个叫做聚拢表的零丁的表来存储这些聚拢元素。为此,引入了 CollectionTable 注释,每一个聚拢表中都有一个联合列指向包孕 embeddables 的实体表,聚拢表的其它列就用来存储 embeddables 的其它属性值。

清单 2. embeddables 聚拢

Address.java

@Embeddable

public class Address {

@Basic

private String street;

@Basic

private String city;

@Basic

private String state;

@Basic

private Integer zip;

public Address(){

}

//...

}

User.java

@Entity

public class User {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private int id;

@ElementCollection

@CollectionTable(name="user_address")

private Set addresses = new HashSet();

public User(){

}

//...

}

JPA2.0 中新增添了嵌套式 embeddables,即某一个 Embbedable 类用来表示另一个 Embbedable 类的状态。

清单 3. 嵌套式 embeddables

Address.java

@Embeddable

public class Address {

@Basic

private String street;

@Basic

private String city;

@Basic

private String state;

@Basic

private Integer zip;

public Address(){

}

//...

}

Phone.java

@Embeddable

public class Phone {

@Basic

private String phone_number;

@Basic

private String phone_type;

//...

}

ContactInfo.java

@Embeddable

public class ContactInfo {

public ContactInfo(){

}

@Embedded

Address homeAddress;

@Embedded

Phone homePhone;

//...

}

User.java

@Entity

public class User {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private int id;

@Embedded

ContactInfo contactInfo;

public User(){

}

//...

}

包孕与其它实体关系的 embeddables,由于 embeddable 类的实例本身没有持久化标识,与引用实体的关系是与包孕 embeddable 类的实体,而不是 embeddable 类本身。

清单 4. 包孕与其它实体关系的 embeddables

Address.java

@Embeddable

public class Address {

@Basic

private String street;

@Basic

private String city;

@Basic

private String state;

@Basic

private Integer zip;

@ManyToOne(cascade=CascadeType.ALL)

Coordinates coordinates;

public Address(){

}

//...

}

Coordinates .java

@Entity

public class Coordinates {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

int id;

@Basic

double longitude;

@Basic

double latitude;

public Coordinates(){

}

public Coordinates(double lon, double lat){

longitude=lon;

latitude=lat;

}

//...

}

在 JPA1.0 中,Map 只能用来表示实体之间的关联关系(即表之间的关系),如 @ManyToOne,@ManyToMany,而且键值必须是实体的属性值。在 JPA2.0 中,Map 的键值还可以支持基础类型,embeddables 类,以及实体。同时引入了 @MapKeyColumn、@MapKeyClass 和 @MapKeyJoinColumn 来支持这一增强特点。

假如映射键值是基础类型,经由过程 MapKeyColumn 来指定用来映射的键值列。

清单 5. MapKeyColumn 举例

@Entity

public class Employee {

@Id private int id;

private String name;

private long salary;

@ElementCollection

@CollectionTable(name="EMP_PHONE")

@MapKeyColumn(name="PHONE_TYPE")

@Column(name="PHONE_NUM")

private Map phoneNumbers;

// ...

}

假如映射键值是实体,经由过程 MapKeyJoinColumn 来指定用来映射的键值列。

清单 6. MapKeyJoinColumn 举例

@Entiy

Public class Employee{

@Id private int id;

private String name;

}

@Entity

public class Department {

@Id private int id;

private String name;

// ...

@ElementCollection

@CollectionTable(name="EMP_SENIORITY")

@MapKeyJoinColumn(name="EMP_ID")

@Column(name="SENIORITY")

private Map seniorities;

// ...

}

假如在定义映射时没有指定 Java 泛型类型,就必须应用 MapKeyClass 来指定映射键值的类型

清单 7. MapKeyClass 举例

@Entity

public class Employee {

@Id private int id;

private String name;

private long salary;

@ElementCollection(targetClass=String.class)

@CollectionTable(name="EMP_PHONE")

@MapKeyColumn(name="PHONE_TYPE")

@MapKeyClass(String.class)

@Column(name="PHONE_NUM")

private Map phoneNumbers;

// ...

}

Derived Identities( 派生身份 ),它使得一个实体的 ID 能从其它实体派生出来,这供给了一种 parent-to-dependent 关系。

鄙人面的例子中,实体 Band 的 ID 来自于 Employee,Employee 实体便是 Parent,Band 便是 dependent。

清单 8. Derived Identities 举例

@Entity

public class Employee {

@Id long empId;

String empName;

...

}

@Entity

Public class Band{

@Id Employee emp

}

Java Persistence Query language (JPQL) 扩展与增强

JPA1.0 定义了一个富厚的 Java 持久化查询说话,可以用来查询实体以及实体的持久化状态。JPA2.0 又对 JPQL 进行了一些扩展,例如,可以在查询中应用 case 表达示,鄙人面的例子中,应用 case 表达示来对增添员工的薪水,假如员工级别为 1. 薪水乘以 1.1,假如员工级别为 2,薪水乘以 1.05,假如员工级别为 1 和 2 以外的其它级别,. 薪水乘以 1.01。

清单 9. CASE 表达示代码示例

UPDATE Employee e

SET e.salary =

CASE WHEN e.rating = 1 THEN e.salary * 1.1

WHEN e.rating = 2 THEN e.salary * 1.05

ELSE e.salary * 1.01

END

JPA2.0 还对 JPQL 增添了一系列新的运算符,如 NULLIF 和 COALESCE。当数据库应用应用其它非 null 数据解码时,NULLIF 是十分有用的。应用 NULLIF,可以在查询语句中轻松的将非 null 值转换成 null,如查参数与 NULLIF 相等,NULLIF 就返回 null,否则返回第一个参数的值。

清单 10. NULLIF 举例

SELECT AVG(NULLIF(e.salary, -1))

FROM Employee e

在上面的清单中,假定员工表中薪水是一个整型数值,假如没有薪水值,就用 -1 替代。这个查询返回薪水的匀称值。值用 NULLIF 就可经由过程将 -1 改变成 null 值,来精确的忽掉落不存在的薪水值。

COALESCE 运算符用返回一系列参数中第一个非 null 的值。

清单 11. COALESCE 举例

SELECT Name, COALESCE(e.work_phone, e.home_phone) phone

FROM Employee e

在上面的清单中,假定员工表中有一列单位电话、一列家庭电话,没有的电话号码用 null 来表示。上面查询返回员工姓名和员工的电话。COALESCE 运算符指定返回单位电话,假如单位电话为 null,则返回家庭电话。假如两者都为 null,则返回 null。

JPA2.0 还增添了其它的运算符 INDEX,TYPE,KEY,VALUE 和 ENTRY。INDEX 运算符是在指定在有序列表进行有序查询。TYPE 运算符选择实体类型,并且可以将查询限定到一个或多个实体类型。KEY,VALUE 和 ENTRY 运算符是 JPA2.0 泛化映射功能的一部分,可以用 KEY 来抽取映射的键值,VALUE 来抽取映射的值,ENTRY 就来拔取映射的元素。

除此之外,JPA2.0 还为选择列表,聚拢参数值以及非多态查询增添了运算符。

消极锁的引入

JPA2.0 的别的一个亮点,便是引入了 pessimistic LockManager。JPA1.0 只支持乐不雅锁,可以经由过程 EntityManager 类的 lock()措施指定锁模式的值,可所以 READ 或 WRITE。乐不雅读锁,确保在实体的状态从数据库中读出来之后,只在没有中心插入的其它事务变动了与这个实体对应的数据库记录的环境下,才把更新后的实体状态写回数据库。它确保对数据的更新和删除与数据库确当前装态维持同等,并且不会损掉中心的改动。乐不雅写锁便是在乐不雅读锁的根基上必须强制对实体的版本字断做一个更新(增量)。

JPA2.0 有 6 种新的锁模式,此中 3 种是消极锁,2 种是乐不雅锁,还有一种锁模式是无锁。

新增的 3 个消极锁模式:

PESSIMISTIC_READ:只要事务读实体,实体治理器就锁定实体,直到事务完成锁才会解开,当想包管数据在继续的读之间不被改动时,就可以应用这种锁模式,即这种锁模式不会阻碍其它事务读取数据。

PESSIMISTIC_WRITE:只要事务更新实体,实体治理器就会锁定实体,这种锁模式强制考试测验改动实体数据的事务串行化,当多个并发更新事务呈现更新掉败几率较高时应用这种锁模式。

PESSIMISTIC_FORCE_INCREMENT:当事务读实体时,实体治理器就锁定实体,当事务停止时会增添实体的版本属性,纵然实体没有改动。

JPA 2.0 也供给了多种措施为实体指定锁模式,可以应用 EntityManager 的 lock() 和 find() 措施指定锁模式。此外,EntityManager.refresh() 措施可以规复实体实例的状态。

清单 12. 消极锁示例

// read

Part p = em.find(Part.class, pId);

// lock and refresh before update

em.refresh(p, PESSIMISTIC_WRITE);

int pAmount = p.getAmount();

p.setAmount(pAmount - uCount);

上面示例代码里,首先读一些数据,然后在更新数据之前,经由过程调用 EntityManager.refresh() 措施来应用 PESSIMISTIC_WRITE 锁。PESSIMISTIC_WRITE 在事务更新数据时锁定实体,这样其它的事务在初始事务提交之前不能更新同一实体。

运行时 API 更新

EntitiyManagerFactory API,增添了对 L2 缓存,Properties,Criteria API 和 Metamodel AP I 的支持;

EntityManager,新增对 Query API,Query Result API,Hits,Properties,LockModeType,以及 Detach 的支持;

Query API,新增了措施用来获取 typed query 参数和结果,支持实时 Hints,以及锁的 getter/setter 措施;

经由过程 Criteria API 构建查询

JPA2.0 中一个重大年夜的新特点便是引入 Metamodel 和 Criterial API 的组合。Criterial API 是用来动态构建基于工具的查询的一套 API。本色上讲,Criterial AP I 便是 JPQL 的面象对向的等价物。经由过程 Criterial API,就可以基于工具的要领来创建查询,而不是像 JPQL 那样经由过程字符串来创建查询语句。

Criterial API 基于 metamodel,metamodel 为持久化单元所治理的类供给了一个 schema 级的抽象模型。经由过程 metamodel 可以构建强类型的查询,可以查询持久化单元的逻辑布局。

JPA1.0 引入了 JPQL 查询说话,这在很大年夜程度上推动了 JPA 的盛行,然则这种基于符串并应用有限语法的 JPQL 存在一些缺陷。请看下面一段简单的代码示例,应用 JPQL 来查询年薪大年夜于 20 万元的 Employee 列表

清单 13. 简单的 JPQL 查询语句

EntityManager em = ...;

String jpql = "select e from Employee where e.salary > 2000000";

Query query = em.createQuery(jpql);

List result = query.getResultList();

JPQL 查询被指定为一个字符串,EntityManager 构建一个包孕 JPQL 字符串的查询实例,然后查询结果是一个无类型的 java.util.List。

然则这个例子中有一个验证差错,该代码能够经由过程编译,然则运行时会掉败,由于 JPQL 查询字符串中有语法差错。

清单 14. 精确的查询语

String jpql = "select e from Employee e where e.salary > 2000000";

应用 Criteria API 可以避免这种构造查询语句时的语法差错。

清单 15. 应用 Criteria API 的查询

EntityManager em = ...

QueryBuilder qb = em.getQueryBuilder();

CriteriaQuery c = qb.createQuery(Employee.class);

Root e = c.from(Employee.class);

Predicate condition = qb.gt(e.get(Employee_.salary), 2000000);

c.where(condition);

TypedQuery q = em.createQuery(c);

List result = q.getResultList();

上面的代码展示了 Criteria API 的核心构造和基础应用。首先获取一个 EntityManager 实例,然后创建一个 QueryBuilder 的实例。QueryBuilder 是 CrtieriaQuery 的工厂,它用来构建 CrtieriaQuery 实例,在 CrtieriaQuery 实例上设置查询表达式。Root 是泛型的,类型参数是表达示要谋略的值的类型。QueryBuilder 还用来构建查询表达示 Predicate condition = qb.gt(e.get(Employee_.salary), 2000000),这个措施显示了应用强类型说话定义能反省精确性的 API 的一个不错的例子。由于每个查询表达款都是泛型的,并且 API 中类型安然承袭,编译器会对无意的对照抛出差错,比如:Predicate condition = qb.gt(p.get(Employee_.salary, "xyz"));TypedQuery 结果具有相同的 Employee.class 类型,因些终极查询结果也是带有类型 Employee 的列表,这可以省去开拓职员在遍历天生的元素时进行强制转换的操作,削减了 ClassCastException 运行时差错的孕育发生。

在清单 7 中,有一个 Employee_.salary 这样的构造,它是表示 Employee 的持久化属性 salary。Employee_.salary 是 Employee_ 类中的公共静态字段,Employee_ 是静态、已实例化的规范 metamodel 类,对应于原本的 Employee 实体类。

Metamodel 描述持久化类的元数据。假如一个类按着 JPA2.0 规范正确地描述持久化实体的数据,这个元模型便是规范的,规范的元模型类是静态的,因些澳门威泥斯人它所有的成员变理都被声明成静态的。

清单 16. 持久化实体示例

@Entity

public class Employee {

@Id

private long ssn;

private string name;

private int age;

private float salary;

// public gettter/setter methods

public String getName() {...}

}

清单 17. Employee 对应的静态规范 metamodel 类

import javax.persistence.metamodel.SingularAttribute;

@javax.persistence.metamodel.StaticMetamodel(Employee.class)

public class Employee_ {

public static volatile SingularAttribute ssn;

public static volatile SingularAttribute name;

public static volatile SingularAttribute age;

public static volatile SingularAttribute salary;

}

前面提到 Criteria API 是强类型的,Criteria API 也是一种动态创建查询的机制。它可以经由过程以下几种要领来动态创建查询 :

以弱类型的要领动态构建查询;

以数据库内置的函数作为查询表达式扩展语法;

在结果集中再查询;

根据模板进行查询。

接下来分手举例阐明:

以弱类型的要领动态构建查询

Criteria API 的强类型反省要求实列化元模型,这平日只能在开拓阶段实现。然则有些时刻,实体是在运行时被动态选定的。Criteria API 还供给了别的一种要领,也便是经由过程属性的名字来造访实体的属性。

清单 18. 弱类型查询举例

Class cls =Class.forName("Employee");

Metamodel model = em.getMetamodel();

EntityType entity = model.entity(cls);

CriteriaQuery c = cb.createQuery(cls);

Root emp = c.from(entity);

Path age = account.get("age");

c.where(cb.gt(age),50);

以数据库内置的函数作为查询表达式扩展语法

动态查询机制的一个亮点便是其语法可以扩展。经由过程应用 QueryBuilder 接口的 function() 措施来创建数据库支持的表达式。

Expression function(String name, Class type, Expression...args);

访函数用于创建一个给定名称带有零个或多个表达式参数的表达式。利用可以通这个表达式来调用数据库函数来进行查询。例如 CURRENT_USER() 这是一个 MySQL 的内置函数用来返回用户名和主机名的 UTF-8 字符串。

清单 19. CriteriaQuery 中应用数据库内置于函数

CriteriaQuery q = cb.createTupleQuery();

Root c = q.from(Employee.class);

Expression currentUser =

cb.function("CURRENT_USER", String.class, (Expression[])null);

q.multiselect(currentUser, c.get(Employee_.Name));

在结果集中再查询

CrtiteriaQuery 可以以编程的要领来编辑。像选择前提,WHERE 子句中的选择谓词,以及 OrderBy 子句的排序前提等都可通被编辑,以达到在结果集中进行搜索功能。

清单 20. 结果集再查询举例

CriteriaQuery c = cb.createQuery(Employee.class);

Root p = c.from(Employee.class);

c.orderBy(cb.asc(p.get(Employee_.name)));

List result = em.createQuery(c).getResultList();

// start editing

List orders = c.getOrderList();

List newOrders = new ArrayList(orders);

newOrders.add(cb.desc(p.get(Employee_.zipcode)));

c.orderBy(newOrders);

List result2 = em.createQuery(c).getResultList();

根据模板进行查询

Criteria API 经由过程创建模板,并根据模板来进行查询。有了给定的模板实例之后,将创建一个联合谓词,此中每个谓词都是模板实例的非 null 和非默认属性值。履行该查询将谋略谓词以查找所有与模板实例匹配的实例。

清单 21. 模板查询举例

CriteriaQuery q = cb.createQuery(Employee.class);

Employee example = new Employee();

example.setSalary(10000);

example.setRating(1);

q.where(cb.qbe(q.from(Employee.class)澳门威泥斯人, example);

如上面例子所示,OpenJPA 的 QueryBuilder 接口扩展支持以下表达式:

publicPredicate qbe(From from, T template);

如这这个表达式根据给定模板实例的属性值天生一个联合谓词。例如澳门威泥斯人,这个查询将查询所有薪水为 10000 评级为 1 的 Employee。

Bean Validation

JPA2.0 引入 Bean Validation,Bean Validation 是由 JSR 303 规范来定义的。JPA2.0 支持经由过程 JSR 303 的实现在实体持久化和删除操作之前来对实体进行验证。

清单 22. Bean Validation 举例

@Embeddable

public class Author {

private String firstName;

@NotEmpty(message="lastname must not be null")

private String lastName;

@Size(max=30)

private String company;

...

}

@Entity

public class Book {

@NotEmpty(groups={FirstLevelCheck.class, Default.class})

private String title;

@Valid

@NotNull

@Embedded

private Author author;

...

}

机能增强

JPA2.0 的另一更新便是引入的 L2 缓存。JPA 中有两个级其余缓存:第一级是持久化高低文,在一个持久化高低文中,Entity Manager 会确保独一的实体实例对应一个特定的数据库行。第二级缓存(L2)是在多个高低文之间共享实体的状态。在 JPA1.0 中,并没定义支持第二级的缓存。

假如启用 L2 缓存的话,在持久化高低文中找不到的实体,就会从 L2 缓存中找,假如找到,就会从 L2 缓存中装载。这一行径,经由过程 CacheModes 懈弛存元向来节制。

图 1. JPA 的第一级与第二级缓存

应用 JPA2.0 的 L2 缓存的好处:

对付已经装载的实体,可以避免对数据库的再次造访;

可以快速读取频繁造访的未改变的实体。

就像一枚硬币有正面,也有反正一样,L2 缓存存在着毛病:

大年夜量的实体工具会带来内存的耗损;

更新工具后会来迂腐的数据;

可会呈现同时写操作;

对付频繁同时更新的实体会带来扩展性方面的问题

然则缓存却是 Java EE 方面有效的前进机能的设计模式,下面的图注解,跟着用户的增添,L2 缓存所带来的机能的前进。

图 2. L2 缓存机能提示例

WebSpehere Application Server 对 OpenJPA 的扩展与增强

WebSphere 的 JPA 办理规划基于 OpenJPA,然则同时还对 OpenJAP 进行了扩展,包括了与 IBM Data Studio Pure Query 的集成和 WebSphere eXtreme Scale 集成。

图 3. WebSphere JPA 架构

JPA2.0 功能部件包与 IBM Data Studio Pure Query 的集成

IBM pureQuery 是一个高机能的 Java 数据造访平台,可以简化数据造访的开拓,优化,保护和治理。PureQuery 供给一可以用来替代 JDBC 的 API 来造访数据库。

JPA 应用 pureQuery 的静态 SQL,SQL 监视和问题诊断以及异构情况下批处置惩罚更新操作。

与 JPA 功能部件集成在一路的 pureQury,容许其它数据库(如 Oracle)应用 wsdb2gen 功能,应用 pureQuery 的 sql 监控和问题诊断功能,这样可像 DB2 用户一样来调优利用的 SQL 应用。同时它也容许其它的 DBRA 数据库(如 Informix)用户使 heterogeneous batching support,这使得他们体验到像 DB2 用户一样机能特点。

JPA2.0 功能部件包与 WebSphere eXtreme Scale 的集成

在懂得 IBM WebSphere eXtreme Scale 之前,我们简单先容下延迟写缓存系统。缓存系统是位于数据库和利用数据造访之间的中心系统,对付一个延迟写缓存,写操作不会急速反映到存储库中,缓存会将被更新的数据标记为脏数据,只有在数据由于某些缘故原由(如更新机制)被从缓存中移除的时刻,写操作才会在存储库上履行。是以,假如在一个延迟写缓存上孕育发生一个读取掉败时,会引发两个动作:一个线程到存储库获取数据,一个线程将缓存中的脏数据更新到存储库(用于开释空间留给新的数据)。当然,可以显式的要求缓存将脏数据更新到存储库。下图显示了延迟写缓存系统所处的职位地方和事情流程。

图 5. 延迟写缓存系统所处的职位地方和事情流程

缓存系统的优点是能够显明前进系统事务率(Transactions Per Second, TPS),同时数据库负载低落,但对付 server 而言,必要增添额外的内存耗损,并且必要增添额外线程。

应用外部的数据缓存系统能够给 JPA 数据造访操作机能带来大年夜幅度提升,下面我们以 IBM WebSphere eXtreme Scale(以下简称 WXS) 为例,先容若何设置设置设备摆设摆设 OpenJPA 上的外部缓存。

OpenJPA 供给多种缓存机制,如 DataCache 和 QueryCac澳门威泥斯人he,DataCache 表示对数据进行缓存,QueryCach e 表示对查询结果进行缓存,它们都可以经由过程在 persistence.xml 中的设置设置设备摆设摆设进行启用 / 竣事,可选值为 true、false 或第三方实现类路径,同时可以设置响应参数。简单的环境下,可以应用

表示启用数据缓存。

还可以在 value 处设置设置设备摆设摆设响应参数,如

用于指定缓存数据量大年夜小。

WXS 供给了专门支持 OpenJPA DataCache 和 QueryCache 的实现,在 persistence.xml 中应用如下设置设置设备摆设摆设,即可启用 WXS 针对 OpenJPA 的 QueryCache 缓存实现

对付一样平常环境而言,只需做出上述设置设置设备摆设摆设,即可满意系统需求,但在一些必要特殊定制的情况中,WXS 也供给了增强的扩展设置设置设备摆设摆设要领,即在 META-INF 目录下,应用自定义的 OpenJPA ObjectGrid XML 富厚扩展设置设置设备摆设摆设。有以下三类设置设置设备摆设摆设文件类型可以供用户应用:openjpa-objectGrid.xml ( ObjectGrid 设置设置设备摆设摆设文件 ), openjpa-objectGridDeployment.xml ( 支配策略设置设置设备摆设摆设 ),和 openjpa-objectGrid-client-override.xml ( 客户真个 ObjectGrid 覆盖设置设置设备摆设摆设 ),用户可以根据需求应用任何一个或整个设置设置设备摆设摆设文件。

对付 EMBEDDED 和 EMBEDDED_PARTITION 类型,可以根据需求应用任何一个或整个设置设置设备摆设摆设文件

对付 REMOTE ObjectGrid 缓存而言,ObjectGrid cache 不会创建动态 ObjectGrid,而是从 catalog service 获取客户真个 ObjectGrid,是以此时用户只能设置设置设备摆设摆设 openjpa-objectGrid-client-override.xml 来覆盖原有设置设置设备摆设摆设。假如盼望进一步懂得 WebSphere eXtreme Scale 的具体信息,请参考 WebSphere eXtreme Scale 相关文章。

停止语

JPA2.0 规范使得 EJB 中实体 bean 的开拓变得加倍简单,机动。本文先容了 JPA2.0 功能部件的最主要的几个新特点。必要留意的是 JPA 2.0 功能部件包是同 OSGi 利用功能部部件包一路宣布的并且可以同时安装的,然则二者之间没有一定的联系,也可以进行零丁安装。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: