• spring配置多数据源——mybatis


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

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

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

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

    先说说配置吧。

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

    <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>

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

    <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>

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

    defaultTargetDataSource表示默认的数据源。
    targetDataSources是一个map集合,返回类型为DataSource,虽然没看,也没必要看。
    MultipleDataSource是自己定义的一个类,实现方式请看下面代码
    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,其他操作时一模一样的,自己可以写一个测试类

    @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

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

     

     

  • 相关阅读:
    java的类加载机制
    tomcat jar包加载顺序
    重构 改善代码的既有设计
    ecilipse Javadoc文档注释
    常用HQL(Hibernate Query Language)查询
    在hibernate中查询单个对象的方法,get()、load()、
    hibernate -- HQL语句总结
    复杂的1秒--图解Google搜索技术
    作业-树状结构设计
    left join 和 left outer join 的区别
  • 原文地址:https://www.cnblogs.com/chywx/p/9278110.html
Copyright © 2020-2023  润新知