导航:首页 > 编程语言 > 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动态数据源相关的资料

热点内容
画世界的app叫什么 浏览:824
vc6编译时显示无法执行 浏览:546
java动态初始化数组 浏览:638
概率论与数理统计答案pdf 浏览:681
得物app上面的鞋为什么这么贵 浏览:909
如何从爱思服务器注销游戏账号 浏览:944
幼儿编程教育培训多少钱 浏览:406
经常生气有什么东西能解压 浏览:903
代理服务器地址和端口可以怎么填 浏览:65
unity5手游编译模型 浏览:268
安卓无人机app源码 浏览:811
pl1编程语言 浏览:801
台达plc编程换算指令大全 浏览:176
手机上的编程游戏 浏览:110
服务器密码机有什么用 浏览:479
dos磁盘命令 浏览:957
单片机cpu52的功能 浏览:693
opc服务器怎么开发 浏览:375
觅喜是个什么app 浏览:405
加密cd机 浏览:948