在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数据库的数据源。
以下是引用片段: @DataSourceDefinition(name = “java:app/env/Servlet_DataSource”, minPoolSize = 0, initialPoolSize = 0, className = “org.apache.derby.jdbc.ClientXADataSource”, user = “APP”, password = “APP”, databaseName = “testdb”, 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定义多个数据源的例子。
以下是引用片段: @DataSourceDefinitions( value = { @DataSourceDefinition(name = “java:app/env/HelloStatefulEJB_DataSource”, minPoolSize = 0, initialPoolSize = 0, className = “org.apache.derby.jdbc.ClientXADataSource”, portNumber = 1527, serverName = “localhost”, user = “APP”, password = “APP”, databaseName = “testdb”, properties = {“connectionAttributes=;create=true”} ), @DataSourceDefinition(name = “java:comp/env/HelloStatefulEJB_DataSource”, minPoolSize = 0, initialPoolSize = 0, className = “org.apache.derby.jdbc.ClientXADataSource”, portNumber = 1527, serverName = “localhost”, user = “APP”, password = “APP”, databaseName = “testdb”, properties = {“connectionAttributes=;create=true”} ) } ) @Stateful public class HelloStatefulEJB implements HelloStateful { … … } |
采用部署表述定义数据源
除了前面的方式以外,JavaEE 6还继续支持使用部署描述的方式定义数据源,部署描述信息可以写在application.xml、application-client.xml、web.xml以及ejb-jar.xml当中。下面的例子中定义的数据源与前面使用@DataSourceDefinition数据源含义相同。
以下是引用片段: <data-source> <name>java:app/env/Application_Level_DataSource</name> <class-name>org.apache.derby.jdbc.ClientXADataSource</class-name> <server-name>localhost</server-name> <port-number>1527</port-number> <database-name>testdb</database-name> <user>APP</user> <password>APP</password> <property> <name>connectionAttributes</name> <value>;create=true</value> </property> </data-source> |
如果在同一个应用程序中,分别通过@DataSourceDefinition和部署描述信息定义了两个数据源,但这这两个数据源具有相同的name属性。如果发证这样的情况,采用部署描述定义的数据源优先权高于采用注释声明定义的数据源。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
检阅云计算工具
虽然市场上有着数以百计的云计算解决方案供应商,但是作为用户的我们应当如何雾里看花找到真正满足我们需求的云计算产品与供应商?对云计算供应商进行分类对于更好地了解诸如应用程序迁移、自动化与监控等关键领域的领先厂商似乎并无裨益。
-
云计算应用程序管理的任务清单
把应用程序迁往云计算并不是最后的大功告成。有时候会发生一些迫使你不得不重新设计应用程序的突发事件,合规性需求可能会带来发展障碍,而如果你的云计算供应商不支持诸如组播的低层次网络服务,那么就可能带来带宽问题。
-
将应用程序映射至混合云
大多数企业都把公共云视为数据中心的一个协作技术。当建立一个混合云时,其中的关键在于知道哪个应用程序是基于云计算资源的,以及它们何时是基于云计算资源的。
-
应用程序成为云计算推广的障碍?
IT专业人士已开始认识到,当数据中心整合与虚拟化成为改进IT运行的必要条件时,应用程序交付就成为私有云首场秀的明星了。