当前位置: 首页 > wzjs >正文

wordpress 图书馆主题aso搜索排名优化

wordpress 图书馆主题,aso搜索排名优化,平谷区住房城乡建设委网站,深圳苏州企业网站建设服务公司【Bug】定时任务中 Jpa Save 方法失效 首先说一下问题,在定时任务中调用 jpa 的 save 方法没有效果,但是通过外界调用,比如 controller 中注入 service 来调用是可以的,真是巨巨巨离谱,我被折磨了好几天。 我这个问题…

【Bug】定时任务中 Jpa Save 方法失效

首先说一下问题,在定时任务中调用 jpa 的 save 方法没有效果,但是通过外界调用,比如 controller 中注入 service 来调用是可以的,真是巨巨巨离谱,我被折磨了好几天。

我这个问题的根源在于多数据源的配置上,所以如果你的项目中没有使用多数据源,那接下来的内容应该对你没什么帮助了~

一般来讲,在配置多数据源的时候,除了要继承 AbstractRoutingDataSource 类

package com.xsdl.content;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class MultiDataSource extends AbstractRoutingDataSource {private static final ThreadLocal<String> keys = new ThreadLocal<String>();@Overrideprotected Object determineCurrentLookupKey() {return keys.get();}public static void setDataSource(String dataSource) {keys.set(dataSource);}public static String getDatasource() {return keys.get();}public static void clearDataSource() {keys.remove();}}

还会配置对应数据源的 datasource、jdbcTemplate 等

package com.xsdl.config;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
public class MultiDataSourceConfig {@Bean(name = "dataSourceAAA")@Primary@ConfigurationProperties("spring.aaa.datasource")public DataSource dataSourceAAA() {return DataSourceBuilder.create().build();}@Bean(name = "dataSourceBBB")@ConfigurationProperties("spring.bbb.datasource")public DataSource dataSourceBBB() {return DataSourceBuilder.create().build();}@Bean(name = "multiDataSource")public MultiDataSource multipleDataSource(@Qualifier("dataSourceAAA") DataSource dataSourceA,@Qualifier("dataSourceBBB") DataSource dataSourceB) {Map<Object, Object> map = new HashMap<>();map.put("dataSourceA", dataSourceA);map.put("dataSourceB", dataSourceB);MultiDataSource multipleDataSource = new MultiDataSource();multipleDataSource.setDefaultTargetDataSource(dataSourceA);multipleDataSource.setTargetDataSources(map);return multipleDataSource;}@Beanpublic JdbcTemplate jdbcTemplate(MultiDataSource multipleDataSource) {return new JdbcTemplate(multipleDataSource);}@Bean@Primary@Description("事务管理器")public PlatformTransactionManager transactionManager(@Qualifier("multiDataSource") MultiDataSource multiDataSource) {return new DataSourceTransactionManager(multiDataSource);}}

事情到现在是很正常的,启动项目也可以正常启动,正常在 service 的业务逻辑里调用对应的 dao 或者 repository 去保存数据也可以

突然有一天,我接到一个需求,有一个接收记录的表,我需要定时从中查询执行失败的,重试进行补偿,那我补偿完成后,当然要更新回去对吧,于是我写了一个类似下面这样的代码:

package com.xsdl.job;import com.xsdl.dao.UserDao;
import com.xsdl.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.UUID;
import java.util.stream.IntStream;@Component("tsJob")
@Slf4j
public class TsJob {@Autowiredprivate UserDao userDao;@Scheduled(cron = "0 0/2 * * * ?")public void execute() {log.warn("定时任务开始执行");IntStream.rangeClosed(1, 10).forEach(i -> {User user = new User();user.setUuid(UUID.randomUUID().toString());user.setName("name" + i);userDao.save(user);});log.warn("定时任务执行结束");}}

具体逻辑不用关注,就是查数据库,然后修改了几个字段,重新 save 回去,这时候问题出现了,save 方法执行无效,数据库里数据没更新,我一路 debug,期间各种磕磕绊绊,就是找不到问题,反而找到了几个同病相怜的人:

[在spring的定时任务中使用 jpa 的save 方法失效](https://forum.springdoc.cn/t/topic/776)

no transaction is in progress

我一开始以为是事务的开启问题,包括但这样尝试:

    @Scheduled(cron = "0 0/2 * * * ?")public void execute() {log.warn("定时任务开始执行");IntStream.rangeClosed(1, 10).forEach(i -> {User user = new User();user.setUuid(UUID.randomUUID().toString());user.setName("name" + i);getThis.doSave(user);});log.warn("定时任务执行结束");}@Transactional(propagation = Propagation.New)public void doSave(User user) {userDao.save(user);}private TsJob getThis() {return ApplicationContextUtil.getBean("tsJob",TsJob.class);}

然而什么用都没有

最关键的是,这个方法如果在一个 controller 里手动调用是可以执行的,我觉得太离谱了,就想开个新项目复现一下,结果怎么都复现不出来,最后突然觉得区别也就是在多数据源上了,中间各种尝试,直到我把这个代码注释掉,终于可以了~

    @Bean@Primary@Description("事务管理器")public PlatformTransactionManager transactionManager(@Qualifier("multiDataSource") MultiDataSource multiDataSource) {return new DataSourceTransactionManager(multiDataSource);}

如果你的项目里也这样配置了 transactionManager ,可能就是这个问题~

http://www.dtcms.com/wzjs/348673.html

相关文章:

  • iis7 建立网站可以免费推广的网站
  • 国防教育网站建设说明书口碑营销5t
  • 邢台建筑类的建设网站西安专业seo
  • 营销型网站建设团队河南省干部任免最新公示
  • 做论坛网站时应该注意什么友情链接检测平台
  • 公众号授权网站网络营销策略的概念
  • 网站优化计划书百度平台商户电话号码
  • 手机网站制作移动高端网站建设semseo
  • 上海市做网站免费手游推广平台
  • 个人网站设计app网站推广平台
  • 低价网站建设公司今日头条新闻头条
  • 竞价网站做推广方案十大计算机培训学校
  • 网络营销怎么做网站百度极速版免费下载安装
  • 网页设计和网站建设360优化大师app下载
  • 毕业作品是做网站的答辩会问什么seo的培训课程
  • 给上市公司做网站有什么用超级外链发布
  • wordpress静态页制作正规网站优化公司
  • 网站专栏建设情况东莞网站推广哪里找
  • 哪个网站做h5最好流程优化四个方法
  • 怎么修改wordpress字体长沙官网seo技术厂家
  • 长沙好的做网站品牌奇葩网站100个
  • 网站的承诺外贸seo推广招聘
  • 免费搭建公司网站百度认证证书
  • 手工做刀网站百度认证官网
  • 网站分享按钮舆情网站直接打开的软件
  • 下载深圳app优化seo教程技术
  • 遵义外国网站制作各种网站
  • 关于加强门户网站建设品牌营销的四大策略
  • 网站规划与开发专业如何开发一个软件平台
  • 学习做网站桂林网页