配置动态数据源网上的例子一大把,但是按照上面的配置会遇到的一些问题和原来却没有描述,需要注意的几个点如下:
1.动态数据源根据方法切换数据源需要配置切面拦截器,注意该拦截器 一定要设置优先级为1,否则会导致获取数据源的时候拦截器还没有执行,因为数据源的获取也是拦截器执行的,设置方法 注解是@Order(1)。
2.必须要弄清楚 session 会话和事务的关系,一个session 会话中会存在多个事物,session 开启会话的时候会获取数据源,那么问题来了,就是你的两个service方法,分别保存到两个不同的数据库会有问题,因为这两个事物很可能会根据 会话的开启配置 而共享同一个会话,而不会重新去获取新的数据源,导致切换无效,所以 会话开启要和数据源事物配置保持一致。
3. jta hibernate 中 使用切换动态数据源的方式 两次save方法保存进两个数据源,其中一个会失效,原因是因为第一次保存以后,session 缓存中会存在该对象,第二次使用save保存就会失效,所以需要先 剔除 使用 detach 方法 使该对象变成游离状态,并且 使用detach 方法的时候,也会因为数据库中id 和 该对象id 一致,导致无法剔除而报错,所以需要将id 设置为 null,然后 再使用 detach 方法剔除成游离状态,再保存,就可以保存进两个数据库了。