JavaEE 6中新的定义数据源方法

原创
开发 后端
在JavaEE 6中,提供了很多新的特性,51CTO陆续对这些特性进行了报导。在本文中,将说明JavaEE 6中定义数据源的方法。

在JavaEE应用程序中,数据源对象(DataSource objects)是通过JDBC API访问关系数据库的途径。每个DataSource对象都有一系列用来描述现实世界中数据源的属性,通过这些属性可以描述数据库服务器所在的地址、数据库名称、网络协议等信息。另外数据源对象还可以与JNDI配合使用,如果将一个数据源与一个注册好的JNDI服务绑定后,在应用程序中就可以通过访问JNDI API得到这个数据源对象,进而取得和数据库的链接以及进行数据库操作。

在JavaEE 6以前,数据源的定义和使用与Java应用服务器厂家有很强的相关性,JavaEE 6则提供了更为灵活的数据源定义方式,可以定义在多个应用服务器之间兼容的数据源。另外同时支持注释、声明、部署表述等多个定义方式。在本文中,将说明如何使用注释和或部署描述来定义数据源。

使用注释定义数据源

在JavaEE 6中提供了两个用来定义数据源的注释标记:@DataSourceDefinition 和@DataSourceDefinitions,这两个标记都位于javax.annotation.sql包中。通过@DataSourceDefinition可以定义单个数据源,通过@DataSourceDefinitions可以定义多个数据源。

@DataSourceDefinition注释

@DataSourceDefinition注释标记可以应用客户端、Servlet、EJB等元件当中定义数据源,通过该注释标记,可以定义数据源对象,并与JNDK绑定。该标记的使用方式与设置数据源对象的属性没有什么区别,也可以设置附加信息以及特定信息。

例如,下面的注释标记创建了一个访问Derby数据库的数据源。

  1. @DataSourceDefinition(name = "java:app/env/Servlet_DataSource",  
  2.     minPoolSize = 0,  
  3.     initialPoolSize = 0,  
  4.     className = "org.apache.derby.jdbc.ClientXADataSource",  
  5.     user = "APP",  
  6.     password = "APP",  
  7.     databaseName = "testdb",  
  8.     properties = {"connectionAttributes=;create=true"}  

数据源的name属性值就是要绑定的的JNDI名称,根据JNDI的特点,该值应该是唯一的。从上面的例子中可以注意到,属性值的第一部分,也就是java:app是一个命名空间说明。在JavaEE 6中引入了应用元件命名空间,目前可以使用的命名空间如下:

java:comp,同一应用同一容器中的元件可以访问。

java:module,与元件相同的一个模块中可以访问,比如定义在同一个ejb-jar.xml中的EJB元件。

java:app,可以在同一应用中的所有元件和模块中访问,例如位于统一ear文件中的客户端元件、WEB元件、EJB元件。

java:global,可以在服务器中所有的应用程序之间共享。

name属性所引用的命名空间范围,也决定了数据源对象的访问范围,也就是模块、应用或者同一服务中的所有用用。以下的定义方式分别表示:

java:comp/env/, 与数据源定义元件处于同一容器中的其他元件、如客户端元件、WEB元件、EJB元件都可以访问这个数据源。

java:module/env/, 位于同一个ejb-jar.xml中的元件都可以访问这个数据源。

java:app/env/, 同一个应用中的所有元件,如EJB, servlet以及客户端元件都可以访问这个数据源。

@DataSourceDefinitions注释

通过@DataSourceDefinitions可以在一个元件类中创建多个数据源,就如同定义一个数组一样,每个数据源是数组的一个元素。下面是一个为EJB定义多个数据源的例子。
 

  1. @DataSourceDefinitions(  
  2.     value = {  
  3.         @DataSourceDefinition(name = "java:app/env/HelloStatefulEJB_DataSource",  
  4.             minPoolSize = 0,  
  5.             initialPoolSize = 0,  
  6.             className = "org.apache.derby.jdbc.ClientXADataSource",  
  7.             portNumber = 1527,  
  8.             serverName = "localhost",  
  9.             user = "APP",  
  10.             password = "APP",  
  11.             databaseName = "testdb",  
  12.             properties = {"connectionAttributes=;create=true"}  
  13.         ),  
  14.         @DataSourceDefinition(name = "java:comp/env/HelloStatefulEJB_DataSource",  
  15.             minPoolSize = 0,  
  16.             initialPoolSize = 0,  
  17.             className = "org.apache.derby.jdbc.ClientXADataSource",  
  18.             portNumber = 1527,  
  19.             serverName = "localhost",  
  20.             user = "APP",  
  21.             password = "APP",  
  22.             databaseName = "testdb",  
  23.             properties = {"connectionAttributes=;create=true"}  
  24.         )  
  25.     }  
  26. )  
  27. @Stateful 
  28. public class HelloStatefulEJB implements HelloStateful {  
  29.     ...  
  30.     ...  

 采用部署表述定义数据源

除了前面的方式以外,JavaEE 6还继续支持使用部署描述的方式定义数据源,部署描述信息可以写在application.xml、application-client.xml、web.xml以及ejb-jar.xml当中。下面的例子中定义的数据源与前面使用@DataSourceDefinition数据源含义相同。

  1. <data-source> 
  2.     <name>java:app/env/Application_Level_DataSource</name> 
  3.     <class-name>org.apache.derby.jdbc.ClientXADataSource</class-name> 
  4.     <server-name>localhost</server-name> 
  5.     <port-number>1527</port-number> 
  6.     <database-name>testdb</database-name> 
  7.     <user>APP</user> 
  8.     <password>APP</password> 
  9.     <property> 
  10.         <name>connectionAttributes</name> 
  11.         <value>;create=true</value> 
  12.     </property> 
  13. </data-source> 

如果在同一个应用程序中,分别通过@DataSourceDefinition和部署描述信息定义了两个数据源,但这这两个数据源具有相同的name属性。如果发证这样的情况,采用部署描述定义的数据源优先权高于采用注释声明定义的数据源。

【编辑推荐】

  1. Java EE 6增强的可扩展性:Web分片和可插拔框架
  2. 简化Web应用开发 Servlet 3.0特性详解
  3. Apache对JavaEE 6说“不”
  4. 可扩展GlassFish v3的JavaEE 6平台
  5. Java EE 6新特性之Servlet 3.0的异步处理
责任编辑:佚名 来源: 51CTO
相关推荐

2009-07-28 14:22:05

数据源控件ASP.NET

2017-09-04 14:52:51

Tomcat线程数据源

2010-12-31 16:22:04

Analysis Se

2011-05-05 13:30:17

GridViewListView布局

2009-06-15 13:24:46

JBoss数据源

2010-12-27 09:59:11

ODBC数据源

2017-06-14 23:42:27

大数据数据源架构

2009-11-03 14:56:36

ADO.NET数据源

2021-05-21 09:34:40

React React 17前端

2023-11-27 09:16:53

Python数据源类型

2009-07-21 17:41:58

JDBC数据源

2009-06-16 16:20:58

JBoss4配置Inf

2010-05-14 15:32:51

配置MySQL

2022-05-25 07:22:07

ES12JavaScript语言

2013-06-07 10:05:18

2009-07-07 13:02:29

JDK1.5

2013-06-09 10:15:09

2021-10-18 06:54:47

数据源数据预处理

2009-09-15 17:15:33

Linq排序

2009-09-08 11:09:39

LINQ数据源
点赞
收藏

51CTO技术栈公众号