Multi-DataSource pooling with JDBC-Provider
Introduction
Many OSGi bundles require a pool of database connections, and usually the implementing it themselfes.
In larger multi-package projects resp. OSGi container installations, a whole list of bundles require access to one and the same data source.
This not only is a configuration nightmare, it also produces an unnecessary large number of unnecessary large pools.
The new OSGi bundle org.clazzes.util.jdbc-provider allows to configure multiple datasources, which are exported as OSGi services implementing the interface javax.sql.DataSource.
Configuring JDBC-Provider DataSources
This package uses the configuration PID org.clazzes.jdbc.provider and may be configured with keys using the following patterns:
Key | Description |
|---|---|
datasource.<datasourcename>.url | JDBC URL |
datasource.<datasourcename>.username | JDBC User |
datasource.<datasourcename>.password | JDBC Password |
datasource.<datasourcename>.validationQuery | Validation query, executed to ensure the application receives a valid connection |
For more supported key patterns take a look at theFull list of JDBC Provider Configuration Keys.
Typical JDBC URLs and validation queries can be found in our JDBC Snippets.
Configuration example
/etc/apache-karaf/org.clazzes.jdbc.provider.cfg:datasource.JPTEST.url = jdbc:mysql://localhost/JPTEST datasource.JPTEST.username = jptest datasource.JPTEST.password = jptest321 datasource.JPTEST.validationQuery = SELECT 1 datasource.SPECTRUM.url = jdbc:oracle:thin:@10.1.2.3:1521:XE datasource.SPECTRUM.maxActive = 8 datasource.SPECTRUM.username = FOO datasource.SPECTRUM.password = bar datasource.SPECTRUM.validationQuery = select SYSDATE from DUAL
Developer Snippets
pom.xml Snippets
It's important for the maven-bundle-plugin to import the Package javax.sql:
...
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
...
<Import-Package>*,javax.sql</Import-Package>
</instructions>
</configuration>
</plugin>
...
</plugin>
...
</build>
But that's all you need!
Blueprint Snippets
<bp:bean id="configProps" class="org.clazzes.util.osgi.ConfigPropertyAccessor" init-method="createDefaultConfig">
...
<bp:property name="defaultValues">
<bp:map>
<bp:entry key="datasourceName" value="MYDATASOURCE"/>
...
</bp:map>
</bp:property>
</bp:bean>
...
<bp:bean id="datasourceName" factory-ref="configProps" factory-method="getProperty">
<bp:argument value="datasourceName" />
</bp:bean>
...
<bp:bean id="datasourceMap" class="org.clazzes.util.osgi.ServiceMap" init-method="initialize">
<bp:property name="bundle" ref="blueprintBundle"/>
<bp:property name="keyProperty" value="datasource.name"/>
<bp:property name="serviceInterface" value="javax.sql.DataSource"/>
</bp:bean>
<bp:bean id="dataSource" factory-ref="datasourceMap" factory-method="getServiceProxy">
<bp:argument ref="datasourceName"/>
</bp:bean>
...
<bp:bean id="myDao" ...>
<bp:property name="dataSource" ref="dataSource" />
</bp:bean>
The blueprint xml can and should be kept free from any other JDBC stuff like URLs, driver magic and the like.