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