成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

spring-data-mongodb多數(shù)據(jù)庫(kù)訪問(wèn)實(shí)現(xiàn)

AaronYuan / 2585人閱讀

摘要:最近公司項(xiàng)目需要支持,每個(gè)數(shù)據(jù)庫(kù)地址不同,需求就是修改配置文件,添加或者刪除數(shù)據(jù)庫(kù)配置,重啟系統(tǒng)后就可以完成,不需要額外修改代碼。那怎么來(lái)完成數(shù)據(jù)庫(kù)的訪問(wèn)的呢核心類是,而變量才是完成訪問(wèn)的關(guān)鍵,而這個(gè)其實(shí)就是。

最近公司項(xiàng)目需要支持multi-tenancy,每個(gè)tenant數(shù)據(jù)庫(kù)地址不同,需求就是修改配置文件,添加或者刪除數(shù)據(jù)庫(kù)配置,重啟系統(tǒng)后就可以完成,不需要額外修改代碼。

網(wǎng)上搜索了一下,基本上都是將配置寫(xiě)在了代碼里了,例如:http://www.devzxd.top/2017/06...,不能動(dòng)態(tài)增減數(shù)據(jù)庫(kù)配置,并且對(duì)不同的數(shù)據(jù)庫(kù)創(chuàng)建不同的Repository。繼續(xù)Google之后,在github上找到一個(gè)例子multi-tenant-spring-mongodb,看了一下代碼,還是不符合需求。沒(méi)辦法,只能看代碼,調(diào)試來(lái)看看自己能不能實(shí)現(xiàn)這個(gè)需求了。

那spring-data-mongodb怎么來(lái)完成數(shù)據(jù)庫(kù)的訪問(wèn)的呢?核心類是SimpleMongoRepository,而mongoOperations變量才是完成訪問(wèn)的關(guān)鍵,而這個(gè)mongoOperations其實(shí)就是mongoTemplate。那就意味著如果我們能夠動(dòng)態(tài)改變這個(gè)mongoTemplate的值就可以切換數(shù)據(jù)庫(kù)了,竊喜。

解決的方法有了,但是如何實(shí)現(xiàn)呢?庫(kù)并沒(méi)有提供類似Hibernate那樣的MultiTenantConnectionProviderCurrentTenantIdentifierResolver來(lái)幫助我們實(shí)現(xiàn)。既然spring是通過(guò)AOP和Proxy來(lái)完成功能的調(diào)用的,我們似乎也可以這么玩。

我們要對(duì)所有的Repository方法的訪問(wèn)創(chuàng)建一個(gè)PointCut,這樣我們就可以在訪問(wèn)之前搞事情了。

利用反射拿到j(luò)oinPoint的target,然后調(diào)用用AopProxyUtils.getSingletonTarget(target)取到最終的SimpleMongoRepository實(shí)例。

通過(guò)反射設(shè)置mongoOperations的值。

代碼如下:

@Repository
public interface WidgetDataRepository extends MongoRepository {
}
// 注意:線程不安全?。?!
@Around("execution(* com.example.demo.dao.mongo.MongoWidgetDataRepo.*(..))")
public Object doSwitch(ProceedingJoinPoint joinPoint) throws Throwable {
    // 拿到我們需要的tenant
    String tenant = (String) RequestContextHolder.currentRequestAttributes().getAttribute("tenant", SCOPE_REQUEST);
    tenant = tenant == null ? "test" : tenant;
    
    // 通過(guò)反射獲取到target
    Field methodInvocationField = joinPoint.getClass().getDeclaredField("methodInvocation");
    methodInvocationField.setAccessible(true);
    ReflectiveMethodInvocation o = (ReflectiveMethodInvocation) methodInvocationField.get(joinPoint);

    Field targetField = o.getClass().getDeclaredField("target");
    targetField.setAccessible(true);
    Object target = targetField.get(o);

    // 獲得SimpleMongoRepository,并往里面填入值
    Object singletonTarget = AopProxyUtils.getSingletonTarget(target);
    Field mongoOperationsField = singletonTarget.getClass().getDeclaredField("mongoOperations");
    mongoOperationsField.setAccessible(true);
    mongoOperationsField.set(singletonTarget, ac.getBean("mongoTemplate" + tenant));

    return joinPoint.proceed();
}

這樣我們就可以完成數(shù)據(jù)庫(kù)的切換了,可以利用spring-data-mongodb,盡可能的少些模板代碼。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19174.html

相關(guān)文章

  • spring-data-mongodb數(shù)據(jù)庫(kù)訪問(wèn)實(shí)現(xiàn)

    摘要:最近公司項(xiàng)目需要支持,每個(gè)數(shù)據(jù)庫(kù)地址不同,需求就是修改配置文件,添加或者刪除數(shù)據(jù)庫(kù)配置,重啟系統(tǒng)后就可以完成,不需要額外修改代碼。那怎么來(lái)完成數(shù)據(jù)庫(kù)的訪問(wèn)的呢核心類是,而變量才是完成訪問(wèn)的關(guān)鍵,而這個(gè)其實(shí)就是。 最近公司項(xiàng)目需要支持multi-tenancy,每個(gè)tenant數(shù)據(jù)庫(kù)地址不同,需求就是修改配置文件,添加或者刪除數(shù)據(jù)庫(kù)配置,重啟系統(tǒng)后就可以完成,不需要額外修改代碼。 網(wǎng)上搜...

    pf_miles 評(píng)論0 收藏0
  • spring-data-mongodb常用操作

    摘要:踩到許多坑,記錄下一些基于的東西吧首先。先創(chuàng)建個(gè)集合,保存寫(xiě)信息,然后再創(chuàng)建集合,可以發(fā)現(xiàn)存儲(chǔ)的時(shí)候變成了一個(gè)引用類型。王大錘那么查詢的時(shí)候,如果要根據(jù)查詢班級(jí)怎么辦,的查詢也非常簡(jiǎn)單。詳情可以查看官方文檔用法 剛接觸mongodb不久。踩到許多坑,記錄下一些基于spring-data-mongodb的東西吧 首先。應(yīng)該了解下什么情況下使用mongodb,什么情況下用mysql: 業(yè)...

    Michael_Ding 評(píng)論0 收藏0
  • spring-data-mongodb查詢使用的一些總結(jié)

    摘要:踩到許多坑,記錄下一些基于的東西吧首先。王大錘那么查詢的時(shí)候,如果要根據(jù)查詢班級(jí)怎么辦,的查詢也非常簡(jiǎn)單。詳情可以查看官方文檔用法 剛接觸mongodb不久。踩到許多坑,記錄下一些基于spring-data-mongodb的東西吧 首先。應(yīng)該了解下什么情況下使用mongodb,什么情況下用mysql: 業(yè)務(wù)需要事物,使用mysql,因?yàn)閙ongodb不支持事物 數(shù)據(jù)量大,但是數(shù)據(jù)本身...

    jollywing 評(píng)論0 收藏0
  • spring-data-mongodb查詢使用的一些總結(jié)

    摘要:踩到許多坑,記錄下一些基于的東西吧首先。王大錘那么查詢的時(shí)候,如果要根據(jù)查詢班級(jí)怎么辦,的查詢也非常簡(jiǎn)單。詳情可以查看官方文檔用法 剛接觸mongodb不久。踩到許多坑,記錄下一些基于spring-data-mongodb的東西吧 首先。應(yīng)該了解下什么情況下使用mongodb,什么情況下用mysql: 業(yè)務(wù)需要事物,使用mysql,因?yàn)閙ongodb不支持事物 數(shù)據(jù)量大,但是數(shù)據(jù)本身...

    FuisonDesign 評(píng)論0 收藏0
  • spring+mongodb的整合

    摘要:版本不支持支持為,如果使用并且使用,則會(huì)出現(xiàn)提示,編譯出錯(cuò)。掃描的倉(cāng)庫(kù)目錄,會(huì)自動(dòng)掃描擴(kuò)展了接口的接口進(jìn)行注入。 mongodb介紹 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。 MongoD...

    warmcheng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<