docker run -p 3309:3306 --name mysql3 -di \ -v /home/javaxl/data/mysql3/mysql.conf.d/:/etc/mysql/mysql.conf.d/ \ -v /home/javaxl/data/mysql3/data/:/var/lib/mysql \ -v /home/javaxl/data/mysql3/log/:/var/log -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker cp /home/javaxl/data/mysql3/mysql.conf.d/mysqld.cnf mysql2:/etc/mysql/mysql.conf.d/
lower_case_table_names=1
package com.javaxl.ssm.datasource; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * @author 小李飞刀 * @site www.javaxl.com */ public class DynamicDataSource extends AbstractRoutingDataSource { public static final String DATA_SOURCE = "dataSource"; public static final String DATA_SOURCE_ADMIN = "dataSourceAdmin"; private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDataSource(String dbName) { contextHolder.set(DATA_SOURCE + dbName); } public static void setDataSourceAdmin() { contextHolder.set(DATA_SOURCE_ADMIN); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } @Override protected Object determineCurrentLookupKey() { return getCustomerType(); } }
<bean id="dataSourceAdmin" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--初始连接数--> <property name="initialSize" value="10"/> <!--最大活动连接数--> <property name="maxTotal" value="100"/> <!--最大空闲连接数--> <property name="maxIdle" value="50"/> <!--最小空闲连接数--> <property name="minIdle" value="10"/> <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。--> <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常--> <property name="maxWaitMillis" value="-1"/> </bean> <bean id="dataSource_3308" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="jdbc:mysql://47.100.191.44:3308/work?useUnicode=true&characterEncoding=UTF-8&useSSL=false"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="dataSource_3309" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="jdbc:mysql://47.100.191.44:3309/work?useUnicode=true&characterEncoding=UTF-8&useSSL=false"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="dataSource" class="com.javaxl.ssm.datasource.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String" > <entry key="dataSourceAdmin" value-ref="dataSourceAdmin"/> <entry key="dataSource_3308" value-ref="dataSource_3308"/> <entry key="dataSource_3309" value-ref="dataSource_3309"/> </map> </property> <property name="defaultTargetDataSource" ref="dataSourceAdmin"/> </bean>
xml文件
select <include refid="Base_Column_List" /> from t_dynamicdatasource where id = #{id,jdbcType=INTEGER}
service
package com.javaxl.ssm.service.impl; import com.javaxl.ssm.datasource.DynamicDataSource; import com.javaxl.ssm.entity.DynamicDatasourceEntity; import com.javaxl.ssm.mapper.DynamicDatasourceEntityMapper; import com.javaxl.ssm.service.DynamicDatasourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * @author 小李飞刀 * @site www.javaxl.com */ @Service public class DynamicDatasourceServiceImpl implements DynamicDatasourceService { @Autowired private DynamicDatasourceEntityMapper dynamicDatasourceEntityMapper; @Override public DynamicDatasourceEntity selectByPrimaryKey(Integer id) { return dynamicDatasourceEntityMapper.selectByPrimaryKey(id); } @Transactional(propagation = Propagation.NOT_SUPPORTED) public DynamicDatasourceEntity getDataBy3309(Integer id) { DynamicDatasourceEntity dynamicDatasourceEntity = null; try { DynamicDataSource.setDataSource("_3309"); dynamicDatasourceEntity = dynamicDatasourceEntityMapper.selectByPrimaryKey(id); }finally { DynamicDataSource.clearCustomerType(); DynamicDataSource.setDataSourceAdmin(); } return dynamicDatasourceEntity; } }
controller
package com.javaxl.ssm.controller; import com.javaxl.ssm.datasource.DynamicDataSource; import com.javaxl.ssm.entity.DynamicDatasourceEntity; import com.javaxl.ssm.service.DynamicDatasourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author 小李飞刀 * @site www.javaxl.com */ @RestController @RequestMapping("/dynamicDatasource") public class DynamicDatasourceController { @Autowired private DynamicDatasourceService dynamicDatasourceService; /** * 从主数据源获取数据 * @param id * @return */ @GetMapping("/getDataByAdmin/{id}") public DynamicDatasourceEntity getDataByAdmin(@PathVariable(value = "id") Integer id ){ return dynamicDatasourceService.selectByPrimaryKey(id); } /** * 从从数据源jdbc:mysql://47.100.191.44:3308/work获取数据 * @param id * @return */ @GetMapping("/getDataBy3308/{id}") public DynamicDatasourceEntity getDataBy3308(@PathVariable(value = "id") Integer id ){ DynamicDatasourceEntity dynamicDatasourceEntity = null; try { DynamicDataSource.setDataSource("_3308"); dynamicDatasourceEntity = dynamicDatasourceService.selectByPrimaryKey(id); }finally { DynamicDataSource.setDataSourceAdmin(); } return dynamicDatasourceEntity; } /** * 从从数据源jdbc:mysql://47.100.191.44:3309/work获取数据 * @param id * @return */ @GetMapping("/getDataBy3309/{id}") public DynamicDatasourceEntity getDataBy3309(@PathVariable(value = "id") Integer id ){ return dynamicDatasourceService.getDataBy3309(id); } }
注意:三个数据源都有t_DynamicDataSource这张表
第五步:测试
附录:
docker 容器 mysql5.7 忘记root密码 重置密码
# 进入容器 docker exec -it mysql bash # 设置跳过权限表的加载 # 警告:这就意味着任何用户都能登录进来,并进行任何操作,相当不安全。 echo "skip-grant-tables" >> /etc/mysql/conf.d/docker.cnf # 退出容器 exit # 重启容器 docker restart mysql # 再次进入容器 docker exec -it mysql bash # 登录 mysql(无需密码) mysql -uroot # 更新权限 flush privileges; # 修改密码 alter user 'root'@'localhost' identified by '123456'; # 退出mysql exit # 替换掉刚才加的跳过权限表的加载参数 sed -i "s/skip-grant-tables/ /" /etc/mysql/conf.d/docker.cnf # 退出容器 exit # 重启容器 docker restart mysql
设置完可以用新设置的密码“123456”进行登录
如果登录出错,可以再进入mysql容器刷新权限
flush privileges;
docker启动mysql8容器设置不区分大小写
docker run --name mysq.db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d -v /home/mysql/:/var/lib/mysql mysql --lower_case_table_names=1
注:lower_case_table_names=1 只能在初始化时配置
over ......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有