数据库的隔离情况下使用多线程异常

Blade 未结 1 965
153705849
153705849 2021-03-03 17:18

一、该问题的重现步骤是什么?

1. 租户模式采用数据库的隔离情况下再控制器方法启用多线程会出现异常,估计是多线程的情况下获取不到对应线程的租户信息

2. 

3.


二、你期待的结果是什么?实际看到的又是什么?

租户隔离情况下开启多线程可以正常使用


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

2.6.0.RELEASE  商业版

四、请提供详细的错误堆栈信息,这很重要。

Method threw 'org.springblade.core.tenant.exception.TenantDataSourceException' exception. Cannot evaluate org.springblade.amazon.service.impl.UkAwsAsinServiceImpl$$EnhancerBySpringCGLIB$$a8dedb0f.toString()


五、若有更多详细信息,请在下面提供。


1条回答
  •  admin
    admin (楼主)
    2021-03-03 17:22

    多线程不能直接使用自动切换的功能,因为自动切换功能是基于http请求头内的租户id来判定的

    多线程内无法获取,所以也就无法自动切换了

    如果需要在多线程操作,可以手动写一个类,在类的局部加上如下代码

    ps: 如果对多线程熟悉的话,可以进一步解决,比如在线程池上加上透传,或者使用spring的默认异步。

    String tenantId = AuthUtil.getTenantId();
    try {
       // 开启多线程业务逻辑,把tenantId传入多线程代码块
       // 手动指定租户并切换数据源
       DynamicDataSourceContextHolder.push(tenantId);
       // ..............
    } catch (Exception exception) {
       throw new TenantDataSourceException(exception.getMessage());
    } finally {
       DynamicDataSourceContextHolder.poll();
    }


    作者追问:2021-03-03 17:22

    按你的提供的方式修改后报了个错误:

    PreparedStatementCallback; bad SQL grammar [select datasource_id from blade_tenant WHERE is_deleted = 0 AND tenant_id = ?]; nested exception is java.sql.SQLSyntaxErrorException: Table 'smart_base.blade_tenant' doesn't exist


    这样的话是需要每个租户的数据库都要有租户的信息表?

    0 讨论(0)
提交回复