日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)

發布時間:2025/6/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

這里的云計算多租戶是指一個web應用,多個數據庫。每一個租戶對應著一個數據庫。?

數據庫方面,簡單分為一個基本庫,記錄著基本信息與租戶的信息,還有租戶數據庫配置信息。N個租戶庫,這N個租戶庫,可能分布在一臺服務器上,也可能分布在N臺服務器上,可能兩者兼有。所以在基本庫中的租戶的數據庫所在服務器信息(下面稱為數據源信息)與數據庫信息。?

Play的數據源配置,在conf/application.conf中,如:

jpa.dialect=org.hibernate.dialect.MySQLDialect db.url=jdbc:mysql://basedbip:3306/pop?autoReconnect=true&useUnicode=true&characterEncoding=utf-8 db.driver=com.mysql.jdbc.Driver db.user=root db.pass=root db=popdb_01.url=jdbc:mysql://anotherdbip:3306/pop?autoReconnect=true&useUnicode=true&characterEncoding=utf-8 db_01.driver=com.mysql.jdbc.Driver db_01.user=root db_01.pass=root db_01=pop01

因為Play是無狀態的輕框架,所以要保持某個租戶下面的單個用戶一次會話中不同時間不同鏈接請求的庫信息一樣,就必須有相應的切庫邏輯。同時需要有必要的切庫憑證數據。?

我們可以在登陸的時候,將用戶的登陸信息與之對應租戶的數據庫信息封裝成一個對象,以該登陸信息對象為value,用戶本次會話的sessionid為Key,存放在緩存之中,如redis。?

每次請求來臨的時候,根據sessionid,從緩存中獲取登陸信息對象,如果沒有,則可認為該用戶沒有登陸,將其指向登陸頁面(這里需要設定白名單,將登陸的鏈接排除)。 如果有對象,則將數據庫信息取出,利用setCurrentConfigName切換數據源

JPA.setCurrentConfigName(dbconfigname);

利用user切換數據庫

JPA.em().createNativeQuery("use?"+dbname).executeUpdate();

從而達到了切庫功能,在這個地方,不能使用@before注解,因為play框架會對請求參數中的對象參數數據進行JPA查詢分裝,而這個處理時機在處理@before之前,詳細的請參考: Play 1.x框架學習之七:多數據庫切換與源碼修改 ( Databases Switch And Modify Source Code)?

如果修改Play源碼之后,就可就行自由切庫。?

有一個地方需要注意的是,如果用戶表數據不是存放在基礎庫而是在租戶庫中,這時候就需要一個原始的切庫憑據(如果沒有,則無法到相應的租戶庫獲取用戶數據進行登錄校驗),這里提供兩種解決方法,一是可以在登陸的時候讓用戶多填寫一個與租戶相關的憑證,也可以根據不同的租戶,提供不同的url入口,來達到相同的結果,這樣的用戶體驗較第一種好。

轉載于:https://my.oschina.net/markho/blog/498302

總結

以上是生活随笔為你收集整理的用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。