導航:首頁 > 編程語言 > java動態數據源

java動態數據源

發布時間:2024-04-02 23:05:36

java JDBC連接DB2資料庫問題

JAVA連接DB2
/**了解基礎情況**/ 對於Java程序員而言,DB2 提供了兩種應用程序編程介面(API):JDBC 和 SQLJ。

JDBC:
JDBC 驅動程序分為舊的/CLI 驅動程序<db2java.zip>和新的通用 JDBC 驅動程序(Universal JDBC Driver)<db2jcc.jar>。
JDBC 是一個與供應商無關的動態 SQL 介面,該介面通過標准化的 Java 方法向您的應用程序提供數據訪問。
JDBC 類似於 DB2 CLI,因為您無須預編譯應用程序代碼,也無須將軟體包綁定到 DB2 資料庫。
作為一個與供應商無關的標准,JDBC 應用程序提供了更多的可移植性—這是當今異構業務基礎設施所必需並嘩賀的優點。
在執行 JDBC 應用程序期間,驅動程序將針對當前連接的 DB2 資料庫伺服器驗證 SQL 語句。
訪問期間的任何問題都會作為 Java 異常與相應的 SQLSTATE 和 SQLCODE 一起報告給應用程序。
SQLJ:
SQLJ 是一個用於從 Java 應用程序進行數據訪問的標准開發模型。
SQLJ API 是在 SQL 1999 規范中定義的。

新的通用 JDBC 驅動程序在一個實現中同時為 JDBC 和 SQLJ API 提供了支持。
JDBC 和 SQLJ 可以在同一個應用程序中互操作。
SQLJ 提供了獨特的使用靜態 SQL 語句進行開發以及在 DB2 包級別控制訪問的能力。

/**JDBC連接方式分析**/
JDBC 驅動程序體系結構分為四種類型:Type1,Type2,Type3,Type4。

Type1:
驅動程序基於 JDBC-ODBC 橋。
因此 ODBC 驅動程序可以與此類 JDBC 驅動程序(由 Sun 提供)結合起來使用。
IBM 不支持 Type 1 驅動程序,因此它不是推薦的環境。
Type2:
驅動程序依靠特定於操作系統的庫(共享庫)來與 RDBMS 通信。
應用程序將裝入這種 JDBC 驅動程序,而驅動程序將使用共享庫來與 DB2 伺服器通信。
DB2 UDB for Linux, UNIX和 WindowsV8.1 提供了兩種絕派不同的 Type 2 驅動程序:
<1> 舊的/蘆瞎CLI JDBC 驅動程序在文件db2java.zip中提供。
其實現包名稱為COM.ibm.db2.jdbc.app.DB2Driver。
該驅動程序目前已被用於進行 J2EE 認證。
其別名「app 驅動程序」源自於一種觀念及其包名稱,
這種觀念就是:此驅動程序將通過遠程資料庫的本地 DB2 UDB 客戶機執行本地連接。
<2> 通用 JDBC 驅動程序在文件db2jcc.jar中提供。
其實現包名稱為com.ibm.db2.jcc.DB2Driver。
此驅動程序是 DB2 UDB for Linux, UNIX 和 Windows V8.1 中的新功能。
在最初的實現(V8.1)中,此驅動程序用於使用 Type 4 驅動程序體系結構與 DB2 伺服器進行直接的 Java 連接。
在 DB2 V8.1.2 中,您可以在 Type 2 體系結構中使用此驅動程序。
在 Type 2 體系結構中使用此驅動程序的一個主要原因是為了本地應用程序性能和分布式事務支持。
通用 JDBC Type 2 驅動程序分別使用com.ibm.db2.jcc.DB2XADataSource和com.ibm.db2.jcc.DB2ConnectionPoolDataSource來支持分布式事務和連接池。 註:在將來的版本中不會對舊的/CLI Type 2 驅動程序進行增強。
Type3:
驅動程序是一種純 Java 實現,它必須與 DB2 JDBC Applet 伺服器(DB2 JDBC Applet Server)通信才能訪問 DB2 數據。
此類驅動程序旨在使 Java applet 能訪問 DB2 數據源。
常被稱作「網路(net)驅動程序」,它是根據其包名COM.ibm.db2.jdbc.net命名的。DB2 V8.1 支持網路驅動程序,可以將其用於 JDBC 應用程序。
要求db2java.zip驅動程序總是處於與 DB2 Applet 伺服器相同的維護級別。
如果驅動程序在 applet 內使用,這就不是一個問題,因為瀏覽器會在應用程序執行期間下載相應的db2java.zip文件。
許多客戶使用 Type3 驅動程序而不是 Type2 驅動程序,以避免必需的 DB2 客戶機安裝和必需的DB2 CATALOG DATABASE命令,後者用於創建使用舊的/CLI 驅動程序進行 Type 2 連接所必需的資料庫目錄信息。
目前,WebSphere Application Server 和其它 J2EE 伺服器不支持 IBM Type 3 驅動程序,因為該驅動程序不支持分布式事務(JTA)。
將來的版本不會對 Type 3 驅動程序進行增強。

鼓勵使用通用 JDBC Type 4 驅動程序來替代 Type 3 驅動程序。

Type4:
驅動程序是僅用於 Java 的 JDBC 驅動程序,它直接連接到資料庫伺服器。
DB2 UDB for Linux, UNIX 和 Windows V8.1 引入了稱為「通用 JDBC 驅動程序(Universal JDBC driver)」的 Type 4 驅動程序。
通用 JDBC 驅動程序在文件db2jcc.jar中提供。
其實現包名為com.ibm.db2.jcc.DB2Driver。
請注意,通用 Type 2 和通用 Type 4 驅動程序具有相同的實現類名稱。
有兩種方法可以區別 DB2 在內部將實例化哪個驅動程序:
使用連接特性來確定連接是否使用共享庫(Type2),或者驅動程序是否會啟動來自 Java 應用程序的直接連接(Type4)。
重要:就 DB2 UDB V8.1.2 而言,通用 JDBC 驅動程序要求 CLASSPATH 中有許可證 JAR 文件和db2jcc.jar文件。
以下是所需的許可證 JAR 文件:
Cloudscape Network Server V5.1:db2jcc_license_c.jar
DB2 UDB V8 for Linux, UNIX 和 Windows 伺服器:db2jcc_license_su.jar
DB2 UDB for iSeries and z/OS 伺服器(與 DB2 Connect 和 DB2 Enterprise Server Edition 一起提供):db2jcc_license_cisuz.jar ****************************************************************驅動程序類型:db2java.zip, db2jcc.jar
注意:假如你使用db2java.zip,且web伺服器使用Tomcat的話,請將db2java.zip改名為db2java.jar,最好將zip解壓再用jar命令打包,直接改文件類型也行(呵呵,按照jar文件嚴格意義上來講這是不符合文法的<少了描述性文件:MANIFEST.MF>,能用就行)
還有一般情況下:就是使用 db2java.zip的話需要安裝db2客戶端, 使用db2jcc.jar是通過網路直接來連接的無需安裝db2客戶端(假如用在type2上還是要裝客戶端的)type2:
使用<db2java.zip>:
jdbc.driverClassName=COM.ibm.db2.jdbc.app.DB2Driver
jdbc.url=jdbc:db2:dataBaseName

假如你的工具使用的是myeclipse且使用的是tomcat plugin的話,請將db2jdbc.dll 拷貝到 %JAVA_HOME%/bin下,否則不行地啦
<是不是其他類型的使用db2java.zip驅動也有這個問題呢,不知道,沒試過,有空試一下>

使用<db2jcc.jar>:
jdbc.driverClassName=com.ibm.db2.jcc.DB2Driver
jdbc.url=jdbc:db2:dataBaseName

type3:
驅動:db2java.zip
jdbc.driverClassName=COM.ibm.db2.jdbc.net.DB2Driver
jdbc.url=jdbc:db2://ip:6789/DBNAME
注意:要在資料庫上執行 db2jstrt 6789 (這句啟動了db2jd進程,6789是默認的伺服器偵聽jdbc2連接的埠,也可以設置成另外的任意不沖突的埠。)

type4:
驅動:db2jcc.jar
資料庫字元集必須設置為utf-8
jdbc.driverClassName=com.ibm.db2.jcc.DB2Driver
jdbc.url=jdbc:db2://ip:port/DBNAME

⑵ 濡備綍鍦╯pring妗嗘灦涓瑙e喅澶氭暟鎹婧愮殑闂棰

銆銆鎴戦栧厛鎯沖埌鍦╯pring鐨刟pplicationContext涓閰嶇疆鎵鏈夌殑dataSource銆傝繖浜沝ataSource鍙鑳芥槸鍚勭嶄笉鍚岀被鍨嬬殑錛屾瘮濡備笉鍚岀殑鏁版嵁搴擄細Oracle銆丼QL Server銆丮ySQL絳夛紝涔熷彲鑳芥槸涓嶅悓鐨勬暟鎹婧愶細姣斿俛pache 鎻愪緵鐨刼rg.apache.commons.dbcp.BasicDataSource銆乻pring鎻愪緵鐨刼rg.springframework.jndi.JndiObjectFactoryBean絳夈傜劧鍚巗essionFactory鏍規嵁瀹㈡埛鐨勬瘡嬈¤鋒眰錛屽皢dataSource灞炴ц劇疆鎴愪笉鍚岀殑鏁版嵁婧愶紝浠ュ埌杈懼垏鎹㈡暟鎹婧愮殑鐩鐨勩
銆銆浣嗘槸錛屾垜寰堝揩鍙戠幇涓涓闂棰橈細褰撳氱敤鎴峰悓鏃跺苟鍙戣塊棶鏁版嵁搴撶殑鏃跺欎細鍑虹幇璧勬簮浜夌敤鐨勯棶棰樸傝繖閮芥槸鈥滃崟渚嬫ā寮忊濇児鐨勭ジ銆備紬鎵鍛ㄧ煡錛屾垜浠鍦ㄤ嬌鐢╯pring妗嗘灦鐨勬椂鍊欙紝鍦╞eanFactory涓娉ㄥ唽鐨刡ean鍩烘湰涓婇兘鏄閲囩敤鍗曚緥妯″紡錛屽嵆spring鍦ㄥ惎鍔ㄧ殑鏃跺欙紝榪欎簺bean灝辮呰澆鍒板唴瀛樹腑錛屽苟涓旀瘡涓猙ean鍦ㄦ暣涓欏圭洰涓鍙瀛樺湪涓涓瀵硅薄銆
​銆銆姝e洜涓哄彧瀛樺湪涓涓瀵硅薄錛屽硅薄鐨勬墍鏈夊睘鎬э紝鏇村噯紜璇存槸瀹炰緥鍙橀噺錛岃〃鐜板緱灝卞傚悓鏄涓闈欐佸彉閲忥紙瀹為檯涓娾滈潤鎬佲濅笌鈥滃崟渚嬧濆線寰鏄闈炲父鐩鎬技鐨勪袱涓涓滆タ錛屾垜浠甯稿父鐢ㄢ滈潤鎬佲濇潵瀹炵幇鈥滃崟渚嬧濓級銆傛嬁鎴戜滑鐨勯棶棰樻潵璇達紝sessionFactory鍦ㄦ暣涓欏圭洰涓鍙鏈変竴涓瀵硅薄錛屽畠鐨勫疄渚嬪彉閲廳ataSource涔熷氨鍙鏈変竴涓錛屽氨濡傚悓涓涓闈欐佸彉閲忎竴鑸銆傚傛灉涓嶅悓鐨勭敤鎴烽兘涓嶆柇鍦板幓淇鏀筪ataSource鐨勫礆紝蹇呯劧浼氬嚭鐜板氱敤鎴蜂簤鐢ㄤ竴涓鍙橀噺鐨勯棶棰橈紝瀵圭郴緇熶駭鐢熼殣鎮c
銆銆閫氳繃浠ヤ笂鐨勫垎鏋愶紝瑙e喅澶氭暟鎹婧愯塊棶闂棰樼殑鍏抽敭錛屽氨闆嗕腑鍦╯essionFactory鍦ㄦ墽琛屾暟鎹鎸佷箙鍖栫殑鏃跺欙紝鑳藉熼氳繃鏌愭典唬鐮佸幓鏍規嵁瀹㈡埛鐨勯渶瑕佸姩鎬佸垏鎹㈡暟鎹婧愶紝騫惰В鍐寵祫婧愪簤鐢ㄧ殑闂棰樸

⑶ 怎麼使用JAVA連接資料庫

1、載入驅動程序。

處理結果兩種情況:

1、執行更新返回的是本次操作影響到的記錄數。

2、執行查詢返回的結果是一個ResultSet對象。

ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些 行中數據的訪問。

(3)java動態數據源擴展閱讀:


Statement

要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3 種類型:

1、執行靜態SQL語句。通常通過Statement實例實現。

2、執行動態SQL語句。通常通過PreparedStatement實例實現。

3、執行資料庫存儲過程。通常通過CallableStatement實例實現。

⑷ java程序員在面試中被問到如何配置多數據源以及如何配置多數據源下的分布式事務,該怎麼回答看清再做答

你好,我來先回答含棗你的第一個問題:
通常多梁老悔數據源,在spring中配置如下,如果你想橡正切換環境ENV 的值,在property中
<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"></property>
<property name="" value="true"></property>
<property name="nullValue" value="NULL"></property>
<property name="locations">
<list>
<value>jdbc.properties</value>
</list>
</property>
</bean>

<bean id="dataSource" class="com.spring..JDBCConfig">
<property name="driverClassName" value="${${Env}.jdbc.driverClassName}"></property>
<property name="url" value="${${Env}.jdbc.url}"></property>
<property name="username" value="${${Env}.jdbc.username1}"></property>
<property name="password" value="${${Env}.jdbc.password}"></property>
</bean>

jdbc.properties
*****************************
Env=PROD

jdbc.driverClassName=${${Env}.jdbc.driverClassName}
jdbc.url=${${Env}.jdbc.url}
jdbc.username=${${Env}.jdbc.username}
jdbc.password=${${Env}.jdbc.password}

######### JDBC Configuration for DEV Environment ###############
DEV.jdbc.driverClassName=com.mysql.jdbc.Driver
DEV.jdbc.url=jdbc:mysql://localhost:3306/devportal
DEV.jdbc.username=DEVuser
DEV.jdbc.password=DEVpwd

######### JDBC Configuration for UAT Environment ############
UAT.jdbc.driverClassName=com.mysql.jdbc.Driver
UAT.jdbc.url=jdbc:mysql://localhost:3306/UATportal
UAT.jdbc.username=UATuser
UAT.jdbc.password=UATpwd

########## JDBC Configuration for PROD Environment ############
PROD.jdbc.driverClassName=com.mysql.jdbc.Driver
PROD.jdbc.url=jdbc:mysql://localhost:3306/portal
PROD.jdbc.username=root
PROD.jdbc.password=admin,
我這里有三套環境,分別是DEV,UAT和PROD,這種方式可以靈活切換的。

我再回答你的第二個問題:
還請你去http://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/transaction.html這里看下,很詳細,不過是英文的哦

⑸ Java涓濡備綍瀹炵幇涓庡悗鍙版暟鎹搴撶殑榪炴帴錛

鐢↗AVA榪炴帴鏁版嵁搴撲富瑕佹湁涓ょ嶆柟寮忥紝涓鏄鐢↗DBC-ODBC妗ユ潵榪炴帴錛屼簩鏄鐢ㄧ浉鍏沖巶鍟嗘彁渚涚殑鐩稿簲椹卞姩紼嬪簭鏉ヨ繛鎺ワ紝棣栧厛璋堣皥絎涓縐嶈繛鎺ャ

JDBC-ODBC妗ユ帴鍣ㄦ槸鐢↗dbcOdbc.Class鍜屼竴涓鐢ㄤ簬璁塊棶ODBC椹卞姩紼嬪簭鐨勬湰鍦板簱瀹炵幇鐨勩傚逛簬WINDOWS騫沖彴錛岃ユ湰鍦板簱鏄涓涓鍔ㄦ佽繛鎺ュ簱DLL(JDBCODBC.DLL)銆

鐢變簬JDBC鍦ㄨ捐′笂涓嶰DBC寰堟帴榪戙傚湪鍐呴儴錛岃繖涓椹卞姩紼嬪簭鎶奐DBC鐨勬柟娉曟槧灝勫埌ODBC璋冪敤涓婏紝榪欐牱錛孞DBC灝卞彲浠ュ拰浠諱綍鍙鐢ㄧ殑ODBC椹卞姩紼嬪簭榪涜屼氦浜掍簡銆傝繖縐嶆ˉ鎺ュ櫒鐨勪紭鐐規槸錛屽畠浣縅DBC鐩鍓嶆湁鑳藉姏璁塊棶鍑犱箮鎵鏈夌殑鏁版嵁搴撱傞氳屾柟寮忓傚浘鎵紺猴細

搴旂敤紼嬪簭---JDBC API---JDBC-ODBC---ODBC API---ODBC灞---鏁版嵁婧

鍏蜂綋鎿嶄綔鏂規硶涓猴細

棣栧厛鎵撳紑鎺у埗闈㈡澘鐨勭$悊宸ュ叿錛屾墦寮鏁版嵁婧愶紙ODBC錛夛紝鍦ㄧ敤鎴稤SN閲岄潰娣誨姞鏁版嵁婧愶紙鍗充綘瑕佽繛鎺ョ殑鏁版嵁搴撶殑鍚嶅瓧錛夛紝鍦ㄨ繖閲屽亣瀹氳繛鎺SQL SERVER 2000鐨凣oodsSupply鏁版嵁搴撱傚悕縐板~鍐欎綘瑕佽繛鎺ョ殑鏁版嵁搴撶殑鍚嶇О錛圙oodsSupply錛夛紝鐒跺悗閫愭ヨ劇疆錛屽傛灉閫夌敤浜嗕嬌鐢⊿QL-SERVER瀵嗙爜璁よ瘉鐨勮瘽錛屽氨瑕佽緭鍏ョ浉搴旂殑鐢ㄦ埛鍚嶅強瀵嗙爜榪炴帴鍒版暟鎹搴撱備竴璺涓嬩竴姝ヨ劇疆瀹屾垚銆

鍦↗AVA閲岄潰緙栧啓紼嬪簭榪涜屾祴璇曪紝鍦ㄨ繖閲屾垜鐨勭▼搴忔槸璁╃敤鎴瘋緭鍏ヤ換鎰忕殑琛ㄥ悕涓庝笌鍒楀悕錛屾妸璇ュ垪鐨勬墍鏈夋暟鎹杈撳嚭銆傛簮浠g爜濡備笅錛

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.*;

public class ODBCBridge {

public static void main(String[] args) {
String url="jdbc:odbc:GoodsSupply";
Statement sm=null;
String command=null;
ResultSet rs=null;
String tableName=null;
String cName=null;
String result=null;
BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
try {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //鍔犺澆椹卞姩
}catch(ClassNotFoundException e){
System.out.println("Can not load Jdbc-Odbc Bridge Driver");
System.err.print("ClassNotFoundException:");
System.err.println(e.getMessage());
}
Connection con=DriverManager.getConnection(url,"USER","PASSWORD"); //浣跨敤SQL-SERVER2000璁よ瘉
DatabaseMetaData dmd=con.getMetaData(); //DMD涓鴻繛鎺ョ殑鐩稿簲鎯呭喌
System.out.println("榪炴帴鐨勬暟鎹搴:"+dmd.getURL());
System.out.println("椹卞姩紼嬪簭:"+dmd.getDriverName());
sm=con.createStatement();
System.out.println("杈撳叆琛ㄥ悕");
tableName=input.readLine();
while(true) {
System.out.println("杈撳叆鍒楀悕(涓虹┖鏃剁▼搴忕粨鏉):");
cName=input.readLine();
if(cName.equalsIgnoreCase(""))
break;
command="select "+cName+" from "+tableName;
rs=sm.executeQuery(command); //鎵ц屾煡璇
if(!rs.next())
System.out.println("琛ㄥ悕鎴栧垪鍚嶈緭鍏ユ湁璇");
else {
System.out.println("鏌ヨ㈢粨鏋滀負:");
do
{
result=rs.getString(cName);
//鏁版嵁搴撹璦璁劇疆涓轟腑鏂囷紝涓嶇敤杞鎹㈢紪鐮
//result=new String(result.getBytes("ISO-8859-1"),"GB2312");
System.out.println(result);
}while(rs.next());
}
}
}catch(SQLException ex) {
System.out.println("SQLException:");
while(ex!=null) {
System.out.println("Message:"+ex.getMessage());
ex=ex.getNextException();
}
}catch(Exception e) {
System.out.println("IOException");
}
}
}

⑹ Spring Boot 構建多租戶SaaS平台核心技術指南

1. 概述

筆者從2014年開始接觸SaaS(Software as a Service),即多租戶(或多承租)軟體應用平台;並一直從事相關領域的架構設計及研發工作。機緣巧合,在筆者本科畢業設計時完成了一個基於SaaS的高效財務管理平台的課題研究,從中收獲頗多。最早接觸SaaS時,國內相關資源匱乏,唯一有的參照資料是《互聯網時代的軟體革命:SaaS架構設計》(葉偉等著)一書。最後課題的實現是基於OSGI(Open Service Gateway Initiative)Java動態模塊化系統規范來實現的。

時至今日,五年的時間過去了,軟體開發的技術發生了巨大的改變,筆者所實現SaaS平台的技術棧也更新了好幾波,真是印證了那就話:「山重水盡疑無路,柳暗花明又一村」。基於之前走過的許多彎路和踩過的坑,以及近段時間有許多網友問我如何使用Spring Boot實現多租戶系統,決定寫一篇文章聊一聊關於SaaS的硬核技術。

說起SaaS,它只是一種軟體架構,並沒有多少神秘的東西,也不是什麼很難的系統,我個人的感覺,SaaS平台的難度在於商業上的運營,而非技術上的實現。就技術上來說,SaaS是這樣一種架構模式:它讓多個不同環境的用戶使用同一套應用程序,且保證用戶之間的數據相互隔離。現在想想看,這也有點共享經濟的味道在裡面。

筆者在這里就不再深入聊SaaS軟體成熟度模型和數據隔離方案對比的事情了。今天要聊的是使用Spring Boot快速構建獨立資料庫/共享資料庫獨立Schema的多租戶系統。我將提供一個SaaS系統最核心的技術實現,而其他的部分有興趣的朋友可以在此基礎上自行擴展。

2. 嘗試了解多租戶的應用場景

假設我們需要開發一個應用程序,並且希望將同一個應用程序銷售給N家客戶使用。在常規情況下,我們需要為此創建N個Web伺服器(Tomcat),N個資料庫(DB),並為N個客戶部署相同的應用程序N次。現在,如果我們的應用程序進行了升級或者做了其他任何的改動,那麼我們就需要更新N個應用程序同時還需要維護N台伺服器。接下來,如果業務開始增長,客戶由原來的N個變成了現在的N+M個,我們將面臨N個應用程序和M個應用程序版本維護,設備維護以及成本控制的問題。運維幾乎要哭死在機房了…

為了解決上述的問題,我們可以開發多租戶應用程序,我們可以根據當前用戶是誰,從而選擇對應的資料庫。例如,當請求來自A公司的用戶時,應用程序就連接A公司的資料庫,當請求來自B公司的用戶時,自動將資料庫切換到B公司資料庫,以此類推。從理論上將沒有什麼問題,但我們如果考慮將現有的應用程序改造成SaaS模式,我們將遇到第一個問題:如果識別請求來自哪一個租戶?如何自動切換數據源?

3. 維護、識別和路由租戶數據源

我們可以提供一個獨立的庫來存放租戶信息,如資料庫名稱、鏈接地址、用戶名、密碼等,這可以統一的解決租戶信息維護的問題。租戶的識別和路由有很多種方法可以解決,下面列舉幾個常用的方式:

解決了上述問題後,我們再來看看如何獲取客戶端傳入的租戶信息,以及在我們的業務代碼中如何使用租戶信息(最關鍵的是DataSources的問題)。

我們都知道,在啟動Spring Boot應用程序之前,就需要為其提供有關數據源的配置信息(有使用到資料庫的情況下),按照一開始的需求,有N個客戶需要使用我們的應用程序,我們就需要提前配置好N個數據源(多數據源),如果N<50,我認為我還能忍受,如果更多,這樣顯然是無法接受的。為了解決這一問題,我們需要藉助Hibernate 5提供的動態數據源特性,讓我們的應用程序具備動態配置客戶端數據源的能力。簡單來說,當用戶請求系統資源時,我們將用戶提供的租戶信息(tenantId)存放在ThreadLoacal中,緊接著獲取TheadLocal中的租戶信息,並根據此信息查詢單獨的租戶庫,獲取當前租戶的數據配置信息,然後藉助Hibernate動態配置數據源的能力,為當前請求設置數據源,最後之前用戶的請求。這樣我們就只需要在應用程序中維護一份數據源配置信息(租戶資料庫配置庫),其餘的數據源動態查詢配置。接下來,我們將快速的演示這一功能。

4. 項目構建

我們將使用Spring Boot 2.1.5版本來實現這一演示項目,首先你需要在Maven配置文件中加入如下的一些配置:

然後提供一個可用的配置文件,並加入如下的內容:

接下來,我們需要關閉Spring Boot自動配置數據源的功能,在項目主類上添加如下的設置:

最後,讓我們看看整個項目的結構:

5. 實現租戶數據源查詢模塊

我們將定義一個實體類存放租戶數據源信息,它包含了租戶名,資料庫連接地址,用戶名和密碼等信息,其代碼如下:

持久層我們將繼承JpaRepository介面,快速實現對數據源的CURD操作,同時提供了一個通過租戶名查找租戶數據源的介面,其代碼如下:

業務層提供通過租戶名獲取租戶數據源信息的服務(其餘的服務各位可自行添加):

接下來是配置自定義的數據源,其源碼如下:

在改配置類中,我們主要提供包掃描路徑,實體管理工程,事務管理器和數據源配置參數的配置。

6. 實現租戶業務模塊

在此小節中,租戶業務模塊我們僅提供一個用戶登錄的場景來演示SaaS的功能。其實體層、業務層和持久化層根普通的Spring Boot Web項目沒有什麼區別,你甚至感覺不到它是一個SaaS應用程序的代碼。

首先,創建一個用戶實體User,其源碼如下:

業務層提供了一個根據用戶名檢索用戶信息的服務,它將調用持久層的方法根據用戶名對租戶的用戶表進行檢索,如果找到滿足條件的用戶記錄,則返回用戶信息,如果沒有找到,則返回null;持久層和業務層的源碼分別如下:

7. 配置攔截器

我們需要提供一個租戶信息的攔截器,用以獲取租戶標識符,其源代碼和配置攔截器的源代碼如下:

8. 維護租戶標識信息

在這里,我們使用ThreadLocal來存放租戶標識信息,為動態設置數據源提供數據支持,該類提供了設置租戶標識、獲取租戶標識以及清除租戶標識三個靜態方法。其源碼如下:

9. 動態數據源切換

要實現動態數據源切換,我們需要藉助兩個類來完成,和。從它們的命名上就可以看出,一個負責解析租戶標識,一個負責提供租戶標識對應的租戶數據源信息。

首先,我們需要實現介面中的()和()方法,完成租戶標識的解析功能。實現類的源碼如下:

有了租戶標識符解析類之後,我們需要擴展租戶數據源提供類,實現從資料庫動態查詢租戶數據源信息,其源碼如下:

最後,我們還需要提供租戶業務模塊數據源配置,這是整個項目核心的地方,其代碼如下:

10. 應用測試

最後,我們通過一個簡單的登錄案例來測試本次課程中的SaaS應用程序,為此,需要提供一個Controller用於處理用戶登錄邏輯。在本案例中,沒有嚴格的對用戶密碼進行加密,而是使用明文進行比對,也沒有提供任何的許可權認證框架,知識單純的驗證SaaS的基本特性是否具備。登錄控制器代碼如下:

在啟動項目之前,我們需要為主數據源創建對應的資料庫和數據表,用於存放租戶數據源信息,同時還需要提供一個租戶業務模塊資料庫和數據表,用來存放租戶業務數據。一切准備就緒後,啟動項目,在瀏覽器中輸入:http://localhost:8080/login.html

在登錄窗口中輸入對應的租戶名,用戶名和密碼,測試是否能夠正常到達主頁。可以多增加幾個租戶和用戶,測試用戶是否正常切換到對應的租戶下。

總結

閱讀全文

與java動態數據源相關的資料

熱點內容
飢荒官方伺服器怎麼初始化 瀏覽:578
蠟筆小新媽媽壓縮棉被子 瀏覽:602
pdf單頁保存 瀏覽:937
拼車小程序源碼gitlab 瀏覽:574
華為機器控制演算法專業碩士工薪 瀏覽:83
程序員游戲出包 瀏覽:28
天雲游app怎麼下載 瀏覽:261
utf8不可映射字元無法編譯 瀏覽:504
visualc編程pdf 瀏覽:649
加密獨角獸企業 瀏覽:808
天翼雲盤怎麼保存app 瀏覽:987
如何給磁碟進行加密 瀏覽:654
方舟手游如何收藏伺服器 瀏覽:519
如何自己組裝伺服器 瀏覽:95
通信加密的聊天軟體 瀏覽:298
群暉編譯包頭文件 瀏覽:132
java樹數組 瀏覽:71
編譯原理實踐與指導課程 瀏覽:891
pythonlist字元串匹配 瀏覽:318
怎麼把app轉移存儲卡 瀏覽:108