Spring系统访问多数据库

全面掌握主流数据库JDBC驱动开发与实战 Java数据库连接(JDBC)作为Java平台访问关系型数据库的标准API,采用“接口+驱动”的设计模式,实现了数据库访问的解耦与抽象。其核心在于java.sql包中定义的一系列接口(如DriverConnectionStatementResultSet),由各数据库厂商提供具体实现。这种架构使得应用层无需关心底层数据库类型,只需面向统一接口编程。 阅读详情

Spring连接多数据库

在比较大的项目中,特别偏报表类的项目,一般会连接好多数据库,有时候需要给不同的service配置不同的数据库。

spring配置文件

applicationContext.xml

   <!-- 配置C3P0连接池的参见参数 -->

   <bean id="c3p0DataSource" abstract="true">

      <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->

      <property name="initialPoolSize" value="10" />

      <!--连接池中保留的最小连接数。 -->

      <property name="minPoolSize" value="3" />

      <!--连接池中保留的最大连接数。Default: 15 -->

      <property name="maxPoolSize" value="50" />

      <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->

      <property name="maxIdleTime" value="60" />

      <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->

      <property name="acquireIncrement" value="5" />

      <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->

      <property name="idleConnectionTestPeriod" value="60" />

   </bean>

  

   <!-- 配置一个dataSource连接数据库:最核心的数据库 -->

   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" parent="c3p0DataSource">

        <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />

        <property name="jdbcUrl" value="jdbc:oracle:thin:user/password@111:1521:F1" />

        <property name="user" value="test" />

       <property name="password" value="test" />

    </bean>

  

   <!-- 配置HIBERNATE工厂 -->

   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

      <property name="dataSource" ref="dataSource" />

      <property name="hibernateProperties">

         <props>

            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>

            <prop key="hibernate.show_sql">true</prop>

            <prop key="hibernate.format_sql">true</prop>

            <!-- 自动创建、更新、验证数据库表结构。如果不是此方面的需求建议 value=none -->

            <prop key="hibernate.hbm2ddl.auto">none</prop>

            <prop key="show_sql">true</prop>

         </props>

      </property>

   </bean>

  

   <!-- 配置JDBC连接数据库 -->

   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" abstract="false"

      lazy-init="false" autowire="default">

      <property name="dataSource" ref="dataSource" />

   </bean>

  

   <!-- 配置HIBERNATE连接数据库 -->

   <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

      <property name="sessionFactory">

         <ref bean="sessionFactory" />

      </property>

   </bean>

数据库配置文件

这里连接两种数据库

applicationContextDB.xml

<bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">

      <property name="dataSource">

         <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" parent="c3p0DataSource">

            <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />

              <property name="jdbcUrl" value="jdbc:oracle:thin:user/password@111:1521:C1" />

              <property name="user" value="app" />

              <property name="password" value="app" />

         </bean>

      </property>

   </bean>

   <bean id="jdbcTemplate2" class="org.springframework.jdbc.core.JdbcTemplate">

      <property name="dataSource">

         <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" parent="c3p0DataSource">

            <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />

              <property name="jdbcUrl" value="jdbc:oracle:thin:user/password@111:1521:a1" />

              <property name="user" value="test" />

              <property name="password" value="test" />

         </bean>

      </property>

   </bean>

配置Service文件

这里一个service连接一个数据库

applicationContextService.xml

<!-- 1.配置获取数据的Service -->

   <bean id="getDataService" class="com.cloud.impl.GetDataImple">

      <property name="jdbcTemplate" ref="jdbcTemplate" />

      <property name="hibernateTemplate" ref="hibernateTemplate" />

   </bean>

   <!-- 2.配置获取菜单的Service -->

   <bean id="getMenuService" class="com.cloud.impl.GetMenuImpl">

      <property name="jdbcTemplate1" ref="jdbcTemplate1" />

   </bean>

   <!-- 3.配置获取用户的Service -->

   <bean id="getUserService" class="com.cloud.impl.GetUserImpl">

      <property name="jdbcTemplate2" ref="jdbcTemplate2" />

   </bean>

配置定时器

这里定时器的执行规则是定点执行,秒、分、时

quart.xml

 <!-- 配置第一个定时器 -->

    <bean id="getDataClock" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

       <property name="targetObject" ref="getDataService" />

       <property name="targetMethod" value="getData" />

       <property name="concurrent" value="false" />

    </bean>

    <bean id="getDataTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

       <property name="jobDetail" ref="getDataClock" />

       <property name="cronExpression">

          <value>0 40 17 ? * *</value>

       </property>

    </bean>

    <!-- 配置第二个定时器 -->

    <bean id="getMenuClock" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

       <property name="targetObject" ref="getMenuService" />

       <property name="targetMethod" value="getMenu" />

       <property name="concurrent" value="false" />

    </bean>

    <bean id="getMenuTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

       <property name="jobDetail" ref="getMenuClock" />

       <property name="cronExpression">

          <value>0 39 17 ? * *</value>

       </property>

    </bean>

    <!-- 配置第三个定时器 -->

    <bean id="getUserClock" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

       <property name="targetObject" ref="getUserService" />

       <property name="targetMethod" value="getUser" />

       <property name="concurrent" value="false" />

    </bean>

    <bean id="getUserTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

       <property name="jobDetail" ref="getUserClock" />

       <property name="cronExpression">

          <value>0 41 17 ? * *</value>

       </property>

    </bean>

    <!-- 启动配置的定时器 -->

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

       <property name="triggers">

          <list>

             <ref bean="getDataTrigger"/>

             <ref bean="getMenuTrigger"/>

             <ref bean="getUserTrigger"/>

          </list>

       </property>

    </bean>

</beans>

连接数据库封装

package com.cloud.Common;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.orm.hibernate3.HibernateTemplate;

public class BaseJdbcSupport {

   private HibernateTemplate hibernateTemplate;

   private JdbcTemplate jdbcTemplate;

   public HibernateTemplate getHibernateTemplate() {

      return hibernateTemplate;

   }

   public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

      this.hibernateTemplate = hibernateTemplate;

   }

   public JdbcTemplate getJdbcTemplate() {

      return jdbcTemplate;

   }

   public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

      this.jdbcTemplate = jdbcTemplate;

   }

}

定时器执行代码

package com.cloud.impl;

import java.util.List;

import com.cloud.Common.BaseJdbcSupport;

public class GetDataImple extends BaseJdbcSupport{

   @SuppressWarnings("rawtypes")

   public void getData(){

      List list = this.getJdbcTemplate().queryForList("select t.*, t.rowid from AP_USER t where t.user_code='B11302246'");

      System.out.println("查询数据库一:"+list);

   }

}

package com.cloud.impl;

import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;

public class GetMenuImpl {

   private JdbcTemplate jdbcTemplate1;

   public JdbcTemplate getJdbcTemplate1() {

      return jdbcTemplate1;

   }

   public void setJdbcTemplate1(JdbcTemplate jdbcTemplate1) {

      this.jdbcTemplate1 = jdbcTemplate1;

   }

   @SuppressWarnings("rawtypes")

   public void getMenu(){

      List list = this.getJdbcTemplate1().queryForList("select t.*, t.rowid from AP_MENU t where t.menu_name='揽收报表'");

      System.out.println("查询数据库二:"+list);

   }

}

package com.cloud.impl;

import org.springframework.jdbc.core.JdbcTemplate;

public class GetUserImpl {

   private JdbcTemplate jdbcTemplate2;

   public JdbcTemplate getJdbcTemplate2() {

      return jdbcTemplate2;

   }

   public void setJdbcTemplate2(JdbcTemplate jdbcTemplate2) {

      this.jdbcTemplate2 = jdbcTemplate2;

   }

   public void getUser(){

      int count = this.jdbcTemplate2.queryForInt("select count(*) from D_USER");

      System.out.println("查询数据库三:"+count);

   }

}

FPGA高速接口Aurora8B/10B协议实战:从IP核配置到数据流优化 本文详细介绍了FPGA高速接口Aurora8B/10B协议的实战应用,从IP核配置到数据流优化的全流程。通过Aurora8B/10B协议,开发者可以在FPGA间实现高效的数据传输,适用于高速接口设计。文章涵盖了协议基础、IP核配置、AXI4-Stream接口实战技巧以及性能优化策略,帮助读者快速掌握这一关键技术。 阅读详情

相关推荐

【STM32开源实战】基于STM32的智能输液监控系统设计与实现

本文详细介绍了基于STM32F103C8T6主控芯片的智能输液监控系统设计与实现。该系统通过光学液位传感器、温度传感器和红外滴速检测模块实时监测输液状态,利用步进电机自动调节滴速,并通过蓝牙实现数据远程传输,为医院提供了一套低成本、高可靠性的智能输液解决方案。

h6i7j8的博客 761

SQL Server 不同数据间建立链接服务器进行连接查询

在平时查询以及导数据时,经常会遇到需要使用两个数据库里数据的情况,这时就会用到在两个服务器之间建立一个链接,进行操作,脚本语句如下: 举例:例如你在测试服务器上想要查询业务库里的数据信息,此脚本就需要在测试服务器上执行,输入业务服务器的IP地址、业务服务器的账户、密码,然后执行语句即可;反之,如果你需要将测试数据库的数据导入正式库内,就需要在正式库内建立可以连接到测试库的链接。 --创建...

254

cesium自定义指南针

项目需要一个指南针,用鼠标按住旋转指针,会让3d地图旋转,点击中心点重置方位。当然可以使用插件cesium-navigation-es6,但是样式不好修改,所以我自定义了一个指南针。

weixin_47017648的博客 750

Spring整合Mybatis案例,查询数据库中的信息

spring整合mybatis

weixin_51603093的博客 404

学习C++的递归函数(包含汉诺塔讲解)

简单来讲,递归函数就是函数本身自己调用自己,那么函数又是什么呢?#include <stdio.h> //这行是头文件,不同的头文件可以用不同的函数int main() //这里就是一个main函数//这里是你要编写程序的内容return 0;(这是个小细节如下)所以我们平时用来练习的就是一个main函数,而且是一个整型类型的函数,而这也是最后一句话为什么要加一句 return 0;了,因为它最后要返回整数类型,其它整数也可以,但是大家规定为0,这是C++自带的函数。

2302_81032013的博客 2594

Android开发者必看:F2FS文件系统如何优化你的手机存储性能(附实测数据对比)

本文深入解析了F2FS文件系统如何针对闪存特性优化Android设备存储性能。通过对比ext4,F2FS采用追加写和冷热数据分离策略,将随机写转化为顺序写,显著提升写入速度并减少GC卡顿。实测数据显示,其在随机写入和SQLite事务等场景下性能提升显著,为开发者提供了优化应用IO性能的关键思路。

weixin_29248313的博客 325

Spring中从数据库中查询数据在启动时注入到bean属性中

Spring依赖注入

qq_45968950的博客 1358

【前端HTML生成条形码——MQ】

本文将展示前端HTML如何根据用户输入内容生成对应的条形码,附HTML和JS代码。代码如下(示例):

weixin_42588676的博客 1955

dao加service加mysql实例_使用Spring框架进行数据库增删改查入门(service层和dao层练习)...

大体步骤:1. 引入依赖2. 建表3.创建实体类4. 创建dao层接口 和 接口实现类5.创建service层接口 和 接口实现类5.编写配置文件6. 编写测试类第一步:引入依赖文件主要引入以下jar包:所需要的jar包分别是:springContext (spring 上下文包)、mysql-connector-java(连接数据库包)、c3p0(c3p0连接池工具类包)、comm...

weixin_34080081的博客 870

Vivado固化程序与Flash型号添加实战指南

本文详细介绍了Vivado程序固化到Flash芯片的完整流程,包括基础操作、Flash型号添加方法及疑难问题排查。针对Vivado官方支持列表缺失的Flash型号,提供了手动添加配置的详细步骤和参数说明,并分享了高级技巧与安全操作建议,帮助开发者高效完成FPGA程序固化。

weixin_29291573的博客 566

c++通过自然语言处理技术分析语音信号音高

其中,缓冲区大小为2048,最小基频为80Hz,最大基频为1000Hz。通常情况下,音高在85Hz到255Hz之间,因此可以根据实际情况修改最小和最大基频值。C++中可以使用数字信号处理库或语音处理库,比如MATLAB、Praat、YIN算法等等来进行音高分析。对于语音信号的音高分析,可以使用基频提取技术。基频是指一个声音周期的重复率,也就是一个声音波形中最长的周期。通常情况下,人的声音基频范围是85Hz到255Hz。这段代码使用了YIN算法来计算语音信号的基频,得出的结果即为音高。

SYC20110120的博客 1728

在一个Spring事务里完成对两个数据源的操作

在一个Spring事务里完成对两个数据源的操作

Xzw_jsu的博客 2066

详解舵机的基本原理以及控制方法

文章目录什么是舵机?伺服控制硬件连接舵机规格SG90MG90SMG996R总结 什么是舵机? 舵机是伺服电机的一种,伺服电机就是带有反馈环节的电机,我们可以通过伺服电机进行精确的位置控制或者输出较高的扭矩; 舵机也叫也叫 RC 伺服器,通常用于机器人项目,也可以在遥控汽车,飞机等航模中找到它们。 类似舵机这样的伺服系统通常由小型电动机,电位计,嵌入式控制系统和变速箱组成。 电机输出轴的位置由内部电位计不断采样测量,并与微控制器(例如STM32,Arduino)设置的目标位置进行比较; 根据相应的偏差,控制

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 4万+

Springboot JPA实现多数据源配置

要实现一个MES系统的web-API接口,MES系统是购买的商业软件,厂商的接口报价过高,因此由内部IT团队开发实现这个接口。考虑到系统的追溯性,因此设计一个中间库,第三方报工系统传过来的数据同时存放在中间库和MES系统里。搜索查阅了很多博文及实验后,终于实现了多数据库的访问,调试时遇到了几个问题,在搜索后也找到了解决方案并修正。这样就完成了多数据源的配置,以后在相应的db目录下创建相关的entity和repository。

随心居 1017

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring + iBatis 的多库横向切分简易解决思路

1.引言    笔者最近在做一个互联网的“类SNS”应用,应用中用户数量巨大(约4000万)左右,因此,简单的使用传统单一数据库存储肯定是不行的。    参考了业内广泛使用的分库分表,以及使用DAL数据访问层等的做法,笔者决定使用一种最简单的数据源路由选择方式来解决问题。    严格的说,目前的实现不能算是一个解决方案,只能是一种思路的简易实现,笔者也仅花了2天时间来完成(其...

xiangxingchina 115

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

企业级后台管理系统架构深度解析:基于Spring Boot与Layui的权限控制实践

在当今企业数字化转型的浪潮中,如何构建一个稳定、安全且易于扩展的后台管理系统成为了技术团队面临的核心挑战。layui-admin项目基于Spring Boot框架与layui2.x前端组件库,为企业级后台管理系统提供了一个完整的解决方案。该系统不仅实现了标准的RBAC权限控制模型,还通过Shiro安全框架构建了多层次的安全防护体系,显著降低了企业级应用的开发成本和维护复杂度。 ## 技术架构设计

gitblog_00870的博客 142

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MyBatis 核心概念与应用场景

数据分页与导出:结合动态 SQL 与分页插件,便捷实现分页查询、数据导出。它的核心优势:SQL 解耦:将 SQL 语句与业务代码分离,便于维护、优化与迭代灵活可控:手写原生 SQL,支持复杂联表、分页、多条件动态查询轻量易用:架构简洁、侵入性低,学习成本低,适配各类项目架构结果映射:自动完成实体类与数据库字段映射,减少手动封装动态 SQL:支持标签拼接条件,快速实现多条件组合、模糊查询生态兼容:完美整合 Spring、SpringBoot,适配 MySQL、Oracle 等多种数据库。

2603_94889722的博客 252

Spring Data Relational测试策略:单元测试与集成测试最佳实践

Spring Data Relational作为Spring生态中处理关系型数据库的核心项目,包含Spring Data JDBC和Spring Data R2DBC两大模块,为开发者提供了简洁高效的数据访问解决方案。本文将深入探讨该项目的测试策略,帮助开发者掌握单元测试与集成测试的最佳实践,确保数据访问层代码的可靠性和稳定性。 ## 测试体系概览:构建多层次测试防线 Spring Data

gitblog_00579的博客 491

基于Springboot房屋租赁系统14eo9g36(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

研究意义 社会价值:通过系统实现房源真实核验、电子合同签约、租金支付追踪等功能,可降低租客维权成本40%,减少中介纠纷60%。 经济价值:系统可帮助房东提升出租效率3倍,降低空置率至8%以下,以100套房源计算,年增收可达12万元。 技术价值:探索Spring Boot在复杂业务场景下的微服务架构实践,为房地产信息化提供可复制的技术方案。

2509_93103891的博客 1301

基于vue的慢性病管理系统i0q3x(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末

通过 Vue、Spring Boot、MySQL 等技术,设计并实现一套 “功能完整、交互流畅、数据安全” 的慢性病管理系统,具体目标如下: 实现慢性病患者线上健康数据记录(用药、饮食、运动、生理指标)与自我管理; 支持医护人员在线查看患者健康数据、制定随访计划、推送健康指导; 为管理员提供患者规模、随访完成率、病情控制情况等数据统计与可视化分析; 确保系统前端适配电脑、手机、平板等多设备,操作便捷,满足不同角色使用需求。

2509_93101891的博客 1157

Springboot新能源科普网站i5ghr本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

项目功能:用户,书籍分类,科普书籍,科普文章。

a55559595959的博客 938

第21章 2012真题作文

论企业应用系统的数据持久层架构设计数据持久层(Data Persistence Layer)通常位于企业应用系统的业务逻辑层和数据源层之间,为整个项目提供一个高层、统一、安全、并发的数据持久机制,完成对各种数据进行持久化的编程工作,并为系统业务逻辑层提供服务。它能够使程序员避免手工编写访问数据源的方法,使其专注于业务逻辑的开发,并且能够在不同项目中重用本框架,这大大简化了数据的增加、删除、修改、查询功能的开发过程,同时又不丧失多层结构的天然优势,继承延续应用系统架构的可伸缩性和可扩展性。

年轻即出发, 420

『Spring.Net』为什么使用?

为什么80%的码农都做不了架构师?>>> ...

weixin_34309543的博客 145

Spring Data Relational多数据库支持:MySQL、PostgreSQL、Oracle实战指南

Spring Data Relational作为Spring Data家族的重要成员,为Java开发者提供了强大的多数据库支持能力。这个框架简化了关系型数据库的访问,支持包括MySQL、PostgreSQL、Oracle在内的多种主流数据库,让开发者能够轻松构建高效的数据访问层。💪 ## 为什么选择Spring Data Relational?🤔 Spring Data Relationa

gitblog_00024的博客 821

在spring中配置多数据库读取

在应对大量用户读取的系统中,对数据库的操作通常采用读写分离方式,往一个数据库写入,然后通过复制将数据同步到另外的多个数据库中,读操作都从这些数据库中操作,在采用spring来配置多数据库时,并不能直接支持从多个DataSource中获得数据库连接,为此需要开发一个DataSource的代理,代理实现javax.sql.DataSource接口。该代理根据一定的策略从已有的多个DataSource中

indexchen的专栏 7847

使用Spring Boot实现Redis多数据库缓存

在我的系统中,为了优化用户行为数据的存储与访问效率,我引入了Redis缓存,并将数据分布在不同的Redis数据库中。通过这种方式,可以减少单一数据库的负载,提高系统的整体性能。

行东的bug博客笔记 1025
上一篇: Java系统中时间封装处理
下一篇: Target runtime Apache Tomcat v6.0 is not defined
午-夜
博客等级 码龄12年 95粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值