Home> Java> javaTutorial> body text

In-depth understanding of spring multi-data source configuration

高洛峰
Release: 2017-01-24 10:35:46
Original
1187 people have browsed it

We often encounter the problem of multiple data sources in projects, especially projects such as data synchronization or scheduled tasks. The biggest headache for multiple data sources is not configuring multiple data sources, but how to flexibly and dynamically switch data sources. For example, in a spring and hibernate framework project, we often configure a dataSource to connect to the database in the spring configuration, and then bind it to the sessionFactory, and then specify the sessionFactory in the dao layer code to perform database operations.

In-depth understanding of spring multi-data source configuration

As shown in the picture above, each block is designated to be tied. If there are multiple data sources, it can only be in the way shown in the picture below.

In-depth understanding of spring multi-data source configuration

It can be seen that two SessionFactory are written in the Dao layer code. If there is another data source in the future, the code will have to be changed to add a SessionFactory. Obviously this does not Does not comply with the opening and closing principle.

Then the correct approach should be

In-depth understanding of spring multi-data source configuration

The code is as follows:

1. applicationContext.xml

       classpath:com/resource/config.properties                                    org.hibernate.dialect.MySQLDialect org.springframework.orm.hibernate4.SpringSessionContext false true create     com.po                            
Copy after login

2. DynamicDataSource.class

package com.core; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { return DatabaseContextHolder.getCustomerType(); } }
Copy after login

3. DatabaseContextHolder.class

package com.core; public class DatabaseContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } }
Copy after login

4. DataSourceInterceptor.class

package com.core; import org.aspectj.lang.JoinPoint; import org.springframework.stereotype.Component; @Component public class DataSourceInterceptor { public void setdataSourceOne(JoinPoint jp) { DatabaseContextHolder.setCustomerType("dataSourceOne"); } public void setdataSourceTwo(JoinPoint jp) { DatabaseContextHolder.setCustomerType("dataSourceTwo"); } }
Copy after login

5. po entity class

package com.po; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "BTSF_BRAND", schema = "hotel") public class Brand { private String id; private String names; private String url; @Id @Column(name = "ID", unique = true, nullable = false, length = 10) public String getId() { return this.id; } public void setId(String id) { this.id = id; } @Column(name = "NAMES", nullable = false, length = 50) public String getNames() { return this.names; } public void setNames(String names) { this.names = names; } @Column(name = "URL", length = 200) public String getUrl() { return this.url; } public void setUrl(String url) { this.url = url; } }
Copy after login
package com.po; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "CITY", schema = "car") public class City { private Integer id; private String name; @Id @Column(name = "ID", unique = true, nullable = false) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name = "NAMES", nullable = false, length = 50) public String getName() { return name; } public void setName(String name) { this.name = name; } }
Copy after login

6. BrandDaoImpl.class

package com.dao.one; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository; import com.po.Brand; @Repository public class BrandDaoImpl implements IBrandDao { @Resource protected SessionFactory sessionFactory; @SuppressWarnings("unchecked") @Override public List findAll() { String hql = "from Brand"; Query query = sessionFactory.getCurrentSession().createQuery(hql); return query.list(); } }
Copy after login

7. CityDaoImpl.class

package com.dao.two; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository; import com.po.City; @Repository public class CityDaoImpl implements ICityDao { @Resource private SessionFactory sessionFactory; @SuppressWarnings("unchecked") @Override public List find() { String hql = "from City"; Query query = sessionFactory.getCurrentSession().createQuery(hql); return query.list(); } }
Copy after login

8. DaoTest.class

package com.test; import java.util.List; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import com.dao.one.IBrandDao; import com.dao.two.ICityDao; import com.po.Brand; import com.po.City; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:com/resource/applicationContext.xml") @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) public class DaoTest { @Resource private IBrandDao brandDao; @Resource private ICityDao cityDao; @Test public void testList() { List brands = brandDao.findAll(); System.out.println(brands.size()); List cities = cityDao.find(); System.out.println(cities.size()); } }
Copy after login

Use aop to dynamically change the data source. When we need to add a data source, we only need to add aop configuration in the applicationContext configuration file and create a new DataSourceInterceptor. without changing any code.

The above is the entire content of this article. I hope it will be helpful to everyone's learning. I also hope that everyone will support the PHP Chinese website.

For more in-depth understanding of spring multi-data source configuration related articles, please pay attention to the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!