应用程序定义的数据源
可以通过注释或借助部署描述符,在应用程序中定义数据源,如 Java™ EE 规范所定义。
注: 对于应用程序定义的数据源,建议提供 commonLibraryRef 类装入器属性。privateLibraryRef 属性无法用于 java:global 名称空间,并且不鼓励用于其他作用域。如果多个应用程序声明了同一 java:global 名称空间以指定数据源,那么这些应用程序的 server.xml 文件必须都对同一共享库指定 commonLibraryRef 属性。
在应用程序中定义数据源时,必须使 JDBC 驱动程序可供应用程序使用。这通过在 server.xml 中为应用程序配置共享库来完成。
例如:
<application id="myApp" name="myApp" location="myApp.war" type="war">
<classloader commonLibraryRef="DB2Lib"/>
</application>
<library id="DB2Lib">
<fileset dir="C:/DB2/java" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/>
</library>
然后,可以通过注释或借助部署描述符在应用程序中定义数据源。
- 如以下示例中所示使用注释:
@DataSourceDefinition( name = "java:comp/env/jdbc/db2", className = "com.ibm.db2.jcc.DB2DataSource", databaseName = "SAMPLEDB", serverName = "localhost", portNumber = 50000, properties = { "driverType=4" }, user = "user1", password = "pwd1" ) public class MyServlet extends HttpServlet { @Resource(lookup="java:comp/env/jdbc/db2") DataSource ds;
- 例如,如以下示例中所示在 web.xml 文件中使用部署描述符:
<data-source> <name>java:comp/env/jdbc/db2</name> <class-name>com.ibm.db2.jcc.DB2DataSource</class-name> <server-name>localhost</server-name> <port-number>50000</port-number> <database-name>SAMPLEDB</database-name> <user>user1</user> <password>pwd1</password> <property><name>driverType</name><value>4</value></property> </data-source>
通常,在 server.xml 文件中的 dataSource 或 connectionManager 上定义的属性也可以在应用程序定义的数据源上加以指定。但是,不能指定对其他元素进行引用的属性(例如 connectionManagerRef 和 jdbcDriverRef),因为应用程序定义的数据源会隐式地定义连接管理器和 JDBC 驱动程序。将应用程序定义的数据源用于两阶段落实时,可以指定 recoveryAuthDataRef 属性以选择用于事务恢复的认证数据。但是,一定要知道事务恢复只能在应用程序处于运行状态时才能进行。可以在应用程序定义的数据源中使用变量、经过编码的密码以及持续时间语法。
注: 持续时间语法不适用于注释中显式定义的属性,例如 loginTimeout 或 maxIdleTime。
下面举例说明了两个使用连接管理器属性的数据源、变量、经过编码的密码以及持续时间语法的数据源。
@DataSourceDefinitions(value = {
@DataSourceDefinition(
name = "java:comp/env/jdbc/derby",
className = "org.apache.derby.jdbc.EmbeddedDataSource40",
databaseName = "${shared.resource.dir}/data/SAMPLEDB",
minPoolSize = 1,
maxPoolSize = 10,
maxIdleTime = 180,
properties = { "agedTimeout=10m", "connectionTimeout=30s", "createDatabase=create" }
),
@DataSourceDefinition(
name = "java:comp/env/jdbc/oracle",
className = "oracle.jdbc.pool.OracleDataSource",
url = "jdbc:oracle:thin:@//localhost:1521/SAMPLEDB",
user = "user1",
password = "{xor}Oz0vKDtt"
)
})