spring配置多数据源——mybatis

2022-11-23 09:03:51 浏览数 (3)

这篇文章是配置mybatis多数据源文章,如果是hibernate的话也是没什么影响,配置都是差不多的。

在这家公司上班差不多一星期了,不小心点开配置文件一看这项目配置了两个数据源,蒙了。

之后上网查了下,自己写了个demo,恍然大悟

还是那句话,当你理解了才知道是怎么回事,动手写一遍才能体会到。

先说说配置吧。

这是配置单个数据源配置文件

代码语言:javascript复制
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="123"></property>
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <!-- 配置跟Mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

这是配置多个数据源配置文件

代码语言:javascript复制
<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="123"></property>
        <property name="jdbcUrl"
            value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="123"></property>
        <property name="jdbcUrl"
            value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <bean id="multipleDataSource" class="com.bscc.datasource.MultipleDataSource">
        <property name="defaultTargetDataSource" ref="dataSource1" />
        <property name="targetDataSources">
            <map>
                <entry key="dataSource1" value-ref="dataSource1" />
                <entry key="dataSource2" value-ref="dataSource2" />
            </map>
        </property>
    </bean>
    <!-- 配置跟Mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="multipleDataSource"></property>
    </bean>

其实一眼都可以看出来,就是多了个数据源,理解为备用,

代码语言:javascript复制
defaultTargetDataSource表示默认的数据源。
代码语言:javascript复制
targetDataSources是一个map集合,返回类型为DataSource,虽然没看,也没必要看。
代码语言:javascript复制
MultipleDataSource是自己定义的一个类,实现方式请看下面代码
代码语言:javascript复制
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MultipleDataSource extends AbstractRoutingDataSource {
    private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();

    public static void setDataSourceKey(String dataSource) {
        dataSourceKey.set(dataSource);
    }

    @Override
    protected Object determineCurrentLookupKey() {
        String string = dataSourceKey.get();
        return string;
    }

}

 就是这么回事,继承abstract柔婷DataSource类即可,重写determinecurrentlookupkey抽象方法,是需要返回对应的数据源名称,也就是DataSource1,DataSource2罢了。

之所以需要定义一个threadlocal集合,是为了防止并发操作,兴许是瞎说,可以自行百度,只可意会

OK,其他操作时一模一样的,自己可以写一个测试类

代码语言:javascript复制
@RequestMapping("listPerson")
    @ResponseBody
    public List<Person> listPerson() {
        List<Person> list = service.listPerson();
        return list;
    }
    
    @RequestMapping("listPerson2")
    @ResponseBody
    public List<Person> listPerson2() {
        MultipleDataSource.setDataSourceKey("dataSource2");
        List<Person> list = service.listPerson();
        return list;
    }

访问这两个controller,对应不同的数据库。 这么写是给写死了,不过想写成动态的话可以根据自己的业务策略来,也可以通过aop配置。 虽然写的不多,但写的都是操作方式,毕竟不难,照着操作一遍,就什么都懂了。OK

 小白一个,后面路还很长。勿忘初心

0 人点赞