技术开发 频道

Spring和Hibernate与WebSphere Application Server一起使用

    设计注意事项

    Spring Framework 提供的某些基础结构服务将复制由基于标准的应用服务器运行时提供的服务。而且,从基础 J2EE 应用服务器抽象 Spring 框架基础结构必然要削弱与应用服务器运行时服务质量的集成,如安全、负载管理和高可用性。因此,在应用程序设计的过程中,必须认真考虑在部署到 WebSphere Application Server 的应用程序中使用 Spring Framework,以避免降低 WebSphere Application Server 提供的任何服务质量。如果没有任何其他建议,推荐直接使用 WebSphere Application Server 提供的服务,以便基于开放标准开发应用程序,并确保未来部署的灵活性。

    非托管线程

    某些 Spring 场景可能导致创建非托管的线程。非托管线程对 WebSphere Application Server 是未知的,并且不能访问 Java EE 上下文信息。此外,它们可以在 WebSphere Application Server 不知道的情况下利用资源,存在管理员不能控制其数量和资源使用情况的问题,在发生故障时,它们还阻止应用服务器正常关机或恢复资源。应用程序应该避免导致启动非托管线程的任何场景,如:

    registerShutdownHook

    避免使用 Spring AbstractApplicationContext 或其子类之一。registerShutdownHook 是一个公共方法,它可以创建线程并将其注册到 Java 虚拟机,以便在关机时运行以关闭 ApplicationContext。应用程序可以避免这一点,方法是利用从 WebSphere 容器接收的常规生命周期通知来显式调用 ApplicationContext 上的关闭。

    WeakReferenceMonitor

    Spring 为简化开发 EJB 组件提供了方便的类,但是请注意,这些方便的类会生成 WeakReferenceMonitor 用来执行清除操作的非托管线程。

    计划

    Spring 提供(或集成)大量的计划包,但是,只有与 WebSphere Application Server 托管的线程一起使用的 Spring 计划包是 CommonJ WorkManager。其他包(如 quartz 和 JDK Timer)会启动非托管线程,应该避免使用。

    使用 Hibernate

    Hibernate 是 POJO 的开放源代码持久性框架,它通过 XML 配置文件提供 POJO 到关系数据库表的与对象相关的映射。Hibernate 框架是应用程序调用的、用于数据持久性的数据访问抽象层。此外,Hibernate 还提供了从 Java 类到数据库表(以及从 Java 数据类型到 SQL 数据类型)的映射以及数据查询和检索功能。Hibernate 生成必需的 SQL 调用,还负责结果集处理和对象转换。

    Hibernate(如 OpenJPA)实现 Java Persistence API (JPA) 规范,它是 Java EE 5 的必要部分。(有关如何使用 Hibernate 的 developerWorks 文章,请参见参考资料。)

    使用场景

    以下场景描述了有关如何将 Hibernate 与 WebSphere Application Server 和 WebSphere 堆栈产品结合使用的一些可能场景。这些仅是示例场景,不应认为是推荐的场景。

    使用 WebSphere Application Server 数据源

    为使 Hibernate 从 WebSphere Application Server 获取数据库连接,必须使用 Java EE(以前称为 J2EE)规范中强制规定的资源引用。这可以确保 WebSphere Application Server 能够为连接池、事务语义和隔离级别提供正确的行为。通过设置 hibernate.connection.datasource 属性(在 Hibernate 配置文件中进行了定义)将 Hibernate 配置为从 WebSphere Application Server 检索数据源,以引用在模块的部署描述符中定义的资源引用(例如 java:comp/env/jdbc/myDSRef)。例如:
<property name="hibernate.connection.datasource"> java:/comp/env/jdbc/myDSRef </property>
    Web 应用程序的 Java EE 资源引用在 WAR 文件级别定义,这意味着容器中的所有 Servlet 和 Java 类均共享资源引用。在 EJB 模块内部,资源引用在各个 EJB 组件上定义。这意味着,如果许多 EJB 组件都使用相同的 Hibernate 配置,则每个 EJB 必须在每个 EJB 组件上定义相同的引用名称。这会导致复杂的情况,稍后我们将进一步讨论。

    配置了数据源之后,确保 Hibernate 正常工作的下一个步骤是正确配置事务支持。

    事务策略配置

    为了正确地使用事务,Hibernate 需要两个重要部分的配置。第一个部分是 hibernate.transaction.factory_class,它定义事务控制,第二个部分是 hibernate.transaction.manager_lookup_class,它定义注册事务同步的机制,这样,当持久性管理器需要与数据库同步更改时会在事务端得到通知。对于事务控制,同时支持容器管理的配置和 Bean 管理的配置。将 Hibernate 和 WebSphere Application Server 结合使用时,必须在 Hibernate.cfg.xml 中设置以下属性:

    对于容器管理的事务:
<property name="hibernate.transaction.factory_class"> org.hibernate.transaction.CMTTransactionFactory </property> <property name="hibernate.transaction.manager_lookup_class"> org.hibernate.transaction.WebSphereExtendedJTATransactionLookup </property>
    对于 Bean 管理的事务:
<property name="hibernate.transaction.factory_class"> org.hibernate.transaction.JTATransactionFactory </property> <property name="hibernate.transaction.manager_lookup_class"> org.hibernate.transaction.WebSphereExtendedJTATransactionLookup </property> <property name="jta.UserTransaction"> java:comp/UserTransaction </property >
    jta.UserTransaction 属性将工厂类配置为从 WebSphere 容器获取 UserTransaction 对象实例的实例。

    WebSphere Application Server V6.x 和更高版本在 WebSphere 平台上支持 hibernate.transaction.manager_lookup_class 属性,WebSphere Business Integration Server Foundation V5.1 和更高版本也支持此属性。此属性将 Hibernate 配置为使用在 WebSphere Business Integration Server Foundation V5.1 和 WebSphere Application Server V6.0 中引入的 ExtendedJTATransaction 接口,WebSphere ExtendedJTATransaction 接口建立了一个模式,并通过 JTA 1.1 规范在 Java EE 5 中正式确立。

    不支持的事务配置

    Hibernate 文档描述了用于在 WebSphere Application Server 版本 4 和 5 产品上运行的事务策略配置,但是这些配置使用内部 WebSphere 接口,在那些早期版本上不受支持。上面描述了仅受支持的 Hibernate 事务配置,如前面所述,这意味着只能在 WebSphere Business Integration Server Foundation V5.1 和 WebSphere Application Server Version 6.x 以及更高版本上使用 Hibernate。

    WebSphere Application Server 环境中 Hibernate 的使用模式

    当结合使用 Hibernate 和 WebSphere Application Server 时,Hibernate 的“按请求会话”和“长对话”模式均可使用。客户必须选择适用于其应用程序的模式,不过我们主张使用“按请求会话”模式,因为它可以提供更好的扩展性。

    多个隔离级别

    可共享的连接通过让多个资源用户能够共享现有的连接,改进了在 WebSphere Application Server 中的性能。不过,如果可共享的连接和多个隔离级别都是必需的,则为每个连接配置定义单独的资源引用和 Hibernate 会话工厂。不能够更改共享连接的隔离级别。因此,也不可能使用 hibernate.connection.isolation 属性在共享连接上设置隔离级别。有关连接共享的策略和约束的详细信息,请参见 在 WebSphere Application Server V5 中共享连接。(尽管本文通常适合于在 WebSphere Application Server V5 上使用的所有共享连接,但是连接共享建议仍适用于在 V6.x 上运行的 Hibernate。) 
0
相关文章