springboot 配置多数据源

1.首先在创建应用对象时引入autoConfig

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

2.其次配置文件

######primary#############
datasource.primary.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=PlayNowLog
datasource.primary.username=sa
datasource.primary.password=xxxxxx
datasource.primary.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver ######secondary#############
datasource.secondary.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=PlayNow_New
datasource.secondary.username=sa
datasource.secondary.password=xxxxxx
datasource.secondary.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

3.再其次是数据源的创建

@Configuration
public class GlobalDataConfiguration {
@Bean(name="primaryDataSource")
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
System.out.println("-------------------- primaryDataSource init ---------------------");
return DataSourceBuilder.create().build();
} @Bean(name="secondaryDataSource")
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
System.out.println("-------------------- secondaryDataSource init ---------------------");
return DataSourceBuilder.create().build();
}
}

4.Dao层使用数据源

@Component
public class UserDaoImpl<T extends com.sonychina.backend.entity.statistic.SysUser> extends MyBatisBaseDao<SysUser> implements UserDao { @Autowired
public UserDaoImpl(@Qualifier("secondaryDataSource") DataSource dataSource) {
super(dataSource);
}
}
import java.util.List;
import java.util.Map; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSession; import com.sonychina.backend.global.Constants;
import com.sonychina.backend.utility.GenericsUtils;
import com.sonychina.backend.utility.MapResultHandler;
import com.sonychina.backend.utility.MyBatisUtil;
import com.sonychina.backend.utility.PageView; public class MyBatisBaseDao<T>{
private Class<T> type;
private SqlSession session; @SuppressWarnings("unchecked")
public MyBatisBaseDao(DataSource dataSource){
type = (Class<T>) GenericsUtils.getActualReflectArgumentClass(this.getClass());
System.out.println("------------- BaseMybatisDao initialize--------------------------");
System.out.println("------------- T:" + type.toString());
try {
MyBatisUtil myBatisUtil = MyBatisUtil.getInstance(dataSource);
session = myBatisUtil.getSession();
} catch (Exception e) {
e.printStackTrace();
}
} private String getMethodPath(String methodType){
return getMethodPath(methodType, "");
} private String getMethodPath(String methodType, String methodSuffix){
return Constants.MYBATIS_MAPPER_PRIX + methodType + type.getSimpleName() + methodSuffix;
} public void save(T obj) {
session.insert(getMethodPath("save"), obj);
} public void delete(T obj) {
session.delete(getMethodPath("delete"), obj);
} public void update(T obj) {
session.update(getMethodPath("update"), obj);
//HashMap<String,Object> map = null;
} public T get(Integer id) {
return session.selectOne(getMethodPath("get"),id);
} public List<T> getList(T entity){
return session.selectList(getMethodPath("get", "List"), entity);
} public List<T> getListByAnyObject(Object entity){
return session.selectList(getMethodPath("get", "List"), entity);
} /**
*
* @param entity
* @param selectId:mapper。xml文件中<select>标签ID
* @return
*/
public List<T> getList(T entity, String selectId){
return session.selectList(selectId, entity);
} public List<T> getListByAnyObject(Object entity, String selectId){
return session.selectList(selectId, entity);
} public List<Map<String, Object>> getMapList(Map<String, Object> map){
MapResultHandler mh = new MapResultHandler();
session.select(getMethodPath("get", "MapList"), map, mh);
return mh.getMappedResults();
} /**
*
* @param map
* @param selectId:mapper。xml文件中<select>标签ID
* @return List<Map<String, Object>>
*/
public List<Map<String, Object>> getMapList(Map<String, Object> map, String selectId){
MapResultHandler mh = new MapResultHandler();
session.select(selectId, map, mh);
return mh.getMappedResults();
} public List<Map<String, Object>> getMapList(T entity){
MapResultHandler mh = new MapResultHandler();
session.select(getMethodPath("get", "MapList"), entity, mh);
return mh.getMappedResults();
} public List<Map<String, Object>> getMapList(T entity,String queryName){
MapResultHandler mh = new MapResultHandler();
session.select(queryName, entity, mh);
return mh.getMappedResults();
} public Long getCount(Map<String, Object> pm){
MapResultHandler mh = new MapResultHandler();
session.select(getMethodPath("get", "Count"),pm, mh);
return mh.getCount();
} /**
*
* @param pm
* @param selectId:mapper。xml文件中<select>标签ID
* @return Long
*/
public Long getCount(Map<String,Object> pm, String selectId){
MapResultHandler mh = new MapResultHandler();
session.select(selectId,pm, mh);
return mh.getCount();
} /**
* map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
* 且其值不能为空
* @param map
* @return PageView
*/
public PageView getPageList(Map<String, Object> map){ if(map == null || map.get("currentPageNum") == null){
return null;
} else{
PageView page = null;
Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
if(map.get("pageShowCnt") == null){
page = new PageView(pageNum);
} else {
Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
page = new PageView(pageNum, showCnt);
}
map.put("start", page.getStart());
map.put("end", page.getCurrentMaxCnt());
//System.out.println("-----------start:" + map.get("start"));
//System.out.println("-----------start:" + map.get("maxCnt"));
MapResultHandler mh = new MapResultHandler();
page.setTotalRecord(this.getCount(map));
session.select(getMethodPath("get", "MapPageList"), map, mh);
page.setResultList(mh.getMappedResults()); return page;
}
} /**
* map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
* 且其值不能为空
* @param map
* @param selectConutId, mapper.xml文件中<select>标签Id, 查询总记录数的sql语句
* @param selectPageListId, mapper.xml文件中<select>标签Id,查询分页后数据列表的sql语句
* @return
*/
public PageView getPageList(Map<String, Object> map, String selectConutId, String selectPageListId){ if(map == null || map.get("currentPageNum") == null){
return null;
} else{
PageView page = null;
Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
if(map.get("pageShowCnt") == null){
page = new PageView(pageNum);
} else {
Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
page = new PageView(pageNum, showCnt);
}
map.put("start", page.getStart());
map.put("end", page.getCurrentMaxCnt());
//System.out.println("-----------start:" + map.get("start"));
//System.out.println("-----------start:" + map.get("maxCnt"));
MapResultHandler mh = new MapResultHandler();
page.setTotalRecord(this.getCount(map, selectConutId));
session.select(selectPageListId, map, mh);
page.setResultList(mh.getMappedResults()); return page;
}
} /**
* map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
* 且其值不能为空
* @param map
* @param selectConutId, mapper.xml文件中<select>标签Id, 查询总记录数的sql语句
* @param selectPageListId, mapper.xml文件中<select>标签Id,查询分页后数据列表的sql语句
* @return
*/
public PageView getEntityPageList(Map<String, Object> map, String selectConutId, String selectPageListId){ if(map == null || map.get("currentPageNum") == null){
return null;
} else{
PageView page = null;
Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
if(map.get("pageShowCnt") == null){
page = new PageView(pageNum);
} else {
Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
page = new PageView(pageNum, showCnt);
}
map.put("start", page.getStart());
map.put("end", page.getCurrentMaxCnt());
//System.out.println("-----------start:" + map.get("start"));
//System.out.println("-----------start:" + map.get("maxCnt"));
page.setTotalRecord(this.getCount(map, selectConutId));
page.setResultList(session.selectList(selectPageListId, map)); return page;
}
} /**
* map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
* 且其值不能为空
* @param map
* @return PageView
*/
public PageView getEntityPageList(Map<String, Object> map){ if(map == null || map.get("currentPageNum") == null){
return null;
} else{
PageView page = null;
Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
if(map.get("pageShowCnt") == null){
page = new PageView(pageNum);
} else {
Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
page = new PageView(pageNum, showCnt);
}
map.put("start", page.getStart());
map.put("end", page.getCurrentMaxCnt());
//System.out.println("-----------start:" + map.get("start"));
//System.out.println("-----------start:" + map.get("maxCnt"));
page.setTotalRecord(this.getCount(map));
page.setResultList(session.selectList(getMethodPath("get", "PageList"), map)); return page;
}
}
}

http://blog.csdn.net/ba5189tsl/article/details/47277737

SpringBoot使用阿里数据库连接池Druid以及多数据源配置

引入依赖

<!-- https:dataSource
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>

数据源配置

  • 1.数据源

    #master数据源
    spring.datasource.master.url=jdbc:mysql://localhost:3306/SpringBootMaster
    spring.datasource.master.username=root
    spring.datasource.master.password=1
    spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.master.masterMapperLocations=classpath:mapper/master/*.xml #cluster数据源
    spring.datasource.cluster.url=jdbc:mysql://localhost:3306/SpringBootCluster
    spring.datasource.cluster.username=root
    spring.datasource.cluster.password=1
    spring.datasource.cluster.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.cluster.clusterMapperLocations=classpath:mapper/cluster/*.xml #cluster1数据源
    spring.datasource.cluster1.url=jdbc:mysql://localhost:3306/SpringBootCluster1
    spring.datasource.cluster1.username=root
    spring.datasource.cluster1.password=1
    spring.datasource.cluster1.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.cluster1.clusterMapperLocations=classpath:mapper/cluster1/*.xml

    master数据源:

    @Configuration
    @MapperScan(basePackages = {"com.lc.springBoot.druid.mapper.master"},
    sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class MasterDruidDataSourceConfig { @Value("${spring.datasource.master.masterMapperLocations}")
    private String masterMapperLocations; @ConfigurationProperties(prefix = "spring.datasource.master")
    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
    return new DruidDataSource();
    } /**
    * SqlSessionFactory配置
    *
    * @return
    * @throws Exception
    */
    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(
    @Qualifier("masterDataSource") DataSource dataSource
    ) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    // 配置mapper文件位置
    sqlSessionFactoryBean.setMapperLocations(resolver.getResources(masterMapperLocations)); //配置分页插件
    PageHelper pageHelper = new PageHelper();
    Properties properties = new Properties();
    properties.setProperty("reasonable", "true");
    properties.setProperty("supportMethodsArguments", "true");
    properties.setProperty("returnPageInfo", "check");
    properties.setProperty("params", "count=countSql");
    pageHelper.setProperties(properties); //设置插件
    sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});
    return sqlSessionFactoryBean.getObject();
    } /**
    * 配置事物管理器
    *
    * @return
    */
    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager(
    @Qualifier("masterDataSource") DataSource dataSource
    ) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
    }
    }

    cluster数据源:

  • @Configuration
    @MapperScan(basePackages = {"com.lc.springBoot.druid.mapper.cluster"},
    sqlSessionFactoryRef = "clusterSqlSessionFactory")
    public class ClusterDruidDataSourceConfig { @Value("${spring.datasource.cluster.clusterMapperLocations}")
    private String clusterMapperLocations; @ConfigurationProperties(prefix = "spring.datasource.cluster")
    @Bean(name = "clusterDataSource")
    public DataSource clusterDataSource() {
    return new DruidDataSource();
    } /**
    * SqlSessionFactory配置
    *
    * @return
    * @throws Exception
    */
    @Bean(name = "clusterSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(
    @Qualifier("clusterDataSource") DataSource dataSource
    ) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    //配置mapper文件位置
    sqlSessionFactoryBean.setMapperLocations(resolver.getResources(clusterMapperLocations)); //配置分页插件
    PageHelper pageHelper = new PageHelper();
    Properties properties = new Properties();
    properties.setProperty("reasonable", "true");
    properties.setProperty("supportMethodsArguments", "true");
    properties.setProperty("returnPageInfo", "check");
    properties.setProperty("params", "count=countSql");
    pageHelper.setProperties(properties); //设置插件
    sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});
    return sqlSessionFactoryBean.getObject();
    } /**
    * 配置事物管理器
    *
    * @return
    */
    @Bean(name = "clusterTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager(
    @Qualifier("clusterDataSource") DataSource dataSource
    ) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
    }
    }
  • cluster1数据源:

    @Configuration
    @MapperScan(basePackages = {"com.lc.springBoot.druid.mapper.cluster1"},
    sqlSessionFactoryRef = "cluster1SqlSessionFactory")
    public class Cluster1DruidDataSourceConfig { @Value("${spring.datasource.cluster1.clusterMapperLocations}")
    private String cluster1MapperLocations; @ConfigurationProperties(prefix = "spring.datasource.cluster1")
    @Bean(name = "cluster1DataSource")
    public DataSource cluster1DataSource() {
    return new DruidDataSource();
    } /**
    * SqlSessionFactory配置
    *
    * @return
    * @throws Exception
    */
    @Bean(name = "cluster1SqlSessionFactory")
    public SqlSessionFactory cluster1SqlSessionFactory(
    @Qualifier("cluster1DataSource") DataSource dataSource
    ) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    //配置mapper文件位置
    sqlSessionFactoryBean.setMapperLocations(resolver.getResources(cluster1MapperLocations)); //配置分页插件
    PageHelper pageHelper = new PageHelper();
    Properties properties = new Properties();
    properties.setProperty("reasonable", "true");
    properties.setProperty("supportMethodsArguments", "true");
    properties.setProperty("returnPageInfo", "check");
    properties.setProperty("params", "count=countSql");
    pageHelper.setProperties(properties); //设置插件
    sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});
    return sqlSessionFactoryBean.getObject();
    } /**
    * 配置事物管理器
    *
    * @return
    */
    @Bean(name = "cluster1TransactionManager")
    public DataSourceTransactionManager cluster1TransactionManager(
    @Qualifier("cluster1DataSource") DataSource dataSource
    ) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
    }
    }
  • 2.相关注解说明

    @MapperScan:basePackages属性配置需要扫描的mybatis的mapper文件位置,sqlSessionFactory属性配置具体的 sqlSessionFactory.

    @ConfigurationProperties:读取并且设置我们在application.properties配置的内容.

    @Primary:这个注解用来标识当存在多个相同的类型的bean时,优先选用哪个bean注入,需要注意的是,配置多数据源的时候,必须有一个 且只能有一个@Primary注解.

读写分离实现

read数据源配置

```
@Configuration
@MapperScan(basePackages = {"com.lc.springBoot.druid.mapper.read1"},
sqlSessionFactoryRef = "read1SqlSessionFactory")
public class Read1DruidDataSourceConfig { @Value("${spring.datasource.read1.read1MapperLocations}")
private String read1MapperLocations; @ConfigurationProperties(prefix = "spring.datasource.read1")
@Bean(name = "read1DataSource")
public DataSource read1DataSource() {
return new DruidDataSource();
} /**
* SqlSessionFactory配置
*
* @return
* @throws Exception
*/
@Bean(name = "read1SqlSessionFactory")
public SqlSessionFactory read1SqlSessionFactory(
@Qualifier("read1DataSource") DataSource dataSource
) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 配置mapper文件位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(read1MapperLocations)); //配置分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("returnPageInfo", "check");
properties.setProperty("params", "count=countSql");
pageHelper.setProperties(properties); //设置插件
sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});
return sqlSessionFactoryBean.getObject();
} /**
* 配置事物管理器
*
* @return
*/
@Bean(name = "read1TransactionManager")
public DataSourceTransactionManager read1TransactionManager(
@Qualifier("read1DataSource") DataSource dataSource
) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
} ```

write数据源配置

```
@Configuration
@MapperScan(basePackages = {"com.lc.springBoot.druid.mapper.write"},
sqlSessionFactoryRef = "writeSqlSessionFactory")
public class WriteDruidDataSourceConfig { @Value("${spring.datasource.write.writeMapperLocations}")
private String writeMapperLocations; @ConfigurationProperties(prefix = "spring.datasource.write")
@Bean(name = "writeDataSource")
public DataSource writeDataSource() {
return new DruidDataSource();
} /**
* SqlSessionFactory配置
*
* @return
* @throws Exception
*/
@Bean(name = "writeSqlSessionFactory")
public SqlSessionFactory writeSqlSessionFactory(
@Qualifier("writeDataSource") DataSource dataSource
) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 配置mapper文件位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(writeMapperLocations));
return sqlSessionFactoryBean.getObject();
} /**
* 配置事物管理器
*
* @return
*/
@Bean(name = "writeTransactionManager")
public DataSourceTransactionManager writeTransactionManager(
@Qualifier("writeDataSource") DataSource dataSource
) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
```

自定义注入AbstractRoutingDataSource

```
@Configuration
public class DataSourceConfig { private final static String WRITE_DATASOURCE_KEY = "writeDataSource";
private final static String READ1_DATASOURCE_KEY = "read1DataSource";
private final static String READ2_DATASOURCE_KEY = "read2DataSource"; @Bean
public AbstractRoutingDataSource routingDataSource(
@Qualifier("writeDataSource") DataSource writeDataSource,
@Qualifier("read1DataSource") DataSource read1DataSource,
@Qualifier("read2DataSource") DataSource read2DataSource
) {
DynamicDataSource dataSource = new DynamicDataSource();
Map<Object, Object> targetDataSources = new HashMap();
targetDataSources.put(WRITE_DATASOURCE_KEY, writeDataSource);
targetDataSources.put(READ1_DATASOURCE_KEY, read1DataSource);
targetDataSources.put(READ2_DATASOURCE_KEY, read2DataSource);
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(writeDataSource);
return dataSource;
}
}
```

自定义注解

```
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TargetDataSource {
String dataSource() default "";//数据源
} ```

使用ThreadLocal使数据源与线程绑定

```
public class DynamicDataSourceHolder {
//使用ThreadLocal把数据源与当前线程绑定
private static final ThreadLocal<String> dataSources = new ThreadLocal<String>(); public static void setDataSource(String dataSourceName) {
dataSources.set(dataSourceName);
} public static String getDataSource() {
return (String) dataSources.get();
} public static void clearDataSource() {
dataSources.remove();
}
}
```
```
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() { //可以做一个简单的负载均衡策略
String lookupKey = DynamicDataSourceHolder.getDataSource();
System.out.println("------------lookupKey---------"+lookupKey); return lookupKey;
}
} ```

定义切面

```
@Aspect
@Component
public class DynamicDataSourceAspect {
@Around("execution(public * com.lc.springBoot.druid.service..*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method targetMethod = methodSignature.getMethod();
if (targetMethod.isAnnotationPresent(TargetDataSource.class)) {
String targetDataSource = targetMethod.getAnnotation(TargetDataSource.class).dataSource();
System.out.println("----------数据源是:" + targetDataSource + "------");
DynamicDataSourceHolder.setDataSource(targetDataSource);
}
Object result = pjp.proceed();//执行方法
DynamicDataSourceHolder.clearDataSource(); return result;
}
} ```

注解使用

```
@Service
public class StudentService { @Autowired
private StudentMapper studentMapper; @Transactional
@TargetDataSource(dataSource = "writeDataSource")
public boolean createUser(Student student) {
studentMapper.insert(student); //事务测试
// int i = 1 / 0;
return true;
} @TargetDataSource(dataSource = "read1DataSource")
public List<Student> getByPage(int page, int rows) {
Page<Student> studentPage = PageHelper.startPage(page, rows, true);
List<Student> students = studentMapper.getBypage();
System.out.println("-------------------" + studentPage.toString() + "-----------");
return students;
}
} ```

druid监控功能配置

配置过滤器

```
/**
* 配置过滤器,需要拦截哪些url,忽略哪些url,初始化参数等
*
* @author lsj <lishuijun1992@gmail.com>
* @date 17-4-7
*/
@WebFilter(filterName = "druidStatFilter",//过滤器名称
urlPatterns = "/",//需要拦截的url
initParams = {//filter初始化信息
//需要忽略的资源
@WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg," +
"*.bmp,*.png,*.css,*.ico,/druid/*"),
@WebInitParam(name = "sessionStatEnable", value = "true"),
@WebInitParam(name = "profileEnable", value = "true")})
public class DruidStatFilter extends WebStatFilter {
} ```

配置servlet

//表明这是一个servlet
@WebServlet(urlPatterns = "/druid/*",//通过哪个url访问
initParams = {
@WebInitParam(name = "loginUsername", value = "lengchuan"),//用户名
@WebInitParam(name = "loginPassword", value = "123456"), //密码
@WebInitParam(name = "resetEnable", value = "true"),//是否可以重置
// @WebInitParam(name = "allow",value = "127.0.0.1"),//白名单
// @WebInitParam(name = "deny",value = "192.168.1.1")//黑名单
})
public class DruidStatViewServlet extends StatViewServlet {
}

配置Spring监控

@Configuration
public class MyDruidStatInterceptor { private static final String[] patterns = new String[]{"com.lc.springBoot.druid.service.*"}; @Bean
public DruidStatInterceptor druidStatInterceptor() {
return new DruidStatInterceptor();
} /**
* 切入点
* @return
*/
@Bean
public JdkRegexpMethodPointcut druidStatPointcut() {
JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();
druidStatPointcut.setPatterns(patterns);
return druidStatPointcut;
} /**
* 配置aop
* @return
*/
@Bean
public Advisor druidStatAdvisor() {
return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());
}
}

访问监控页面

配置完成后启动项目,访问loccalhost:8080/druid/就可以看到我们的监控页面了,用户名配置的是lengchuan,密码是123456这里需要注意的是,我们只有在
执行了一次数据库操作后,才能获取到我们的数据源信息.

https://github.com/Lengchuan/SpringBoot-Study/tree/master/SpringBoot-Druid

https://github.com/helloworldtang/springboot-multi-datasource

上一篇:Spring-boot 配置Aop获取controller里的request中的参数以及其返回值


下一篇:JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)