1. 程式人生 > >註解動態切換資料庫時,如何處理事務失效(@Transactional / JTA)

註解動態切換資料庫時,如何處理事務失效(@Transactional / JTA)

【PS】本小白第一次寫文章,也沒什麼技術含量,大家隨便轉載。。。

框架環境:spring-boot,mybatis(jdbctemplate裡面也有說到)

問題描述:突發奇想想弄一個動態切換資料來源的東東。於是在網上搜了很多關於配置註解的方式實現動態切換資料來源的資料。實現了在service方法上加上一個指定資料來源標識的註解就能用該資料來源執行資料庫操作的功能(說白了也就AbstractRoutingDataSource方式實現的,做個好人,連結給你 https://yq.aliyun.com/articles/8302)。但是發現一個問題,就是我service裡如果有A方法,A方法需要呼叫同樣是service層的B,C方法。我需要讓B方法訪問b資料來源,C方法訪問c資料來源,同時還要支援事務

。這樣的需求用前面的註解切資料來源是不能實現的。會發現怎麼搞都只能訪問b或者c資料庫,不能切換。

解決:

    PS:前置,不要忘了配JTA事務!

1. jdbctemplate

     這個我沒有去實踐,喜歡重構jdbctemplate的可以試試,因為能拿到jdbctemplate,所以實際上還是很方便的。無恥地把一篇文章連結複製在這,一共前後兩篇,講的十分清楚:

    http://blog.csdn.net/ErixHao/article/details/52133153

    http://blog.csdn.net/erixhao/article/details/52138760

    2. mybatis

     (我用的mybatis, 我自己反正在網上沒找到很好的方法,這個是我試下來能用的方案)

     我原先專案也有用到mybatis多資料來源,是配置多個sqlSessionFactory+MapperScannerConfigurer掃描不同包下的mapper檔案實現硬切換的爛大街方法。所以我意識到切換資料來源不僅僅配置AbstractRoutingDataSource就可以了,如果dao層是mybatis的情況下,還需要mybatis支援。實際上資料庫操作還是要落實在sqlSessionFactory上的,而sqlSessionFactory是繫結一個dataSource的,所以只要能夠動態切換sqlSessionFactory

問題就迎刃而解了。百度一下之後就可以發現很多實現方式(方便懶人,我就再貼一下我參考的文章的連結:http://www.zuidaima.com/shar/1816310397144064.htm,講的也很清楚)。

     最後的程式碼拼接工作就教給大家了。如果整套實現只是做成xml配置的話,還是很簡單的。不過如果你要想像問題描述裡面給的連結的方式那樣把一切配置成自動化的也是極好的,用不了幾十行程式碼。

總結:

     本文的價值就是踩在大神的肩膀上把別人的勞動成果穿起來而已,不過對於尋求解決方案的同道來說,還是還是很有參考作用的。唯一重大的缺點就是沒呈上完整程式碼敲打。。。

     有問題留言。