


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晓码阁 版权所有