Spring boot2.X项目,使用data jpa 框架,普通方法可以实现数据源的切换,但是新建线程和定时任务里面执行方法,却不能插入和修改数据库,并且控制端无日志输出。可以查询数据。
相同的多数据源配置,使用mybatis框架不存在这样的情况。
/**
* 数据源配置
*/
@Configuration
public class DataSourceConfig {
@Autowired
private DBProperties properties;
@Bean(name = "dataSource")
public DataSource dataSource() {
//按照目标数据源名称和目标数据源对象的映射存放在Map中
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("first", properties.getFirst());
targetDataSources.put("second", properties.getSecond());
targetDataSources.put("third", properties.getThird());
//采用是想AbstractRoutingDataSource的对象包装多数据源
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);
//设置默认的数据源,当拿不到数据源时,使用此配置
dataSource.setDefaultTargetDataSource(properties.getFirst());
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
补充:
@Scheduled(cron = "0 0/1 * * * ?")
public void aioCallMethod() {
System.out.println("timer start");
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (hour == 21) {
calendar.set(Calendar.HOUR_OF_DAY, 9);
} else {
calendar.set(Calendar.HOUR_OF_DAY, 21);
calendar.add(Calendar.DATE, -1);
}
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date date1 = calendar.getTime();
calendar.add(Calendar.HOUR_OF_DAY, 12);
Date date2 = calendar.getTime();
Date date = DateUtil.toDate(new Date(), "yyyy-MM-dd");
List<DiamondWireRecord> diamondWireRecords = new ArrayList<>();
DiamondWireRecord diamondWireRecord;
String deviceNo;
List<EquipmentAccessory> equipmentAccessories = equipmentAccessoryService.findAll();
for (EquipmentAccessory equipmentAccessory : equipmentAccessories) {
//设备编号
deviceNo = equipmentAccessory.getDeviceNo();
diamondWireRecord = new DiamondWireRecord();
//记录时间
diamondWireRecord.setCreateDate(date);
diamondWireRecord.setDeviceNo(deviceNo);
diamondWireRecords.add(diamondWireRecord);
}
System.out.println("update start");
if (diamondWireRecords.size() > 0) {
diamondWireRecordService.saveAll(diamondWireRecords);
}
System.out.println("update end");
}