Application-defined data sources
We can define a data source within the application, through annotations or in the deployment descriptor, as defined by the Java EE specification.
Note that the commonLibraryRef class loader attribute is recommended for application defined data sources. The privateLibraryRef attribute cannot be used for the java:global namespace and is discouraged for the other scopes. If multiple applications declare the same java:global namespace to specify the data source, the server.xml files of the applications must all specify a commonLibraryRef attribute to the same shared library.
When you define a data source in an application, the JDBC driver must be made available to the application. This definition is accomplished by configuring a shared library in the server.xml for the application.
For example:
<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>
Then, we can define a data source in the application either through annotations or in the deployment descriptor.
- Use annotations as in the following example:
@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;
<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>
In general, properties that can be defined on dataSource or connectionManager in the server.xml files can also be specified on application defined data sources. Two exceptions to this are connectionManagerRef and jdbcDriverRef, which we cannot specify because the application defined data source implicitly defines the connection manager and JDBC driver. When using application defined data sources for two-phase commit, we can specify the recoveryAuthDataRef property to select the authentication data used for transaction recovery. However, it is important to be aware that recovery of transactions is only possible while the application is running. We can use variables, encoded passwords, and duration syntax in application defined data sources.
Note that the duration syntax does not apply to properties that are explicitly defined in the annotation, such as loginTimeout or maxIdleTime.
Here is an example of two data sources that use connection manager properties, variables, encoded passwords, and duration syntax.
@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 = "", url = "jdbc:oracle:thin:@//localhost:1521/SAMPLEDB", user = "user1", password = "{xor}Oz0vKDtt" ) })