Yes, you cannot extend com.mchange.v2.c3p0.ComboPooledDataSource because it is publicly available. Here is a workaround by which I have achieved this.
I extended org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy and passed the data source com.mchange.v2.c3p0.ComboPooledDataSource as a constructor argument.
Here is my hibernate.cfg.xml configuration of the overlying data source:
<bean id="dataSource" class="MyDataSource"> <constructor-arg ref="c3p0DataSource" /> </bean> <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.driver.className}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="acquireIncrement" value="${dataSource.acquireIncrement}" /> <property name="acquireRetryAttempts" value="${dataSource.acquireRetryAttempts}" /> <property name="acquireRetryDelay" value="${dataSource.acquireRetryDelay}" /> <property name="autoCommitOnClose" value="${dataSource.autoCommitOnClose}" /> <property name="breakAfterAcquireFailure" value="${dataSource.breakAfterAcquireFailure}" /> <property name="checkoutTimeout" value="${dataSource.checkoutTimeout}" /> <property name="debugUnreturnedConnectionStackTraces" value="${dataSource.debugUnreturnedConnectionStackTraces}" /> <property name="forceIgnoreUnresolvedTransactions" value="${dataSource.forceIgnoreUnresolvedTransactions}" /> <property name="idleConnectionTestPeriod" value="${dataSource.idleConnectionTestPeriod}" /> <property name="initialPoolSize" value="${dataSource.initialPoolSize}" /> <property name="maxAdministrativeTaskTime" value="${dataSource.maxAdministrativeTaskTime}" /> <property name="maxConnectionAge" value="${dataSource.maxConnectionAge}" /> <property name="maxIdleTime" value="${dataSource.maxIdleTime}" /> <property name="maxIdleTimeExcessConnections" value="${dataSource.maxIdleTimeExcessConnections}" /> <property name="maxPoolSize" value="${dataSource.maxPoolSize}" /> <property name="maxStatements" value="${dataSource.maxStatements}" /> <property name="maxStatementsPerConnection" value="${dataSource.maxStatementsPerConnection}" /> <property name="minPoolSize" value="${dataSource.minPoolSize}" /> <property name="numHelperThreads" value="${dataSource.numHelperThreads}" /> <property name="propertyCycle" value="${dataSource.propertyCycle}" /> <property name="testConnectionOnCheckin" value="${dataSource.testConnectionOnCheckin}" /> <property name="testConnectionOnCheckout" value="${dataSource.testConnectionOnCheckout}" /> <property name="unreturnedConnectionTimeout" value="${dataSource.unreturnedConnectionTimeout}" /> </bean> Mine jdbc.properties file: jdbc.driver.className=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=xxxxx jdbc.username=xxx jdbc.password=xxxxxxxxx #Encrytped password here jdbc.hibernate.dialect=org.hibernate.dialect.SQLServerDialect hibernate.show_sql=false hibernate.hbm2ddl.auto=update dataSource.acquireIncrement=3 dataSource.acquireRetryAttempts=30 dataSource.acquireRetryDelay=60000 dataSource.autoCommitOnClose=false dataSource.breakAfterAcquireFailure=false dataSource.checkoutTimeout=0 dataSource.debugUnreturnedConnectionStackTraces=false dataSource.forceIgnoreUnresolvedTransactions=false dataSource.idleConnectionTestPeriod=0 dataSource.initialPoolSize=10 dataSource.maxAdministrativeTaskTime=0 dataSource.maxConnectionAge=0 dataSource.maxIdleTime=0 dataSource.maxIdleTimeExcessConnections=0 dataSource.maxPoolSize=10 dataSource.maxStatements=0 dataSource.maxStatementsPerConnection=0 dataSource.minPoolSize=10 dataSource.numHelperThreads=3 dataSource.propertyCycle=0 dataSource.testConnectionOnCheckin=false dataSource.testConnectionOnCheckout=false dataSource.unreturnedConnectionTimeout=0 Mine extended class where I decrypt the password before passing the datasource to transaction Proxy wrapper. import javax.sql.DataSource; import org.jasypt.util.text.BasicTextEncryptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import com.csc.emms.common.EMMSConstraints; import com.mchange.v2.c3p0.ComboPooledDataSource; public class MyDataSource extends TransactionAwareDataSourceProxy { private static char[] appName = { 'B', 'I', 'N', 'G', 'O', 'D', 'I', 'N', 'G', 'O' }; @Autowired
source share