当前位置: 首页 > 知识库问答 >
问题:

RoutingDataSource不在事务上切换上下文

狄奕
2023-03-14
    final DataSource masterDataSource = buildTargetDataSource(tenantId,
        cachePrepStmtsValue,
        prepStmtCacheSize,
        prepStmtCacheSqlLimit,
        databaseMasterUrl,
        driverClass,
        user,
        password,
        MASTER_DATASOURCE_PREFIX);
    final DataSource replicaDataSource = buildTargetDataSource(poolName + tenantId,
        cachePrepStmtsValue,
        prepStmtCacheSize,
        prepStmtCacheSqlLimit,
        databaseReplicaUrl,
        driverClass,
        user,
        password,
        REPLICA_DATASOURCE_PREFIX);
    final Map<Object, Object> targetDataSources = new HashMap<>();
    targetDataSources.put(DbContext.DbType.MASTER, masterDataSource);
    targetDataSources.put(DbContext.DbType.REPLICA, replicaDataSource);
    routingDataSource.setTargetDataSources(targetDataSources);
    routingDataSource.setDefaultTargetDataSource(masterDataSource);
    routingDataSource.afterPropertiesSet();
    return routingDataSource;
}
  public class RoutingDataSource extends AbstractRoutingDataSource {
        @Override
        protected Object determineCurrentLookupKey() {
            return DbContext.getDbType();

        }
  @Transactional(readOnly = true)
    public Opportunite consulter(UUID personUuid) {
      DbContext.setDbType(DbContext.DbType.REPLICA);
        //some work
        DbContext.reset();
        return some_result ;
    }

如何修复此行为?谢谢你。

共有1个答案

澹台举
2023-03-14

为了解决这个问题,我必须先定义要使用哪个数据库,然后再去处理事务,我定义了一个过滤器(我使用的是spring)

public class DbFilter extends  {
//les urls that do not only GET method
private final static String NOT_ONLY_GET_URL= "/api/parametre";

@Override
protected void doFilterInternal(HttpServletRequest request,
                                HttpServletResponse response,
                                FilterChain filterChain) throws IOException, ServletException, RestException {
    DbContext.setDbType(DbContext.DbType.MASTER);
    if (!NOT_ONLY_GET_URL.equals(request.getRequestURI()) && request.getMethod().equals("GET")) {
        DbContext.setDbType(DbContext.DbType.REPLICA);
    }
    filterChain.doFilter(request, response);
}

此方法在调用任何@Transactional方法之前运行,如果它是GET方法,则切换数据库。

我已经删除了dbcontext.setdbtype(dbcontext.dbtype.replica);和dbcontext.reset()。

 类似资料:
  • 本文向大家介绍什么是上下文切换?相关面试题,主要包含被问及什么是上下文切换?时的应答技巧和注意事项,需要的朋友参考一下 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文

  • 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。 概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时

  • 实现试衣间app首页中的上下滑动的特效,可以上拉视图查看下一张图片,也可以下拉将看过的图片再拉下来显示。视图变换时显示透明的效果。 [Code4App.com]

  • 什么是 CPU 上下文 Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。

  • 问题内容: 我正在用nginx和uwsgi运行django应用程序。一切正常,但突然之间我不知道自己更改了应用程序停止工作了。 问题在于uWsgi的python版本是2.4.3,这是Linux CentOs中的默认版本,我已经在2.7.3版中安装了django,webpy和其他python发行版(将尽快升级)。 我还尝试在usr / bin中创建从python 2.7路径到“ python”的符号

  • 我做了一个标题,当有人在桌面上访问网站时,他会看到一个导航菜单。当同一个人在他的手机上访问网站时,他首先会看到一份汉堡菜单。当他点击汉堡包菜单时,有一个动画和一个下拉菜单。 我能够修复这个代码,但当我访问我的pc上的网站,我点击附近我的头,这个移动的dropdrown菜单将出现... 场地; https://www.spiralex.nl/ 我的汉堡包和下拉代码; null null