= DataSource Configuration
:index-group: Datasource
:jbake-date: 2018-12-05
:jbake-type: page
:jbake-status: published


A DataSource can be declared via xml in the
`<tomee-home>/conf/tomee.xml` file or in a `WEB-INF/resources.xml` file
using a declaration like the following. All properties in the element
body are optional.

[source,xml]
----
<Resource id="myDataSource" type="javax.sql.DataSource">
    accessToUnderlyingConnectionAllowed = false
    alternateUsernameAllowed = false
    connectionProperties = 
    defaultAutoCommit = true
    defaultReadOnly = 
    definition = 
    ignoreDefaultValues = false
    initialSize = 0
    jdbcDriver = org.hsqldb.jdbcDriver
    jdbcUrl = jdbc:hsqldb:mem:hsqldb
    jtaManaged = true
    maxActive = 20
    maxIdle = 20
    maxOpenPreparedStatements = 0
    maxWaitTime = -1 millisecond
    minEvictableIdleTime = 30 minutes
    minIdle = 0
    numTestsPerEvictionRun = 3
    password = 
    passwordCipher = PlainText
    poolPreparedStatements = false
    serviceId = 
    testOnBorrow = true
    testOnReturn = false
    testWhileIdle = false
    timeBetweenEvictionRuns = -1 millisecond
    userName = sa
    validationQuery = 
</Resource>
----

Alternatively, a DataSource can be declared via properties in the
`<tomee-home>/conf/system.properties` file or via Java VirtualMachine
`-D` properties. The properties can also be used when embedding TomEE
via the `jakarta.ejb.embeddable.EJBContainer` API or `InitialContext`

[source,properties]
----
myDataSource = new://Resource?type=javax.sql.DataSource
myDataSource.accessToUnderlyingConnectionAllowed = false
myDataSource.alternateUsernameAllowed = false
myDataSource.connectionProperties = 
myDataSource.defaultAutoCommit = true
myDataSource.defaultReadOnly = 
myDataSource.definition = 
myDataSource.ignoreDefaultValues = false
myDataSource.initialSize = 0
myDataSource.jdbcDriver = org.hsqldb.jdbcDriver
myDataSource.jdbcUrl = jdbc:hsqldb:mem:hsqldb
myDataSource.jtaManaged = true
myDataSource.maxActive = 20
myDataSource.maxIdle = 20
myDataSource.maxOpenPreparedStatements = 0
myDataSource.maxWaitTime = -1 millisecond
myDataSource.minEvictableIdleTime = 30 minutes
myDataSource.minIdle = 0
myDataSource.numTestsPerEvictionRun = 3
myDataSource.password = 
myDataSource.passwordCipher = PlainText
myDataSource.poolPreparedStatements = false
myDataSource.serviceId = 
myDataSource.testOnBorrow = true
myDataSource.testOnReturn = false
myDataSource.testWhileIdle = false
myDataSource.timeBetweenEvictionRuns = -1 millisecond
myDataSource.userName = sa
myDataSource.validationQuery = 
----

Properties and xml can be mixed. Properties will override the xml
allowing for easy configuration change without the need for $\{} style
variable substitution. Properties are not case-sensitive. If a property
is specified that is not supported by the declared DataSource a warning
will be logged. If a DataSource is needed by the application and one is
not declared, TomEE will create one dynamically using default settings.
Multiple DataSource declarations are allowed.

See the link:common-datasource-configurations.html[Common DataSource
Configurations] page for examples of configuring datasources for Derby,
MySQL, Oracle and other common databases.

== Supported Properties

Property

Type

Default

Description

accessToUnderlyingConnectionAllowed

boolean

false

If true the raw physical connection to the database can be accessed

alternateUsernameAllowed

boolean

false

If true allow an alternate username and password to be specified on the
connection, rather than those specified in the DataSource definition.

connectionProperties

String

The connection properties that will be sent to the JDBC driver when
establishing new connections

defaultAutoCommit

boolean

true

The default auto-commit state of new connections

defaultReadOnly

String

The default read-only state of new connections If not set then the
setReadOnly method will not be called. (Some drivers don't support read
only mode, ex: Informix)

definition

String

ignoreDefaultValues

boolean

false

use only all set values in this config will need a lot of properties but
allow to not set some values

initialSize

int

0

The size to reach when creating the datasource.

jdbcDriver

String

org.hsqldb.jdbcDriver

Driver class name

jdbcUrl

java.net.URI

jdbc:hsqldb:mem:hsqldb

Url for creating connections

jtaManaged

boolean

true

Determines whether or not this data source should be JTA managed or user
managed.

maxActive

int

20

The maximum number of active connections that can be allocated from this
pool at the same time, or a negative number for no limit. N.B. When
using dbcp2 with TomEE 7 ("DataSourceCreator dbcp"), "MaxTotal" should
be used as opposed to "MaxActive".

maxIdle

int

20

The maximum number of connections that can remain idle in the pool,
without extra ones being released, or a negative number for no limit.

maxOpenPreparedStatements

int

0

The maximum number of open statements that can be allocated from the
statement pool at the same time, or zero for no limit.

maxWaitTime

time

-1 millisecond

The maximum number of time that the pool will wait (when there are no
available connections) for a connection to be returned before throwing
an exception, or -1 to wait indefinitely.

minEvictableIdleTime

time

30 minutes

The minimum amount of time a connection may sit idle in the pool before
it is eligible for eviction by the idle connection evictor (if any).

minIdle

int

0

The minimum number of connections that can remain idle in the pool,
without extra ones being created, or zero to create none.

numTestsPerEvictionRun

int

3

The number of connections to examine during each run of the idle
connection evictor thread (if any).

password

String

Default password

passwordCipher

String

PlainText

poolPreparedStatements

boolean

false

If true, a statement pool is created for each Connection and
PreparedStatements created by one of the following methods are pooled:

serviceId

String

testOnBorrow

boolean

true

If true connections will be validated before being returned from the
pool. If the validation fails, the connection is destroyed, and a new
connection will be retrieved from the pool (and validated).

testOnReturn

boolean

false

If true connections will be validated before being returned to the pool.
If the validation fails, the connection is destroyed instead of being
returned to the pool.

testWhileIdle

boolean

false

If true connections will be validated by the idle connection evictor (if
any). If the validation fails, the connection is destroyed and removed
from the pool

timeBetweenEvictionRuns

time

-1 millisecond

The number of milliseconds to sleep between runs of the idle connection
evictor thread. When set to a negative number, no idle connection
evictor thread will be run.

userName

String

sa

Default user name

validationQuery

String

The SQL query that will be used to validate connections from this pool
before returning them to the caller. If specified, this query MUST be an
SQL SELECT statement that returns at least one row.

LogSql

boolean

false

Whether SQL queries should be logged or not

== accessToUnderlyingConnectionAllowed

If true the raw physical connection to the database can be accessed
using the following construct:

[source,java]
----
Connection conn = ds.getConnection();
Connection rawConn = ((DelegatingConnection) conn).getInnermostDelegate();
...
conn.close()
----

Default is `false`, because misbehaving programs can do harmful things to
the raw connection such as closing the raw connection or continuing to
use the raw connection after it has been assigned to another logical
connection. Be careful and only use when you need direct access to
driver specific extensions.

NOTE: Do NOT close the underlying connection, only the original logical
connection wrapper.

== connectionProperties

The connection properties that will be sent to the JDBC driver when
establishing new connections

Format of the string must be [propertyName=property;]*

NOTE - The "user" and "password" properties will be passed explicitly,
so they do not need to be included here.

== TransactionIsolation

The default TransactionIsolation state of new connections.

If not set then the `setTransactionIsolation` method will not be called.
The allowed values for this property are:

* `NONE`
* `READ_COMMITTED`
* `READ_UNCOMMITTED`
* `REPEATABLE_READ`
* `SERIALIZABLE`

Note: Most JDBC drivers do not support all isolation levels
DefaultTransactionIsolation

== initialSize

The initial size to initialize the pool of connections.

== jtaManaged

Determines whether or not this data source should be JTA managed or user
managed.

If set to 'true' it will automatically be enrolled in any ongoing
transactions. Calling begin/commit/rollback or setAutoCommit on the
datasource or connection will not be allowed. If you need to perform
these functions yourself, set `JtaManaged` to `false`

In terms of JPA `persistence.xml`:

* `JtaManaged=true` can be used as a 'jta-data-source'
* `JtaManaged=false` can be used as a 'non-jta-data-source'

== maxOpenPreparedStatements

The maximum number of open statements that can be allocated from the
statement pool at the same time, or zero for no limit.

NOTE - Some drivers have limits on the number of open statements, so
make sure there are some resources left for the other (non-prepared)
statements.

== poolPreparedStatements

If true, a statement pool is created for each Connection and
PreparedStatements created by one of the following methods are pooled:

[source,java]
----
public PreparedStatement prepareStatement(String sql);
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
----

== testOnBorrow

If `true` connections will be validated before being returned from the
pool. If the validation fails, the connection is destroyed, and a new
connection will be retrieved from the pool (and validated).

NOTE - for a true value to have any effect, the ValidationQuery
parameter must be set.

== testOnReturn

If true connections will be validated before being returned to the pool.
If the validation fails, the connection is destroyed instead of being
returned to the pool.

NOTE - for a true value to have any effect, the ValidationQuery
parameter must be set.

== testWhileIdle

If true connections will be validated by the idle connection evictor (if
any). If the validation fails, the connection is destroyed and removed
from the pool

NOTE - for a true value to have any effect, the
timeBetweenEvictionRunsMillis property must be a positive number and the
ValidationQuery parameter must be set.

== XADataSource

There are several ways to configure a XADataSource. Depending the
underlying datasource (Oracle, MySQL one or the other solution can be
more adapted.

This part deals with `JtaManaged` XaDataSource since a not managed
XaDataSource can be defined as a standard resource using `class-name`.

=== Single definition

First solution is to define as `JdbcDriver` an XADataSource:

[source,xml]
----
<Resource id="myXaDs" type="DataSource">
    JdbcDriver = org.foo.MyXaDataSource

    myXaProperty = value

    myPoolProperty = 10
</Resource>
----

This solution merges properties for the XaDataSource and the pool
(tomcat-jdbc for TomEE, dbcp for OpenEJB by default but still
configurable with DataSourceCreator).

Note: in this case for Oracle for instance you'll define UserName for
the pool and User for the datasource which can look weird if you don't
know properties are used for 2 instances (pool and datasource).

Note: this solution uses the same logic as the `@DataSourceDefinition`
factory mechanism.

=== Two resources definition

An alternative is to define a resource for the XaDataSource:

[source,xml]
----
<Resource id="myXa" class-name="org.foo.MyXaDataSource">
    myXaProperty = value
</Resource>
----

And then wrap it in the pool:

[source,xml]
----
<Resource id="myXaDs" type="DataSource">
    DataSourceCreator = [dbcp|dbcp-alternative]
    myPoolProperty = 10
</Resource>
----

Note: `dbcp` is more adapted than `dbcp-alternative` in most of the case
because it is reusing direct dbcp JTA management.

=== Known issues

For TomEE 1.7.0/1.7.1 you can need to add the property:

[source,properties]
----
 openejb.datasource.pool = true
----

in resource properties to ensure the resource is pooled.

=== Details about DataSource and their factories (advanced configuration)

link:datasource-configuration-by-creator.html[Configuration by creator]
