我们正在构建一个多租户服务器,每个租户都有一个数据库/模式。为此,我们使用 Springs AbstractRoutingDataSource 根据租户切换数据源。
租户由 servlet 过滤器中 url 的子域确定。此租户存储在线程本地中。
在启动线程之前,这一切都很好。例如,当休眠搜索重新索引时,它会启动很多线程。
当这些线程之一尝试获取连接时,线程本地返回 null 并且我无法确定租户。
我们正在构建一个多租户服务器,每个租户都有一个数据库/模式。为此,我们使用 Springs AbstractRoutingDataSource 根据租户切换数据源。
租户由 servlet 过滤器中 url 的子域确定。此租户存储在线程本地中。
在启动线程之前,这一切都很好。例如,当休眠搜索重新索引时,它会启动很多线程。
当这些线程之一尝试获取连接时,线程本地返回 null 并且我无法确定租户。
我通过使用存储我的租户的会话范围的 spring bean 来修复它。
样品见链接
您可以将租户标识符存储在InheritableThreadLocal
. 子线程将有权访问相同的 ThreadLocal 变量,因此将了解租户并使用相同的数据库。