陆广阔 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 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题