我们需要在grails应用程序中使用多个数据源。每个用户,即每个http会话(从登录到用户注销),应用程序根据用户的请求采用不同的数据源。
http://www.leebutts.com/2008/07/switchable-grails-datasource.html
以上链接为此提供了一个很好的解决方案。我们已经在该页面中实现了改进的动态配置。它运行良好。
1)但是这段代码如何将数据源从会话切换到会话?
2)此代码中ThreadLocal contextHolder
的用途是什么?
请解释一下。 。
谢谢。
答案 0 :(得分:0)
Grails将请求绑定到线程。 ThreadLocal
变量为访问它的每个线程保存不同的值(允许线程安全而不同步)。
所以,在他的流程中会发生什么:
用户在Environment
中选择EnvironmentController
,控制器会将其保存到用户的会话中。
beforeFilter
他查看了每个请求,并确定用户会话中是否有Environment
。如果是这样,他将EnvironmentHolder
设置为指向该环境。由于这是一个ThreadLocal
,每个线程(在这种情况下:请求)都可以拥有它自己的值。
访问dataSource
bean时,他的SwitchableDatasource
bean根据EnvironmentHolder
的{{1}}值中保存的值选择正确的数据源。 / p>