@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)java
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //组件基包扫描,让spring boot管理其它模块bean类的生命周期 @ComponentScan("com") public class Schedule { public static void main(String[] args) { SpringApplication.run(Schedule.class, args); } }
具体缘由未发现,也未找到解决方式,因此对DB的操做是用的注解的方式。mysql
如下为其中一个数据源配置信息spring
spring.secondary.datasource.driverClassName = com.mysql.jdbc.Driver spring.secondary.datasource.url = jdbc:mysql://10.10.14.56:3306/ppj?characterEncoding=UTF-8&rewriteBatchedStatements=true spring.secondary.datasource.username = ppj. spring.secondary.datasource.password = ppj.
如下为主库配置信息, @primary 为必填注解。sql
在有多个同类型的资源配置时,@primary 标注当前资源为默认配置。数据库
空闲检测等配置,根据具体的业务需求。当前例子配置,是由于天天调用一次,不须要保持链接状态,空闲时将链接断开便可。apache
主库链接池配置以下:session
package com.config; import com.alibaba.druid.pool.DruidDataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * 配置主数据库源 * 有多候选者状况下,primary必写,否则会出现冲突; * 采用primary消解的对象,默认采用 * * @author pengpj * @date 2018/7/23 */ @Configuration @MapperScan(basePackages = "com.mapper.alarm", sqlSessionTemplateRef = "primarySST") public class PrimaryDataSourceConfig { @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String userName; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClass; @Primary @Bean(name = "primaryDS") public DataSource primaryDataSource() { DruidDataSource dataSource = new DruidDataSource(); //基本链接信息 dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(password); dataSource.setDriverClassName(driverClass); //具体配置 dataSource.setInitialSize(1); dataSource.setMinIdle(0); dataSource.setMaxActive(1); //空闲检测 dataSource.setTestWhileIdle(true); //调用链接时检测是否可用 dataSource.setTestOnBorrow(true); dataSource.setValidationQuery("select 1"); //获取链接的等待超时时间 dataSource.setMaxWait(1000 * 20L); //检测须要关闭的空闲链接 dataSource.setTimeBetweenEvictionRunsMillis(1000 * 30L); //链接池的最小生存时间 dataSource.setMinEvictableIdleTimeMillis(1000 * 30L); return dataSource; } @Primary @Bean(name = "primarySSF") public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Primary @Bean(name = "primaryTM") public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDS") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Primary @Bean(name = "primarySST") public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySSF") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
另外一数据库配置链接池配置如上,删去 @primary 注解,并更改 Bean 中 name 值,name 不重复便可。mybatis
注意以下几点:app
以主库mapper为例:测试
package com.mapper.alarm; import com.cvte.alarm.platform.user.copy.entity.AlarmUser; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; /** * 用户操做 * * @author pengpj * @date 2018/5/4 */ @Mapper @Repository public interface AlarmUserMapper { /** * 插入数据 * * @param entity user * @return change row number */ @Insert("INSERT INTO" + " alarm_user(user_name,user_login_name,email,pwd,user_type,auth_type,create_time,update_time,uid) " + " VALUES(#{userName},#{userLoginName},#{email},#{pwd},#{userType},#{authType},#{createTime},#{updateTime},#{uid})") Integer insert(AlarmUser entity); /** * 经过 userLoginName 查询用户信息 * * @param userLoginName userLoginName * @return user */ @Select("SELECT * FROM alarm_user WHERE user_login_name = #{userLoginName}") @Results( { @Result(property = "uid",column = "uid"), @Result(property = "userLoginName",column = "user_login_name") } ) AlarmUser findUserByUserLoginName(@Param("userLoginName") String userLoginName); }
Spring注入后,便可用接口进行数据库操做。
用例调用代码以下:
··· 省略 public void execute() { List<ApmUser> apmUsers = apmUserMapper.obtainApmUserAfterTimestamp(timestamp); } private AlarmUserMapper alarmUserMapper; @Autowired public UserUpdateSchedule(AlarmUserMapper alarmUserMapper) { this.alarmUserMapper = alarmUserMapper; }