JDBC方式连接数据库的弊端
- 使用JDBC方式每次调用
DriverManger.getConnection()
, 获取数据库连接都会创建一个新的数据库连接(资源消耗太大
); - 详细JDBC概念,请点击查看我的另外一篇文章
连接池
- 为了解决JDBC频繁连接数据库所造成的系统资源消耗,可以
事先创建
一些连接备用; - 当需要时,从这些连接中选择一个提供出去;
- 当连接使用完毕后,
并不是真正的关闭
,而是将这些数据状态还原,然后继续等待下一个人使用;
DataSource
- 数据源
DataSource
作为中间层
将DriverManager
生成的连接,组织
到连接池中,然后从池中提供连接
。 - DataSource中获取的连接来自于
连接池中
,而池中的连接根本
也还是从DriverManager
获取而来; - 对外呈现
DataSource
就是类似于DriverManager
的一个存在。
image.png
DataSource的形式是JNDI (Java Naming Directory Interface)
- DataSource是JNDI资源的一种;
- 可以简单的认为JNDI是一个
哈希表
,类型为<String,Object>
- JNDI的两个最主要操作:
bind
和lookup
。bind操作负责往哈希表里存对象,lookup则根据这个键值字符串往外取对象。 - 开发人员可以使用键值——也就是一个字符串名称——来获取某个对象。
- 简言之就是可以给一个对象命名,然后可以通过名称找到这个对象。
- 目前JBoss和各个数据库连接池提供了JNDI的支持。只不过数据库连接池厂商除了提供JNDI的方式外,还提供了各自更加简便的方式而已,我们目前使用的大部分是数据库连接池厂商各自简便的方式。
数据源DataSrouce的具体实现
- 关于数据源有以下几个核心的接口
-
CommonDataSource
接口定义了DataSource、XADataSource
和ConnectionPoolDataSource
之间公用的方法。 -
DataSource
是官方定义的获取connection
的接口; -
ConnectionPoolDataSource
是官方定义的从connection pool连接池
中拿connection
的接口; -
XADataSource
是定义的用来获取分布式事务连接的接口 - 也就是分为了三个方向,
基本实现,连接池,事务
;
image.png
image.png
DataSource 接口由驱动程序供应商实现。共有三种类型的实现:
- 基本实现 : 生成标准的 Connection 对象
- 连接池实现: 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
-
分布式事务实现: 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用, 分布式事务Transation对象
资源
类图如下:(可以请清晰的看到,分布式事务XADataSrouce获取XAConnection也是从数据库连接池中获取的)
image.png
总结:
- 因为JDBC每次获取连接都需要创建数据库连接,所以使用DataSource代替JDBC,应用程序使用DataSource接口方式操作数据库。
-
DataSource
用JDBC的DriverManger
方式穿件数据库连接,并讲数据库连接放入连接池中,用户获取数据库连接的时候只需要DataSource.getConnection()
从数据库连接池中获取即可。 -
DataSource
初始化的时候就默认创建多个数据库连接,放入连接池中。 - 总之一句话:DataSource作为JDBC DriverManger的替代品,它的底层实现依然是DriverManger, 只不过DataSource除了基本的数据库连接外,拥有更多的功能:
连接池,分布式事务
等。
网友评论