Java的c/s架构如何同时访问多个数据源

Grid++Report 6.8.6 深度解析:一款跨越C/S与B/S的全能报表开发利器 本文深度解析Grid++Report 6.8.6作为一款全能报表开发工具的核心优势与应用场景。通过统一的模板体系,它完美支持C/S与B/S架构,实现跨平台报表生成,显著提升开发效率。文章详细介绍了其四种开发模式、设计器实战技巧及医疗、工程等行业的深度适配方案,是报表开发者的理想选择。 阅读详情

在Java的C/S(客户端/服务器)架构中,实现同时访问多个数据源通常涉及后端服务器的设计和实现。下面我将分点介绍如何做到这一点,并参考相关的文章信息:

理解C/S架构:

C/S架构是一种软件体系结构,它将需要处理的业务合理地分配到客户端和服务器端。

客户端通常负责完成与用户的交互任务,而服务器则负责数据的管理。

Java与数据库的连接:

Java使用JDBC(Java Database Connectivity)技术来实现与数据库的连接。

JDBC是Java中连接数据库的标准API,可以与多个数据库引擎进行交互,如Oracle、MySQL、SQL Server等。

连接多数据源的方法:

使用Spring框架:Spring提供了AbstractRoutingDataSource类来实现动态切换数据源。可以通过继承这个类来自定义多数据源的连接。

配置数据源:为每个数据源创建DataSource对象,并配置相应的数据库连接信息,如驱动类名、URL、用户名和密码等。

实现数据源切换:在Spring中,可以通过AOP(面向切面编程)或自定义逻辑来实现数据源的动态切换。这通常涉及在请求处理过程中根据业务逻辑或配置来选择正确的数据源。

注意事项:

数据源切换的时机:确保在正确的时间点(如事务开始前)切换数据源。

事务管理:当涉及多个数据源时,需要仔细处理事务的边界和隔离级别,以确保数据的一致性和完整性。

安全性:确保连接多个数据源时遵循最佳的安全实践,如使用加密连接、验证用户输入等。

示例代码(简化版):

假设我们有两个数据源:dataSource1和dataSource2。

可以通过配置Spring的XML文件或Java配置类来定义这两个数据源。

创建一个继承自AbstractRoutingDataSource的类,并实现determineCurrentLookupKey()方法以返回当前线程的数据源标识符。

在业务逻辑中,根据需要使用相应的数据源标识符来执行数据库操作。

在Java的客户端/服务器(C/S)架构中,当服务器需要同时访问多个数据源时,通常是在服务器端进行配置和实现的。以下是一个使用Spring框架和JDBC来同时访问多个数据源的简单例子。

1. 配置数据源

首先,你需要在Spring的配置文件(XML或Java Config)中定义多个数据源。例如,这里有两个数据源:dataSource1 和 dataSource2。

XML配置示例

xml

<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <!-- 配置dataSource1的属性,如URL, 用户名, 密码等 -->

</bean>

<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <!-- 配置dataSource2的属性,如URL, 用户名, 密码等 -->

</bean>

Java Config示例

java

@Configuration

public class DataSourceConfig {

    @Bean(name = "dataSource1")

    @ConfigurationProperties(prefix = "spring.datasource.datasource1")

    public DataSource dataSource1() {

        return DataSourceBuilder.create().build();

    }

    @Bean(name = "dataSource2")

    @ConfigurationProperties(prefix = "spring.datasource.datasource2")

    public DataSource dataSource2() {

        return DataSourceBuilder.create().build();

    }

}

 

// application.properties 或 application.yml 中配置数据源属性

2. 实现动态数据源路由

接下来,你需要实现一个动态数据源路由的功能,这通常是通过继承AbstractRoutingDataSource类来实现的。

java

public class DynamicDataSource extends AbstractRoutingDataSource {

 

    @Override

    protected Object determineCurrentLookupKey() {

        // 返回当前线程的数据源标识符

        return DynamicDataSourceContextHolder.getDataSource();

    }

}

 

// 用于保存当前线程数据源标识符的Holder类

public class DynamicDataSourceContextHolder {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

 

    public static void setDataSource(String dataSource) {

        contextHolder.set(dataSource);

    }

 

    public static String getDataSource() {

        return contextHolder.get();

    }

 

    public static void clearDataSource() {

        contextHolder.remove();

    }

}

 

3. 配置动态数据源

然后,你需要配置DynamicDataSource为默认的数据源,并注入你之前定义的数据源。

XML配置示例

xml

<bean id="dataSource" class="com.example.DynamicDataSource">

    <property name="targetDataSources">

        <map key-type="java.lang.String">

            <entry key="dataSource1" value-ref="dataSource1"/>

            <entry key="dataSource2" value-ref="dataSource2"/>

        </map>

    </property>

    <property name="defaultTargetDataSource" ref="dataSource1"/>

</bean>

 

Java Config示例

java

@Bean(name = "dataSource")

public DataSource dynamicDataSource(@Qualifier("dataSource1") DataSource dataSource1,

                                    @Qualifier("dataSource2") DataSource dataSource2) {

    Map<Object, Object> targetDataSources = new HashMap<>();

    targetDataSources.put("dataSource1", dataSource1);

    targetDataSources.put("dataSource2", dataSource2);

 

    DynamicDataSource dynamicDataSource = new DynamicDataSource();

    dynamicDataSource.setTargetDataSources(targetDataSources);

    dynamicDataSource.setDefaultTargetDataSource(dataSource1);

    return dynamicDataSource;

}

 

4. 在业务代码中使用

在业务逻辑中,你可以通过设置DynamicDataSourceContextHolder.setDataSource()来选择使用哪个数据源。

java

public class SomeService {

 

    @Autowired

    private SomeRepository someRepository; // 使用dataSource的Repository

 

    public void someMethod() {

        try {

            // 切换至dataSource1

            DynamicDataSourceContextHolder.setDataSource("dataSource1");

            // 执行与dataSource1相关的操作

            someRepository.doSomething();

 

            // 切换至dataSource2

            DynamicDataSourceContextHolder.setDataSource("dataSource2");

            // 执行与dataSource2相关的操作

            someRepository.doSomethingElse();

        } finally {

            // 清除数据源,避免后续操作受影响

            DynamicDataSourceContextHolder.clearDataSource();

        }

    }

}

 

注意:这个例子是为了展示如何在Java的C/S架构中同时访问多个数据源。在实际应用中,你可能需要添加额外的错误处理、事务管理等代码来确保系统的稳定性和安全性。

 

【2021最新版】JavaOOP面试题总结(99道题含答案解析) 最近面试的小伙伴很多,对此整理了一份Java面试题手册:基础知识、Java集合/泛型面试题、Java异常面试题、Java中的IO与NIO面试题、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、SpringBoot、SpringCloud、RabbitMQ、等等。可以分享给大家学习。 【持续更新中】 阅读详情

相关推荐

C#在C/S和B/S架构下绘制曲线图表实践指南

C#(发音为“看”)是一种现代、类型安全的面向对象编程语言,由微软开发,是.NET框架的一部分。自2002年发布以来,C#就以其简洁的语法、强大的功能和灵活性,成为开发Windows桌面应用程序、Web服务和游戏开发的首选语言。在C/S架构下,WinForms应用程序通过使用.NET Framework提供的控件来构建用户界面,实现各种功能。

weixin_42298254的博客 1126

【JavaEE基础学习打卡01】不得不说的CS和BS架构!

本文将介绍JavaWeb是什么?不知道大家有没有听过JavaWeb这个词,我们将先拆开和合并去理解。它和JavaEE有啥关系呢?读了文本你大概就知道了。之后介绍架构是什么?然后详细说明C/S架构和B/S架构,以及它们的优缺点。这些都是JavaEE学习的基本常识,了解即可,无需死记硬背。

蜗牛老师,专注编程领域 1617

B/S架构在线文件管理系统开发实战

在当今信息技术快速发展的大潮中,B/S架构文件管理系统作为企业信息化管理的重要组成部分,扮演着不可或缺的角色。这种系统基于浏览器/服务器架构,用户通过Web浏览器便可访问服务器上的文件资源,实现了数据的集中存储与远程管理。与传统的C/S架构相比,B/S架构具有诸多优势,如跨平台兼容性好、易于部署和维护、用户界面统一等。本章节将探讨B/S架构文件管理系统的设计理念、基本功能以及应用价值,为后续章节深入探讨技术细节和优化策略提供理论基础。

weixin_28746457的博客 1216

SpringBoot配置多数据源 在一个接口中访问两个库的数据

SpringBoot配置多数据源

helloworld1117的博客 1762

JAVA C/S架构应用程序

用JAVA开发的一个简单桌面应用程序,实现ORACLE数据库的增删改查操作,所有操作均用存储过程实现,同时实现了Oracle 大对象BLOB 图像文件的存取,供初学者学习。

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2290

Java网络编程--C/S架构

2.1 概述 TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。 两端通信时步骤: 服务端程序,需要事先启动,等待客户端的连接。 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。 在Java中,提供了两个类用于实现TCP通信程序: 客户端:java.net.Socket 类表示。创建Socket对象,向服务...

cat marshal的博客 7350

别再只会用官网例子了!Vxe-Table过滤功能深度自定义:从下拉框到服务端筛选的完整配置流程

本文深入解析Vxe-Table表格组件的过滤功能,从基础UI定制到服务端筛选的完整实现流程。通过实战案例演示如何超越官方示例,实现下拉框、日期范围等复杂过滤交互,并详细讲解混合过滤策略与性能优化技巧,帮助开发者应对大数据量场景下的表格筛选需求。

weixin_42526353的博客 205

C/S架构与B/S架构简介

1、C/S架构 服务器-客户机,即Client-Server(C/S)结构。 C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务 应用程序分为两部分:服务器部分和客户机部分。服务器部分是多个用户共享的信息与功能, 执行后台服务,如控制共享数据库的操作等;客户机部分为用户所专有,负责执行前台功能, 在出错提示、在线帮助等方面都有强大的功能,并且可以在子程序间自由切换。 特点 一般需要在使用软件的电脑上安装特定软件 可以充分使用客户端电脑资源完成一些特定任务 可多人同时使用,并且可

qq_46028988的博客 2961

从理论到实践:使用Sigrity SystemSI完成DDR4信号完整性仿真全流程解析

本文详细解析了使用Sigrity SystemSI完成DDR4信号完整性仿真的全流程,从核心挑战到实战操作。文章深入探讨了DDR4信号完整性问题,介绍了SystemSI工具链的演进与分工,并提供了从前期准备到高级技巧的详细指南,帮助工程师有效解决DDR4设计中的信号完整性问题。

weixin_30505225的博客 508

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 871

java 网络编程--C/S

文章目录第一章 网络编程入门1.1软件结构1.2 网络通信协议1.3 协议分类**1.4 网络编程三要素**第二章 TCP通信程序2.1 概述2.2 Socket类2.3 ServerSocket类2.4 简单的TCP网络程序第三章 综合案例3.1 文件上传案例3.2 模拟B\S服务器 第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结...

myjess’s blog 548

Ghost备份还原Win10全攻略:从老电脑迁移到新硬盘,ESP分区处理是关键

本文详细介绍了使用Ghost工具将Win10系统从旧电脑迁移到新硬盘的全过程,特别强调了ESP分区的关键处理方法。通过分步指导备份、分区准备、系统还原和引导修复,帮助用户实现无缝系统迁移,解决常见问题如启动失败和驱动兼容性。

weixin_30823001的博客 672

当数字孪生进入存量时代:开发工具为何从B/S回流C/S ?~

这个项目之前是外包做的,现在要升级,代码给你,能跑起来就行。一句话,多少数字孪生开发者的噩梦开场白。当你打开代码仓库,看到杂乱的技术栈、过时的依赖、以及为了在浏览器里勉强加载超大体量模型而写的“神级”优化代码时,一种无力感会瞬间涌上心头。这不仅是技术的“屎山”,更像是在一座限重10吨的桥上,想方设法让100吨的卡车通过。前人留下的每一个补丁都透着无奈。B/S(浏览器/服务器)架构曾经几乎是数字孪生项目的“政治正确”。无需安装、扫码即用、跨平台分享…… 这些光环让它成为项目招标书上最亮眼的一行。

cimpro的博客 949

知识图谱的数据挖掘与分析

1. 背景介绍 1.1 数据挖掘的崛起 随着互联网的普及和大数据技术的发展,数据挖掘已经成为了计算机科学领域的热门研究方向。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过计算机科学、统计学、信息论等多学科交叉的方法,挖掘出有用信息和知识的过程。数据挖掘的目标是从数据中发现有

AI天才研究院 1598

Android 15.0 添加自定义服务,并生成jar给第三方app调用

在15.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能

安卓兼职framework和app工程师的博客 667

音视频 三 看书的笔记 MediaPlayer的C/S架构

就一个字 :感觉脑袋朦朦的在 Android 中,IPC 是一种允许不同进程之间进行通信的机制。由于 Android 应用程序通常在不同的进程中运行,IPC 使得这些进程能够相互发送消息、共享数据和执行操作。

weixin_41648633的博客 1296

鸿蒙ArkUI内部API10以及11开发,输入框唤起输入法键盘,页面会被顶起的解决办法

鸿蒙ArkUI内部API10以及11开发,输入框唤起输入法键盘,页面会被顶起的解决办法

zmx781284440的博客 3214

Android音视频开发入门(3)C++中MediaPlayer的C/S架构

前面一层中,都是通过Java层调用到JNI层中,而JNI层向下到C++层并未介绍。 本节首先分析Java层的一个函数在C++层MediaPlayer中的过程。(路径为:/frameworks/av/media/libmedia/mediaplayer.cpp) 下面用 mp->setDataSource() 后,从C++层的setDataSource() 来看看C/S模式的过程 status...

RikkaTheWorld 1085

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

基于C/S的网盘设计(JAVA) - 网盘源码-实现部分功能

基于C/S的网盘设计(JAVA) - 网盘源码-实现部分功能  由于有其他的工作,网盘做了一部分不得不放手了,我希望有时间的其他朋友可以继续工作,虽然网络上有很多现成的网盘代码,不过还是希望自己能做一个,并借鉴一些优秀的思想来实现,下面说下实现过程,有些部分需要改进一、数据库的设...

qq_41570968的博客 587

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

网络编程(B\S、C\S架构)

网络编程

mkhgyj6645的博客 416

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

二层与三层C/S结构详细对比表

本文对比了二层和三层C/S架构的核心差异。二层结构采用"肥客户端"模式,业务逻辑主要部署在客户端,适合小型应用但存在扩展性差、维护困难等问题。三层结构引入应用服务器层,实现业务逻辑集中管理,具有高扩展性、易维护和安全等优势,适用于大型企业系统。现代架构已发展为更细分的N层模式。结论指出三层架构是当今企业系统的首选,而二层架构仅适用于特定小规模场景,理解这一区别对掌握现代软件架构至关重要。

qq_39980997的博客 1215

Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 看下Java层一个方法在c++层 MediaPlayer后续过程 frameworks/av/media/libmedia/MediaPlayer.cpp 找一个我们之前熟悉的setDataResource方法看...

测试0901-1 179

c/s三层结构信息系统的三个层次_Java三层架构原理与作用小结

三层架构三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。概念简介1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 ...

weixin_39599317的博客 6397

【转】Java程序数据库连接,数据源配置,数据库连接池

Java程序数据库连接,数据源配置,数据库连接池Java程序,用到的数据库一定要配置数据源吗?一般写小程序直接在程序里设置连接就可以了,而大的系统一般要配置数据源数据源是要配置到中间件服务器中的(比如:Tomcat,JBoss,WebLogic一类的),配置后可以提高数据库查询性能,避免重复的打开和关闭数据库。因此开发java的B/S项目时(就是J2EE的项目,通过浏览器访问的项目),

willowind 4176

day18【网络编程,TCP通信,文件上传,模拟B/S】

【网络编程,TCP通信,文件上传,模拟B/S】第一章 网络编程入门1.1软件结构C/S结构B/S结构1.2网络编程三要素协议IP地址端口号小结1.3InetAddress类InetAddress类的概述InetAddress类的方法第二章 TCP通信程序2.1TCP概述2.2TCP协议相关的类2.3小结2.4实操--TCP通信案例12.5实操--TCP通信案例2第三章3.1综合案例3.2实操--模拟B\S服务器 扩展第四章 总结第五章 练习模块第一题第二题第三题(综合扩展)参考答案 第一章 网络编程入门

m0_46690280的博客 657
上一篇: vue-router的导入和使用
下一篇: oracle后台调用Java包的配置和例子
codemami
博客等级 码龄3年 1369粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值