数据源作用以及spring配置数据源

news/2024/7/5 1:54:18 标签: spring, java, 数据库, 数据源, 后端

数据源

数据源,简单理解为数据源头,提供了应用程序所需要数据的位置。数据源保证了应用程序与目标数据之间交互的规范和协议,它可以是数据库,文件系统等等。其中数据源定义了位置信息,用户验证信息和交互时所需的一些特性的配置,同时它封装了如何建立与数据源的连接,向外暴露获取连接的接口。应用程序连接数据库无需关注其底层是如何如何建立的,也就是说应用业务逻辑与连接数据库操作是松耦合的。 以下只讨论当数据源数据库的情况,且为Java环境下JDBC规范下的如何建立与数据库的连接,其他情况类似。

DriverManager

JDBC(Java DataBase Connectivity, 简称JDBC)是Java中用于规范应用程序如何来访问数据库的应用程序接口(API),它提供了查询和更新数据库中数据的方法。
在基于Java的应用程序中,我们需要使用JDBC驱动程序与数据库进行交互,其中最重要的一步就是获取与数据库的连接。在传统的JDBC时代,我们通常写一个通用的方法来封装与数据库的建立操作:

java">    public Connection getConnection() throws SQLException {

        Connection conn = null;
        Properties connectionProps = new Properties();
        connectionProps.put("user", this.userName);
        connectionProps.put("password", this.password);
        //获取获取连接
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + "://" +
                   this.serverName +
                   ":" + this.portNumber + "/",
                   connectionProps);
        return conn;
    }

以上的代码对于早些的程序员是再熟悉不过了,我们利用驱动管理器为应用程序提供数据库连接,虽然使用形式简单,但有个很大的问题就是:程序员需要自己去写建立连接的操作,且该方法已经与我们的应用程序是紧耦合的,在后续需要更改数据库时,需要程序员手动修改这里。在面对多数据源的情况下,该方法可能变成了简单工厂模式那种慵懒的样子,不符合设计模式中“对修改关闭,对扩展开放”的原则。

数据源

数据源是对数据库以及对数据库交互操作的抽象,它封装了目标源的位置信息,验证信息和建立与关闭连接的操作。数据源可以看做程序中一个组件,它把传统中需要在代码里编写配置信息和获取连接等操作抽象出一个规范或者接口,这样不同的第三方可以自行实现该接口提供不同的策略。这样,数据源就是对应用程序是透明的,开发者只需为应用程序配置特定的数据源即可与数据库进行连接等操作。当需要更换数据库服务器或者更换数据库种类时,只需修改配置中信息即可,无需修改程序代码。
数据源大致分为2种:不提供连接池和提供连接池管理。

不提供连接池的数据源

Spring中提供的数据源就是不提供连接池功能的,比如DriverManagerDataSource。该数据源对于应用程序的每一个连接请求都建立新的连接,当应用程序使用完毕后,再执行销毁操作。当与数据库交互频繁时,这种模式会严重影响程序的性能。时间和空间消耗大多数消耗在连接和销毁中,而非数据库处理。所以Spring建议我们仅在测试中使用该数据源。以下为原话:

Only use the DriverManagerDataSource class should only be used for testing purposes since it does not provide pooling and will perform poorly when multiple requests for a connection are made.

提供连接池的数据源

提供连接池的数据源则是第三方提供的,比较流行的有Apache Jakarta Commons DBCP and C3P0。Spring中并不提供带池化管理的数据源,它的目的在于集成市面上优秀的数据源组件。这里,提个插曲,Spring的口号就是不与市场上优秀的第三方组件竞争,而是以包容的心态为他们提供平台,方便开发者使用它们。
连接池是一种创建和管理一组连接对象的技术,这些连接对象可供任何需要它的线程使用。连接池可以极大地提高Java应用程序的性能,避免了创建新的连接实例时所必需的初始化和认证时间,同时减少整体资源使用,可以大大提高并发web的响应速度。这种数据源会在初始化的时候根据用户配置建立一组连接。当应用程序与数据库交互时,就可以快速从连接池中选择一个空闲的连接使用;当使用完毕,把该连接归还给连接池即可。

Spring配置数据源

导入druid的坐标

<!-- Druid连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>

导入mysql数据库驱动坐标

<!-- mysql驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

提取jdbc.properties配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

可以将DataSource的创建权交由Spring容器去完成

DataSource有无参构造方法,而Spring默认就是通过无参构造方法实例化对象的

DataSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
</bean>


http://www.niftyadmin.cn/n/5076641.html

相关文章

【前端设计模式】之责任链模式

引言 在前端开发中&#xff0c;我们经常需要处理复杂的请求流程&#xff0c;例如事件处理、数据验证等。这时候&#xff0c;职责链模式就能派上用场了。职责链模式允许我们将请求发送者和接收者解耦&#xff0c;并将请求沿着一个链条依次传递下去&#xff0c;直到有一个接收者…

20231009比赛总结

反思 A 构造题怎么也不会&#xff01;怒&#xff01; B 我是 s b sb sb&#xff0c;点和边的数量不一样&#xff0c;我存边的数组一般开了 M A X M MAXM MAXM&#xff0c;一半开了 M A X N MAXN MAXN&#xff0c;爆成了 40 p t s 40pts 40pts C 感觉自己很弱智&#…

感染了后缀为.faust勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 随着科技的不断发展&#xff0c;网络威胁也在不断演进。其中之一&#xff0c;被称为[support2022cock.li].faust、.[tsai.shenmailfence.com].faust勒索病毒的恶意软件威胁已经成为网络安全领域的一个重要问题。这种勒索病毒可以加密您的数据文件&#xff0c…

C++ 笔记索引

C 参考手册访问地址 环境 VS coda 配置 VS coda C、python运行与Dbug配置 C、python、VS code插件安装与SSH使用 (不推荐) w10系统一般只用vs w10系统 如何使用 C、cmake、opencv、 语言基础 C main函数 测试例子 C常用基本类型、数组、复制内存 memcpy C if、else、switc…

王杰C++day3

#include <iostream>using namespace std;class Per { private:string name;int age;int *height;int *weight; public://有参构造函数Per(string n,int a,int h,int w):name(n),age(a),height(new int(h)),weight(new int(w)){cout << "p有参" <<…

YOLOv8血细胞检测(9):SEAM注意力机制,提升遮挡小目标检测性能

💡💡💡本文改进:SEAM注意力机制,较好的解决了小目标中遮挡问题; SEAM | 亲测在血细胞检测项目中涨点,map@0.5 从原始0.895提升至0.902 收录专栏: 💡💡💡YOLO医学影像检测:http://t.csdnimg.cn/N4zBP ✨✨✨实战医学影像检测项目,通过创新点验证涨点可…

ssti 前置学习

python venv环境 可以把它想象成一个容器&#xff0c;该容器供你用来存放你的Python脚本以及安装各种Python第三方模块&#xff0c;容器里的环境和本机是完全分开的 创建venv环境安装flask #apt install python3.10-venv #cd /opt #python3 -m venv flask1 #cd /opt 选…

底部Taber的抽取

1.会抽取一个布局样式 2.布局样式里面抽取一个底部样式 这个是layout的代码 <template><view class"layout-wrapper"><view class"layout-content"><slot></slot></view><!-- 底部 --><Tabbar :activeInde…