0%

DataSource简单了解以及使用

前言

(说起来,想要发表Java Web相关文章的时候,总是犹豫,我到底该将这些文章分类到什么标签下呢。毕竟感觉Java Web的知识也是与Java相关联的,烦恼呀,烦恼!)

回到正题,最近正好开始接触Java Web的开发学习。在完成老师课题的时候就遇到了我这个新手闻所未闻的名词 DataSource。

接下来我将简单介绍我在摸索 DataSource 时,我对 DataSource 的理解。

内容不多,虽然繁琐,但请耐心看完。

简介

DataSource中文名——数据源,是JNDI资源的一种。

简单的理解,数据源是一种数据库对编程提供的一个接口,每个数据源对应一个数据库,也就是记录是连接哪个数据库,如何连接这个数据库。

数据源包含 连接池和连接池管理两部分,习惯上也常把 DataSource 称为连接池。

连接池是什么

连接池可以比喻为一个池子,池子中存放着数据库连接对象(Connection),当用户需要访问数据库不再需要建立一个新的连接,只需从池中获取一个空闲的已建立连接的连接对象,当连接断开后,连接对象又会回到池子中。

连接池负责分配,管理,释放数据库连接对象。
注意的是: 连接池是由 容器(如Tomcat)提供,同时容器也管理连接池。

JNDI 是什么

JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中 javax.naming包,

这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的Java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。

常用的 JDBC 连接方法

往往我们在web开发使用数据库的时候,就与 DataSource 有所关联了。

(这里都将以 Mysql数据库 为例子展开讨论)

我们常用的连接数据的方法,代码如下:

1
2
3
4
5
6
7
8
String driverUrl = "com.mysql.cj.jdbc.Driver";
String connUrl = "jdbc:mysql://localhost:3306/GuestBook?serverTimezone=UTC";

String connUser = "mysqluser";
String connPwd = "123456";

Class.forName(driverUrl);
Connection conn = DriverManager.getConnection(connUrl,connUser,connPwd);

这时由 sun公司 开始封装好的方法,也是我们初学者常用到的。但是往往我们初学者常常容易在这里栽跟头,什么连接错误,找不到包之类的奇怪问题,一堆又一堆呀。

而对于 DataSource 可以不编写连接数据库的方法,直接引用 DataSource 连接的数据库的对象即可,主要用于获取 Connection 的对象。

DataSource 的优势

传统方法,我们需要频繁 连接数据库 以及 断开数据库,这个过程也是是否消耗资源。

而 DataSource 建立多个数据库连接,这些数据连接会放 入数据库连接池 中,需要使用数据库时,只需要从 数据库连接池 中获取空闲的 数据库连接对象,当数据库访问完后,又会放入 数据库连接池中。

因而使用 DataSource 在性能方面有了很多的提高。

还有利用 数据源 可以对数据库连接进行是否详细的配置,这十分有益于分布式。

很抱歉的是,更详细的我也不清楚,就由时间来逼迫我去学习吧。。

实现

首先由sun公司提供的 javax.sql.DataSource 包,对于 DataSource 接口不推荐去自行实现,数据库驱动厂商会提供相关的 DataSource 可使用。
例如 MySql 提供的 MysqlDataSource。

一般 DataSource 实现有三中:

  1. 类似 DriverManager 同样的操作。
  2. 结合连接池的使用,这也是最推荐的(可惜我目前不会)
  3. 分布式事务的实现。(我也不会。。)

简单的实现:

1
2
3
4
5
6
7
8
9
10
DataSource dataSource;
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setURL(connUrl);
mysqlDataSource.setUser(connUser);
mysqlDataSource.setPassword(connPwd);

dataSource = mysqlDataSource;

Connection conn = dataSource.getConnection();
// 之后的用法 就是简单的数据库操作了

配合连接池实现

连接池会将空闲的数据库连接对象存储起来,当有需要数据库访问的请求时,可以分配空闲对象,从而更快的连接数据库,而数据库断开连接后,又会放入连接池中。

Java中主流的数据库连接池有 C3P0 和 DBCP。

实现实例。。。。请等待更新

使用 JNDI实现访问Tomcat内置连接池

Tomcat 也有提供连接池,具体实现戳戳这里,Tomcat 配置 DataSources

结语

我也是个菜鸟,也是刚接触到 DataSource 就试着去探索了一番,但涉及到太多我没有接触到的知识,通过我的摸索简单总结了这些,希望能对看到这篇文章的人有所(些许)帮助。

还是没想清楚 到底该讲文章归为哪一类标签。。。好烦恼呀。

参考文献

感谢这些文献,非常感谢。

[1]: DataSource数据源简单理解 — 布玮博客 — https://blog.csdn.net/qq_40910541/article/details/80771607
[2]:DataSource 的理解 — predisw 博客—https://blog.csdn.net/predisw/article/details/50151849
[3]:JDBC 学习复习9 配置Tomcat数据源 —言非言 博客—https://www.cnblogs.com/humi/p/7958738.html
[4]:【Java】JAVA数据源 — 薛8 博客 —https://blog.csdn.net/xueba8/article/details/84107204