国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

spring-data-mongodb多數據庫訪問實現

AaronYuan / 2576人閱讀

摘要:最近公司項目需要支持,每個數據庫地址不同,需求就是修改配置文件,添加或者刪除數據庫配置,重啟系統后就可以完成,不需要額外修改代碼。那怎么來完成數據庫的訪問的呢核心類是,而變量才是完成訪問的關鍵,而這個其實就是。

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

網上搜索了一下,基本上都是將配置寫在了代碼里了,例如:http://www.devzxd.top/2017/06...,不能動態增減數據庫配置,并且對不同的數據庫創建不同的Repository。繼續Google之后,在github上找到一個例子multi-tenant-spring-mongodb,看了一下代碼,還是不符合需求。沒辦法,只能看代碼,調試來看看自己能不能實現這個需求了。

那spring-data-mongodb怎么來完成數據庫的訪問的呢?核心類是SimpleMongoRepository,而mongoOperations變量才是完成訪問的關鍵,而這個mongoOperations其實就是mongoTemplate。那就意味著如果我們能夠動態改變這個mongoTemplate的值就可以切換數據庫了,竊喜。

解決的方法有了,但是如何實現呢?庫并沒有提供類似Hibernate那樣的MultiTenantConnectionProviderCurrentTenantIdentifierResolver來幫助我們實現。既然spring是通過AOP和Proxy來完成功能的調用的,我們似乎也可以這么玩。

我們要對所有的Repository方法的訪問創建一個PointCut,這樣我們就可以在訪問之前搞事情了。

利用反射拿到joinPoint的target,然后調用用AopProxyUtils.getSingletonTarget(target)取到最終的SimpleMongoRepository實例。

通過反射設置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;
    
    // 通過反射獲取到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();
}

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19174.html

相關文章

  • spring-data-mongodb據庫訪問實現

    摘要:最近公司項目需要支持,每個數據庫地址不同,需求就是修改配置文件,添加或者刪除數據庫配置,重啟系統后就可以完成,不需要額外修改代碼。那怎么來完成數據庫的訪問的呢核心類是,而變量才是完成訪問的關鍵,而這個其實就是。 最近公司項目需要支持multi-tenancy,每個tenant數據庫地址不同,需求就是修改配置文件,添加或者刪除數據庫配置,重啟系統后就可以完成,不需要額外修改代碼。 網上搜...

    pf_miles 評論0 收藏0
  • spring-data-mongodb常用操作

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

    Michael_Ding 評論0 收藏0
  • spring-data-mongodb查詢使用的一些總結

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

    jollywing 評論0 收藏0
  • spring-data-mongodb查詢使用的一些總結

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

    FuisonDesign 評論0 收藏0
  • spring+mongodb的整合

    摘要:版本不支持支持為,如果使用并且使用,則會出現提示,編譯出錯。掃描的倉庫目錄,會自動掃描擴展了接口的接口進行注入。 mongodb介紹 MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。 MongoD...

    warmcheng 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<