database connection wont close after updating to spring 5

43 Views Asked by At

my project was working fine with spring 3.2 but after i udate it to spring 5 my connections to db stay open for 30 min and 1 transaction take 7 connections. i use c3p0 for database connection. i didn't change the code and this is my config

 <bean id="pum"
          class="com.exp.jpa.integration.KaraPersistenceUnitManager">
        <property name="persistenceXmlLocations" value="${jpa.persistenceXmlLocations}"/>
        <property name="persistenceUnitPostProcessors">
            <bean class="com.exp.framework.jpa.MergingPersistenceUnitPostProcessor"/>
        </property>
        <property name="defaultDataSource" ref="dataSource"/>
    </bean>

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceUnitManager" ref="pum"/>
        <property name="loadTimeWeaver">
            <bean
                    class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.dialect" value="${jpa.hibernate.dialect}"/>
                <entry key="hibernate.default_schema" value="${jpa.schema}"/>
                <entry key="hibernate.connection.autocommit" value="true"/>
                <entry key="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
                <entry key="hibernate.show_sql" value="${jpa.show_sql}"/>
                <entry key="hibernate.format_sql" value="true"/>
                <entry key="hibernate.proc.param_null_passing" value="true"/>
            </map>
        </property>
        <property name="jpaDialect">
            <bean class="com.exp.framework.db.KaraHibernateJpaDialect">
                <property name="name" value="Main"/>
            </bean>
        </property>
        <property name="jpaVendorAdapter">
            <bean id="jpaVendorAdapter"
                  class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="ORACLE"/>
                <property name="showSql" value="false"/>
            </bean>
        </property>
    </bean>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true" destroy-method="close">
        <constructor-arg index="0" value="KaraPool"/>
        <property name="driverClass" value="${jpa.dataSource.driverClass}"/>
        <property name="description" value="main pool data source"/>
        <property name="jdbcUrl" value="${jpa.dataSource.jdbcUrl}"/>
        <property name="user" value="${jpa.connection.user}">
        </property>
        <property name="password" value="${jpa.connection.password}">
        </property>
        <property name="autoCommitOnClose" value="false"/>
        <property name="forceIgnoreUnresolvedTransactions" value="false"/>
        <property name="initialPoolSize" value="${jpa.dataSource.initPoolSize:1}"/>
        <property name="minPoolSize" value="${jpa.dataSource.minPoolSize:1}"/>
        <property name="maxPoolSize" value="${jpa.dataSource.maxPoolSize:10}"/>
        <property name="maxIdleTime" value="${jpa.dataSource.maxIdleTime:300}"/>
        <property name="debugUnreturnedConnectionStackTraces" value="true"/>
        <property name="propertyCycle" value="${jpa.dataSource.propertyCycle:60}"/>
        <!-- In Second -->
        <property name="acquireRetryDelay" value="${jpa.dataSource.acquireRetryDelay:1000}"/>
        <!-- In Mili Second -->
        <property name="maxConnectionAge" value="${jpa.dataSource.maxConnectionAge:0}"/>
        <!-- In Second -->
        <property name="checkoutTimeout" value="${jpa.dataSource.checkoutTimeout:5000}"/>
        <!-- In Mili Second -->
        <property name="acquireIncrement" value="${jpa.dataSource.acquireIncrement:1}"/>
        <property name="numHelperThreads" value="${jpa.dataSource.numHelperThreads:5}"/>
        <property name="acquireRetryAttempts" value="${jpa.dataSource.acquireRetryAttempts:1}"/>
        <property name="unreturnedConnectionTimeout"
                  value="${jpa.dataSource.unreturnedConnectionTimeout:600}"/>
        <!-- In Second -->
        <property name="breakAfterAcquireFailure" value="${jpa.dataSource.breakAfterAcquireFailure:false}"/>
        <property name="testConnectionOnCheckout" value="${jpa.dataSource.testConnectionOnCheckout:false}"/>
        <property name="testConnectionOnCheckin" value="${jpa.dataSource.testConnectionOnCheckin:false}"/>
        <property name="preferredTestQuery" value="select 0 from dual"/>
    </bean>
    <bean name="mbeanServer"
          class="org.springframework.jmx.support.MBeanServerFactoryBean">
        <property name="locateExistingServerIfPossible" value="true"/>
        <property name="registerWithFactory" value="true"/>
    </bean>

    <bean id="register" class="com.mchange.v2.c3p0.management.DynamicPooledDataSourceManagerMBean">
        <constructor-arg index="0" ref="dataSource"/>
        <constructor-arg index="1">
            <bean factory-bean="pooledDataSourceName" factory-method="getPooledDataSourceObjectName"/>
        </constructor-arg>
        <constructor-arg index="2" ref="mbeanServer"/>
    </bean>

    <bean id="pooledDataSourceName" class="com.exp.framework.db.PooledDataSourceBeanNameFactory">
        <constructor-arg index="0" ref="dataSource"/>
    </bean>

    <!--
        <bean name="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"
            lazy-init="false" depends-on="mbeanServer">
            <property name="server" ref="mbeanServer"></property>
            <property name="namingStrategy">
                <bean class="org.springframework.jmx.export.naming.KeyNamingStrategy">
                </bean>
            </property>
            <property name="beans">
                <map>
                    <entry key="com.exp.pool.connection:type=c3p0,name=Main" value-ref="dataSource_c3">
                    </entry>
                </map>
            </property>
            <property name="assembler" >
             <bean class="org.springframework.jmx.export.assembler.MethodExclusionMBeanInfoAssembler">
              <property name="ignoredMethods">
                <value>
                    close,
                    getConnection,
                    getLastAcquisitionFailure,
                    getLastCheckinFailure,
                    getLastCheckoutFailure,
                    getLastIdleTestFailure,
                    getLastConnectionTestFailure,
                    getConnectionPoolDataSource,
                    getNestedDataSource,
                    getReference,
                    getConnection,
                    getPassword,
                    getPooledConnection,
                    getProperties,
                    getLogWriter,
                    getLastAcquisitionFailureDefaultUser,
                    getLastCheckoutFailureDefaultUser,
                    getLastCheckinFailureDefaultUser,
                    getLastIdleTestFailureDefaultUser,
                    getLastConnectionTestFailureDefaultUser,
                    setPassword,
                    setProperties,
                    setLogWriter
                    isWrapperFor
                    unwrap,
                    equals,
                    doResolve,
                    removeVetoableChangeListener,
                    addVetoableChangeListener,
                    removePropertyChangeListener,
                    addPropertyChangeListener,
                    setIdentityToken,
                    setDataSourceName,
                    getIdentityToken,
                    setConnectionPoolDataSource,
                </value>
              </property>
             </bean>
            </property>
        </bean>
SpringBaseEntityManagerFactoryProvider provider = new SpringBaseEntityManagerFactoryProvider(); 
EntityManagerFactory emf = provider.getEntityManagerFactory(); 
JpaTransactionManager txManager = new JpaTransactionManager(emf);
Map<String, Object> jpaProperties = new HashMap<>();
jpaProperties.put("org.hibernate.flushMode", "COMMIT");
txManager.setJpaPropertyMap(jpaProperties); 
DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
def.setName("LogTransaction"); 
org.springframework.transaction.TransactionStatus transactionStatus = txManager.getTransaction(def); try { ... 
txManager.commit(transactionStatus);

i expected to use 1 connection to db for a transaction and close it after commit but after update to spring 5 it use 7 connections for 1 transaction and wont close it before 30 min

0

There are 0 best solutions below