陆广阔 2020-02-22 15:39 采纳率: 0%
浏览 604
已结题

spring data jpa 使用注解(AbstractRoutingDataSource)实现多数据源,定时任务和新建线程的方法,却无法进行数据库操作?

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");

    }
  • 写回答

1条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2020-02-22 15:43
    关注

    可能是开启事务权限问题,比如只是只读。那么其他操作就不行。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题