| = Configuring DataSources in tomee.xml |
| :index-group: Configuration |
| :jbake-date: 2018-12-05 |
| :jbake-type: page |
| :jbake-status: published |
| |
| |
| The __ element is used to configure a _javax.sql.DataSource_. It is also |
| used to configure other resources like Timers, Topics, Queues. We will |
| see some examples of using to configure a DataSource. |
| |
| The element is designed after `@Resource` annotation and has similar |
| attributes. |
| |
| For example, this annotation in your bean: |
| |
| [source,java] |
| ---- |
| @Resource(name = "myDerbyDatasource", type = javax.sql.DataSource.class) |
| ---- |
| |
| Would map to a Resource declared in your openejb.xml as follows: |
| |
| [source,xml] |
| ---- |
| <Resource id="myDerbyDatasource" type="javax.sql.DataSource"> |
| . . . . |
| <Resource> |
| ---- |
| |
| Note that in the xml element, the _type_ value of _javax.sql.DataSource_ |
| can abbreviated to just _DataSource_ as follows: |
| |
| [source,xml] |
| ---- |
| <Resource id="myDerbyDatasource" type="DataSource"> |
| . . . . |
| <Resource> |
| ---- |
| |
| It is also possible to specify the path to the driver jar file using a |
| classpath attribute like so: |
| |
| [source,xml] |
| ---- |
| <Resource id="myDerbyDatasource" type="DataSource" classpath="/path/to/driver.jar"> |
| . . . . |
| <Resource> |
| ---- |
| |
| ...Or in a http://maven.apache.org/[Maven] environment like so: |
| |
| [source,xml] |
| ---- |
| <Resource id="myDerbyDatasource" type="DataSource" classpath="mvn:org.apache.derby:derby:10.10.1.1"> |
| . . . . |
| <Resource> |
| ---- |
| |
| See link:containers-and-resources.html[Containers and Resources] for a |
| complete list of supported DataSource properties. |
| |
| See link:datasource-password-encryption.html[DataSource Password |
| Encryption] for information on specifying non-plain-text database |
| passwords in your openejb.xml file. |
| |
| See link:common-datasource-configurations.html[Common DataSource |
| Configurations] for a list of the commonly used databases and their |
| driver configurations. |
| |
| See link:datasource-configuration-by-creator.html[DataSource |
| Configuration by Creator] for a list of the different properties |
| supported for each data source creator. |
| |
| You may also need data partitioning per customer or depending on any |
| other business criteria. That's also an available feature. See |
| link:dynamic-datasource.html[Dynamic Datasource] for more details. |
| |
| == JNDI names for configured DataSources |
| |
| === Example 1 |
| |
| [source,xml] |
| ---- |
| <Resource id="Default JDBC Database" type="DataSource"> |
| . . . . . |
| </Resource> |
| ---- |
| |
| The global jndi name would be _java:openejb/Resource/Default JDBC |
| Database_ |
| |
| === Example 2 |
| |
| [source,xml] |
| ---- |
| <Resource id="Derby Database" type="DataSource"> |
| . . . . . |
| </Resource> |
| ---- |
| |
| The global jndi name would be _java:openejb/Resource/Derby Database_ |
| |
| == Obtaining a DataSource |
| |
| DataSource references in your ejb should get automatically mapped to the |
| Resource you declare. The shortest and easiest rule is that _if your |
| reference name matches a Resource in your openejb.xml, that's the one |
| you get_. Essentially, the rules for mapping are as follows. |
| |
| [arabic] |
| . Name Attribute Match - `@Resource` with a name attribute matching the |
| resource name gets that resource injected |
| . Injected Name Match - variable name matching the resource name gets |
| that resource injected |
| . No Match - nothing matches a resource name, so the first resource |
| available gets injected |
| |
| There are various ways one could obtain a DataSource now. Lets take an |
| example of Derby. |
| |
| With a Resource declaration in your openejb.xml like this: |
| |
| [source,xml] |
| ---- |
| <Resource id="myDerbyDatabase" type="DataSource"> |
| . . . . . |
| </Resource> |
| ---- |
| |
| There are several possible ways to refer to it, as follows. |
| |
| _BY matching variable name to resource name_ |
| |
| [source,java] |
| ---- |
| @Stateless |
| public class FooBean { |
| @Resource DataSource myDerbyDatabase; |
| } |
| ---- |
| |
| _OR BY matching name_ |
| |
| [source,java] |
| ---- |
| @Stateless |
| public class FooBean { |
| @Resource(name="myDerbyDatabase") |
| DataSource dataSource; |
| } |
| ---- |
| |
| _OR BY JNDI lookup_ |
| |
| [source,java] |
| ---- |
| @Resource(name="myDerbyDatabase", type=javax.sql.DataSource.class) |
| @Stateless |
| public class FooBean { |
| |
| public void setSessionContext(SessionContext sessionContext) { |
| DataSource dataSource = (DataSource) |
| sessionContext.lookup("myDerbyDatabase"); |
| } |
| |
| public void someOtherMethod() throws Exception { |
| InitialContext initialContext = new InitialContext(); |
| DataSource dataSource = (DataSource) |
| initialContext.lookup("java:comp/env/myDerbyDatabase"); |
| } |
| } |
| ---- |
| |
| _OR_ |
| |
| [source,xml] |
| ---- |
| <resource-ref> |
| <res-ref-name>myDerbyDatabase</res-ref-name> |
| <res-type>javax.sql.DataSource</res-type> |
| </resource-ref> |
| ---- |
| |
| _OR_ |
| |
| [source,xml] |
| ---- |
| <resource-ref> |
| <res-ref-name>jdbc/myDerbyDatabase</res-ref-name> |
| <res-type>javax.sql.DataSource</res-type> |
| </resource-ref> |
| ---- |
| |
| _OR_ |
| |
| [source,xml] |
| ---- |
| <resource-ref> |
| <res-ref-name>someOtherName</res-ref-name> |
| <res-type>javax.sql.DataSource</res-type> |
| <mapped-name>myDerbyDatabase</mapped-name> |
| </resource-ref> |
| ---- |