I am working on a project that uses spring + hibernate + mysql and c3p0 to pool pools.
Currently, connection pool properties are loaded through properties defined outside of src. (for example: $ {db_uname})
It all starts fine when we create a spring bean.
It may happen that the database we connected to is unavailable for any reason, and we would like to switch hosts.
You must make a callback where you plan to connect to the new host and reinitialize the pool
Any pointers on how to discard the existing data source / connection pool elegantly will be very helpful.
This is what my spring configuration file looks like
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <import resource="component-scans-1.xml" /> <import resource="component-scans-2.xml" /> <util:properties id="serviceManagerProperties" location="classpath:servicemanagers.properties" /> <context:property-placeholder location="classpath:database.config.properties,classpath:framework.properties" /> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <context:mbean-server id="mbeanServer" /> <context:mbean-export server="mbeanServer" default-domain="abc" /> <bean id="cacheManager" factory-method="getInstance" class="net.sf.ehcache.CacheManager" /> <bean class="net.sf.ehcache.management.ManagementService" init-method="init"> <constructor-arg ref="cacheManager" /> <constructor-arg ref="mbeanServer" /> <constructor-arg value="false" /> <constructor-arg value="false" /> <constructor-arg value="false" /> <constructor-arg value="true" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter" ref="jpaAdapter" /> <property name="persistenceXmlLocation" value="classpath*:META-INF/framework-persistence.xml" /> <property name="persistenceUnitName" value="PU-NAME" /> <property name="jpaProperties"> <props> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory </prop> <prop key="hibernate.ejb.cfgfile">hibernate.cfg.xml</prop> <prop key="hibernate.generate_statistics">true</prop> <prop key="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </prop> <prop key="hibernate.connection.url"> jdbc:mysql://${dbhost}/${dbschema}?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8 </prop> <prop key="hibernate.connection.username">${dbuser}</prop> <prop key="hibernate.connection.password">${dbpass}</prop> <prop key="hibernate.connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </prop> <prop key="hibernate.c3p0.maxPoolSize">${hibernate.c3p0.maxSize}</prop> <prop key="hibernate.c3p0.minPoolSize">${hibernate.c3p0.minSize}</prop> <prop key="hibernate.c3p0.acquireIncrement">${hibernate.c3p0.acquireIncrement}</prop> <prop key="hibernate.c3p0.idleConnectionTestPeriod">${hibernate.c3p0.idleTestPeriod}</prop> <prop key="hibernate.c3p0.maxStatements">${hibernate.c3p0.maxStatements}</prop> <prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}</prop> </props> </property> </bean> <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
Assuming the database schema is correct, let's say I get the database credentials and host information in this case, I need to "re-establish" the connection pool.
source share