Announcement Announcement Module
Collapse
No announcement yet.
c3p0 connection pooling and Oracle Client Encryption Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • c3p0 connection pooling and Oracle Client Encryption

    Hi there,

    I had the basic DriverManagerDataSource working with Oracle client encryption, as follows:

    Code:
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        	p:driverClassName="oracle.jdbc.OracleDriver"
        	p:url="${CONNECTION_STRING}"
        	p:username="${DB_USERNAME}"
        	p:password="${DB_PASSWORD}">
      		<property name="connectionProperties">
      			<value>
      				oracle.net.encryption_types_client: (RC4_256)
    				oracle.net.encryption_client: REQUIRED
    				oracle.net.crypto_checksum_types_client: (MD5)
    				oracle.net.crypto_checksum_client: REQUIRED
    				oracle.net.crypto_seed: 123456	
      			</value>
      		</property>
     	</bean>
    I wanted to add connection pooling so I switched to a c3p0 ComboPooledDataSource, but now I can't figure out how to set up the oracle encryption driver properties.

    I tried adding them as shown in the next code block, but I got java.sql.SQLException: ORA-01017: invalid username/password, and c3p0 goes into deadlock. So, I currently have them commented out, and the connection pooling works fine.

    Code:
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    		<property name="driverClass" value="oracle.jdbc.OracleDriver" />
    		<property name="jdbcUrl" value="${CONNECTION_STRING}" />
    		<property name="user" value="${DB_USERNAME}" />
    		<property name="password" value="${DB_PASSWORD}" />
    		
    		<!-- c3p0 properties -->
    		<property name="initialPoolSize" value="5" />
    		<property name="minPoolSize" value="5" />
        	        <property name="maxPoolSize" value="20" />
         	        <property name="acquireIncrement" value="5" />
        	        <property name="maxIdleTime" value="600" />
        	        <property name="idleConnectionTestPeriod" value="600" />
       		<!-- <property name="properties">
      			<value>
      				oracle.net.encryption_types_client: (RC4_256)
    				oracle.net.encryption_client: REQUIRED
    				oracle.net.crypto_checksum_types_client: (MD5)
    				oracle.net.crypto_checksum_client: REQUIRED
    				oracle.net.crypto_seed: 123456	
      			</value>
      		</property> -->
     	</bean>
    In this blog post: http://forum.springsource.org/showth...highlight=c3p0

    Someone suggested using a connectionCustomizerClassName:

    Code:
    <bean
          id="dataSource"
          class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="preferredTestQuery" value="${jdbc.validationQuery}"/>
        <property
            name="connectionCustomizerClassName"
            value="com.example.OracleConnectionCustomizer"/>
      </bean>
    
    
    public class OracleConnectionCustomizer extends AbstractConnectionCustomizer {
        
        @Override
        public void onAcquire(
                Connection connection, String parentDataSourceIdentityToken)
            throws Exception
        {
            // Follow synonyms when retrieving metadata.
            ((OracleConnection) connection).setIncludeSynonyms(true);
        }
    }
    However, since onAcquire runs AFTER the connection has been established, that doesn't seem like the right place to pass the oracle encryption parameters to the driver.

    Any suggestions? Am I missing something?

    Thanks,

    Jose
Working...
X