租户ID过滤单个数据库中的多租户

时间:2018-01-22 01:04:55

标签: spring

我正在使用JDBCTemplate而不使用Hibernate并运行本机SQL查询。

我需要将租户ID附加/附加到正在执行的任何查询中。

对于多个数据库,我遇到了这个问题 - https://github.com/openMF/mifosx-admin/blob/master/src/main/java/org/mifosx/admin/domain/BaseDAO.java

有人可以帮我提出建议或评论如何动态附加租户ID作为jdbc拦截器或为查询应用过滤器吗?

目前所有查询都像select * from ...其中tenant id = test

感谢。

1 个答案:

答案 0 :(得分:0)

一旦您可以在线程本地确定它的值,就可以存储租户ID,这可能是由servlet过滤器促成的。

如果所有此类实体都实现了一个公开'tenantId'属性的接口,那么在BaseDAO类中的上述线程本地tenantId中更新实体对象中的此属性。

举例来说,您可以创建一个单例,它保留租户ID的threadlocal副本,假设它是一个Integer。这是一种方法。

public enum ThreadState {
    INSTANCE
    ;
    private ThreadLocal<Integer> tenantId = new ThreadLocal<>();
    public void setTenantId(Integer tid) {
        tenantId.set(tid);
    }
    public Integer getTenantId() {
        return tenantId.get();
    }   
}

然后,在代码中您确定给定请求的租户ID的位置,将其存储到我们的新threadlocal中,如下所示:

ThreadState.INSTANCE.setTenantId(tenantId);

最后,在您正在制定查询并需要访问租户ID的DAO类中,请写下以下内容:

Integer tenantId = ThreadState.INSTANCE.getTenantId()

此时,您可以在制定查询时使用tenantId,或在存储之前更新新的实体对象。