Mybatis中如何配置多数据源一什么情况下会用到多数据库? 场景1: 一个商城网站,一个游戏网站,商城网站已经做好,游戏网站正在开发,游戏网站上的很多道具需要用到商城网站的产品数据,这种情况最好是用两个数据库,商城网站更多的是设计直接交易,涉及金钱方面较多,需要较安全的数据库和网络环境,而游戏网站一般人流量比较大,若和商城放一起占用的数据库、网络、带宽资源较大,而且更容易被攻击,这样很容易影响商城的正常使用。而把他们独立开虽然可能成本稍高,但是能够保证其中一个网站或数据库挂掉不会影响另一个,大大降低安全风险。 场景2: 随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘、IO、系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进行拆分,从而更好的提供数据服务。 MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w1000w之间性能比较好,超过1000w性能也会下降。mysql的分库分表是在数据量大后的一个常用数据库优化方法。二多数据库需求解决方案 对于海量数据来说,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,首选分布式数据库中间件MyCat去解决分库分表的问题。 但对于一些简单的需求,比如数据库量不大,只是用到不同的数据库,可以配置多数据源来解决。配置多数据源有两种方法:分包和AOP。 本章给大家讲解的是分包方式,Aop方式和MyCat会在后续章节再讲解。三Mybatis中配置多数据源1。新建工程 添加Mybatis,Mysql驱动,lombok依赖2。配置多数据源 之前整合Mybatis时,我们配置了一个数据源DataSource,配置多个数据源,其实就是配置多个DataSource。 首页准备两个数据库boot1,boot22。1application。properties中添加数据源数据源1spring。datasource。one。driverclassnamecom。mysql。jdbc。Driverspring。datasource。one。usernamerootspring。datasource。one。passwordrootspring。datasource。one。jdbcurljdbc:mysql:localhost:3306boot1?characterEncodingutf8serverTimezoneGMT2B8需要注意的是,springboot2。0以上配置双数据源,配置文件中不能写url,而是要改成jdbcurl,否则会出错。数据源2spring。datasource。two。driverclassnamecom。mysql。jdbc。Driverspring。datasource。two。usernamerootspring。datasource。two。passwordrootspring。datasource。two。jdbcurljdbc:mysql:localhost:3306boot2?characterEncodingutf8serverTimezoneGMT2B8这里通过one和two对数据源进行了区分,但是加了one和two之后,这里的配置就没法被SpringBoot自动加载了(因为前面的key变了),需要我们自己去加载DataSource了,此时,需要自己配置一个DataSourceConfig,用来提供两个DataSourceBean,如下:2。2创建DataSourceConfig文件ConfigurationpublicclassDataSourceConfig{BeanConfigurationProperties(prefixspring。datasource。one)DataSourcedsOne(){returnDataSourceBuilder。create()。build();}BeanConfigurationProperties(prefixspring。datasource。two)DataSourcedsTwo(){returnDataSourceBuilder。create()。build();}}这里提供了两个Bean,其中ConfigurationProperties是SpringBoot提供的类型安全的属性绑定,以第一个Bean为例,ConfigurationProperties(prefixspring。datasource。one)表示使用spring。datasource。one前缀的数据库配置去创建一个DataSource,这样配置之后,我们就有了两个不同的DataSource,接下来再用这两个不同的DataSource去创建两个不同的SqlSessionFactory。2。3创建两个Mybatis配置文件类 Mybatis配置文件类1:ConfigurationMapperScan(basePackagescom。test。multidatasource。mapper1,sqlSessionTemplateRefsqlSessionTemplate1)publicclassMyBatisConfigOne{Resource(namedsOne)DataSourcedsOne;BeanSqlSessionFactorysqlSessionFactory1(){SqlSessionFactorysessionFactorynull;try{SqlSessionFactoryBeanbeannewSqlSessionFactoryBean();bean。setDataSource(dsOne);bean。setTypeAliasesPackage(com。test。multidatasource。pojo);sessionFactorybean。getObject();}catch(Exceptione){e。printStackTrace();}returnsessionFactory;}BeanSqlSessionTemplatesqlSessionTemplate1(){returnnewSqlSessionTemplate(sqlSessionFactory1());}}创建MyBatisConfigOne类,首先指明该类是一个配置类,配置类中要扫描的包是com。test。ssm。mapper1,即该包下的Mapper接口将操作dsOne中的数据,对应的SqlSessionFactory和SqlSessionTemplate分别是sqlSessionFactory1和sqlSessionTemplate1,在MyBatisConfigOne内部,分别提供SqlSessionFactory和SqlSessionTemplate即可,SqlSessionFactory根据dsOne创建,然后再根据创建好的SqlSessionFactory创建一个SqlSessionTemplate。 Mybatis配置文件类2:ConfigurationMapperScan(basePackagescom。test。multidatasource。mapper2,sqlSessionTemplateRefsqlSessionTemplate2)publicclassMyBatisConfigTwo{Resource(namedsTwo)DataSourcedsTwo;BeanSqlSessionFactorysqlSessionFactory2(){SqlSessionFactorysessionFactorynull;try{SqlSessionFactoryBeanbeannewSqlSessionFactoryBean();bean。setDataSource(dsTwo);bean。setTypeAliasesPackage(com。test。multidatasource。pojo);sessionFactorybean。getObject();}catch(Exceptione){e。printStackTrace();}returnsessionFactory;}BeanSqlSessionTemplatesqlSessionTemplate2(){returnnewSqlSessionTemplate(sqlSessionFactory2());}}这样MyBatis多数据源基本上就配置好了,接下来只需要在com。test。multidatasource。mapper1和com。test。multidatasource。mapper2包中提供不同的Mapper,Service中注入不同的Mapper就可以操作不同的数据源。 3。创建Mapper层 com。test。multidatasource。mapper1包下创建publicinterfaceUserMapperOne{ListUserselectUsers();} 对应的Mapper。xml文件!DOCTYPEmapperPUBLICmybatis。orgDTDMapper3。0ENhttp:mybatis。orgdtdmybatis3mapper。dtdmappernamespaceorg。javaboy。mybatis。mapper1。UserMapperOneselectidselectUsersresultTypecom。test。multidatasource。pojo。Usersselectfromusers;selectmapper com。test。multidatasource。mapper2包下创建publicinterfaceUserMapperTwo{ListUserselectGoods();} 对应的Mapper。xml文件:!DOCTYPEmapperPUBLICmybatis。orgDTDMapper3。0ENhttp:mybatis。orgdtdmybatis3mapper。dtdmappernamespaceorg。javaboy。mybatis。mapper2。UserMapperTwoselectidselectGoodsresultTypecom。test。multidatasource。pojo。Goodsselectfromgoods;selectmapper2。4pom。xml文件中添加resourcesresourcedirectorysrcmainjavadirectoryincludesinclude。xmlincludeincludesresourceresourcedirectorysrcmainresourcesdirectoryresourceresources3。创建pojo,service层,controller层测试