Java Persistence API(JPA)是 Enterprise JavaBean (EJB) 3.0规范的一部分。JPA可用于Java Standard Edition(Java SE)和Java Enterprise Edition(Java EE)应用程序。IBM solidDB 是一个内存关系数据库,它的速度最高可达常规数据库的10倍。solidDB支持Java Database Connectivity (JDBC) 2.0规范。许多Java SE和 Java EE 应用程序可以利用使用 JDBC 的内存数据库的性能优势。
简介
Java Persistence API(JPA)作为 EJB 3.0 规范 (JSR220) 的一部分引入,其目的是使整个 Java 社区基于一个单一的、标准的、持久的 API。JPA 吸收了 Hibernate、TopLink、Java Data Objects (JDO) 和 Container Managed Persistence (EJB-CMP) 2.1 规范的精华。
JPA 可用于 Java Standard Edition (Java SE) 和 Java Enterprise Edition (Java EE) 环境,因为它将实体表示为可以被一个 JPA 持久性提供者(如 Apache OpenJPA)管理的 Plain Old Java Objects (POJOs)。关于这个实体的对象关系映射的元数据使用 Java 5 注释或 XML 描述符指定。实体用于将 Java 对象持久化保存在数据库中。
有几种 JPA 持久性提供者。IBM 的 JPA 解决方案基于 Apache OpenJPA 项目。随着这些 JPA 持久性提供者的发布,您现在可以对一个标准的 API 编码,而不必在不兼容的非标准持久性框架(如 Hibernate 或 JDO)之间抉择。
IBM solidDB 是一个内存数据库,它的速度最高可达常规数据库的 10 倍。solidDB 不仅具有高速度,还具有高可用性和故障转移特性,这使它成为许多性能关键型应用程序的数据管理组件的自然选择。
solidDB 可以部署为一个独立的内存数据库,供应用程序直接使用。它也可以部署为一个缓存,用于加速 IBM DB2、Oracle 和 SQL Server 等传统数据库。solidDB 支持标准 Java Database Connectivity (JDBC) 2.0 规范。solidDB JDBC Driver 是一个类型 4 驱动程序(即它是 JDBC 2.0 标准的一个 100% 的 Java 实现),可用于支持 JDK 1.4.2 或更高版本的所有 Java 环境。由于 solidDB 支持 JDBC,您也可以通过 solidDB 使用 JPA。这就意味着编写需要良好性能的应用程序的 Java 程序员可以通过 solidDB 使用 JDBC、JPA 或者同时使用两者。
其他文章 已经介绍了如何通过 solidDB 使用 JDBC,如何将 solidDB 用作传统数据库的一个缓存(参见 “参考资料”)。本文将介绍如何通过 solidDB 将 OpenJPA 用作一个独立的内存数据库。首先,您将定义一个示例应用程序(包含在本文中),用于展示如何通过 solidDB 使用 OpenJPA。这个示例应用程序作为一个 Java EE 应用程序实现,在 IBM WebSphere Application Server 7.0 上运行。(这个应用程序也可以作为一个 Java SE 应用程序实现(没有无状态会话 bean),在独立的 OpenJPA 持久性提供者之上运行。)定义这个应用程序之后,本文将指导您逐步安装和配置一些基本组件,这些组件是您使用 OpenJPA 和 solidDB 在 WebSphere Application Server 上构建一个性能关键型应用程序所需的组件。最后,您将看到针对 JPA 规范编写的 Java 应用程序如何通过 OpenJPA 连接到 solidDB。
示例应用程序
许多 Java 应用程序都可以受益于内存数据库的使用,比如 solidDB。例如,一些电子商务网站整合来自几个后端应用程序的信息,一些财务服务公司对贸易商提供实时警告,一些通信运营商监视移动电话使用和呼叫方案以进行计费。
对于本文的目的来说,您在这里使用的示例应用程序是一个计算机电话集成(CTI)应用程序。假设这个 CTI 应用程序通过将呼叫者路由到最有资格处理每种呼叫类型的代理处来处理所有接入呼叫。这个应用程序建立一个与代理的电话的连接并在代理的工作站上填充呼叫者的帐户数据(如帐户编号、姓名等)。这些交互包含在图1 展示的示例应用程序的主要设计元素之中。
图1. CTI 设计模型
在这个应用程序中:
Message Façade 从 PBX/ACD(专用交换机/自动呼叫分配器)接收异步消息。它从消息有效载荷中创建 Value Object 并异步将消息分发到 Session Façade 来满足请求。消息驱动 bean(MDB)实现 Message Facade。
Session Façade 提供从数据库创建、检索、更新和删除 Value Object 的操作。例如,它拥有 createCaller、updateAgent 和 deleteCaller 等操作。它使用 Data Access Object 存储来自 solidDB 的 Value Objects。Stateless Session Beans(无状态会话 Bean,SLSB)实现 Session Façade。
Value Object 持有代理和呼叫者的属性值。它作为一个 POJO 实现,带有获取和设置属性值的方法。它还提供一个从 XML 字符串创建 Value Object 的方法(valueOf)和一个将 Value Object 转换为 XML 字符串的方法(toString)。这些 POJO 通过 Message Façade 创建,作为参数传递给 Session Façade 和 Data Access Object。
Data Access Object 封装了对用于在数据库中存储 Value Objects (POJOs) 的持久性技术(JDBC、JPA 等)的所有访问。在这个应用程序中,JPA APIs 用于将 Value Objects 持久化到 solidDB 中。
要将接入的呼叫者智能地路由到最好的可用代理,关键是能够使 CTI 应用程序中呼叫者状态和代理状态的副本与 PBX 一致。为此,CTI 应用程序通过 JMS 消息收到来自 PBX/ACD 的状态更改,并且 CTI 应用程序使用 solidDB 将代理状态和呼叫者状态缓存到内存中。