Search code examples
jdbcconnection-poolingapache-karafapache-servicemix

servicemix, oracle datasource, connection pooling, max connections


I'm trying to configure connection pooling in servcemix 4.4.1. I've created a oracle datasource object and set the properties like user, password,url. I deployed the following xml as osgi service in my smx.

Here's my datasource configuration:

    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> 

     <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"> 
     <property name="URL" value="jdbc:oracle:thin:@connection:url"/> 
 <property name="user" value="****"/> 
 <property name="password" value="*****"/>


 </bean> 

 <service interface="javax.sql.DataSource" ref="dataSource"> 
 <service-properties> 
 <entry key="osgi.jndi.service.name" value="oracleds"/> 
 </service-properties> 
 </service> 
 </blueprint> 

The datasource object is created succesfully and I'm able to retrieve the object using jndi lookup in my bundle.

Now I want to apply connection pooling for which I need to declare "maximum connections". Please suggest me how can I declare max no. of connections in the above xml

Thanks in advance.


Solution

  • Here is an example of my blueprint.xml:

    <blueprint     xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
        xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
        xsi:schemaLocation=
                "http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"
        default-activation="eager">
    
        <cm:property-placeholder id="server.placeholder" persistent-id="test.datasource">
            <cm:default-properties>
                <cm:property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource" />
                <cm:property name="validationQuery" value="SELECT 1 FROM DUAL" />
                <cm:property name="defaultReadOnly" value="false" />
                <cm:property name="defaultAutoCommit" value="true" />
                <cm:property name="maxActive" value="100" />
                <cm:property name="whenExhaustedAction" value="2" />
                <cm:property name="maxWait" value="-1" />
                <cm:property name="maxIdle" value="8" />
                <cm:property name="minIdle" value="1" />
                <cm:property name="testOnBorrow" value="true" />
                <cm:property name="testOnReturn" value="true" />
                <cm:property name="timeBetweenEvictionRunsMillis" value="-1" />
                <cm:property name="numTestsPerEvictionRun" value="3" />
                <cm:property name="minEvictableIdleTimeMillis" value="1800000" />
                <cm:property name="testWhileIdle" value="false" />
                <cm:property name="softMinEvictableIdleTimeMillis" value="-1" />
                <cm:property name="lifo" value="true" />
            </cm:default-properties>
        </cm:property-placeholder>
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          <property name="driverClassName" value= "${driverClassName}" />
          <property name="url" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.instance}" />
          <property name="username" value="${db.user}" />
          <property name="password" value="${db.password}" />
          <property name="maxIdle" value="1" />
        </bean>
    
        <bean id="connectionFactory" class="org.apache.commons.dbcp.DataSourceConnectionFactory">
          <argument ref="dataSource" />
        </bean>
    
        <bean id="connectionPool" class="org.apache.commons.pool.impl.GenericObjectPool" >
          <argument><null/></argument>
          <argument value="${maxActive}" />
          <argument value="${whenExhaustedAction}" />
          <argument value="${maxWait}" />
          <argument value="${maxIdle}" />
          <argument value="${minIdle}" />
          <argument value="${testOnBorrow}" />
          <argument value="${testOnReturn}" />
          <argument value="${timeBetweenEvictionRunsMillis}" />
          <argument value="${numTestsPerEvictionRun}" />
          <argument value="${minEvictableIdleTimeMillis}" />
          <argument value="${testWhileIdle}" />
          <argument value="${softMinEvictableIdleTimeMillis}" />
          <argument value="${lifo}" />
        </bean>
    
        <bean id="pooledConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory" >
          <argument ref="connectionFactory" />
          <argument ref="connectionPool" />
          <argument><null/></argument>
          <argument value="${validationQuery}" />
          <argument value="${defaultReadOnly}" />
          <argument value="${defaultAutoCommit}" />
        </bean>
    
        <bean id="poolingDataSource" class="org.apache.commons.dbcp.PoolingDataSource" depends-on="pooledConnectionFactory">
          <argument ref="connectionPool" />
        </bean>
    
        <service interface="javax.sql.DataSource" ref="poolingDataSource"> <!--ref="oracleDataSource"-->
            <service-properties>
                <entry key="osgi.jndi.service.name" value="jdbc/testdb"/>
                <entry key="datasource.name" value="jdbc/testdb" />
            </service-properties>
        </service>
    
    </blueprint>
    

    This datasource work fine. I think the attribute "maxActive" close to what you need.