= Configuring DataSources in Tests
:index-group: Testing Techniques
:jbake-date: 2018-12-05
:jbake-type: page
:jbake-status: published

= InitialContext
properties

You can configure data sources from within your test case (avoiding the
need for an `openejb.xml` entirely) like so:

[source,java]
----
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");

p.put("myDataSource", "new://Resource?type=DataSource");
p.put("myDataSource.JdbcDriver", "org.apache.derby.jdbc.EmbeddedDriver");
p.put("myDataSource.JdbcUrl", "jdbc:derby:derbyDB;create=true");
p.put("myDataSource.JtaManaged", "true");

Context context = new InitialContext(p);
----

Under certain circumstances it may be necessary to load two versions of
the same driver. This is possible by definition of a classpath for the
resource which points to the specific driver files required for the
DataSource:

[source,java]
----
p.put("myDataSourceOne", "new://Resource?type=DataSource&classpath=/path/to/driverVersionOne.jar");
p.put("myDataSourceOne.JdbcDriver", "org.apache.derby.jdbc.EmbeddedDriver");
p.put("myDataSource.JdbcUrl", "jdbc:derby:myDatabaseOne;create=true");

p.put("myDataSourceTwo", "new://Resource?type=DataSource&classpath=/path/to/driverVersionTwo.jar");
p.put("myDataSourceTwo.JdbcDriver", "org.apache.derby.jdbc.EmbeddedDriver");
p.put("myDataSource.JdbcUrl", "jdbc:derby:myDatabaseTwo;create=true");
[source,java]
----

This will allow an application to communicate through legacy drivers to
the same JDBC provider.

See link:embedded-configuration.html[Embedded Configuration] for further
details on properties and overrides.

See link:containers-and-resources.html[Containers and Resources] for a
full list of supported Resource types and their properties.

== Note on <jta-data-source> and <non-jta-data-source>

When configuring DataSources to be used by persistence.xml files, the
DataSource supplied for `<jta-data-source>` is typically identical to
the `<non-jta-data-source>`, but with the `JtaManaged` property set
differently. Keeping with our philosophy to free you up from redundant
configuration, we will happily auto-create a missing jta-data-source or
non-jta-data-source based upon the supplied DataSource.

In the example above, a new DataSource would be generated as an exact
copy but with the name "myDataSourceUnmanaged" and its `JtaManaged` flag
set to `false`. If the supplied DataSource was not `JtaManaged`, then
the generated DataSource would be called "myDataSourceJta" and have its
`JtaManaged` flag set to `true`.

When relying on this functionality it is not necessary to specify the
name of the generated DataSource in the `persistence.xml` file.
