2-数据源和JDBC以及连接池的关系

JDBC方式连接数据库的弊端

连接池

  • 为了解决JDBC频繁连接数据库所造成的系统资源消耗,可以事先创建一些连接备用;
  • 当需要时,从这些连接中选择一个提供出去;
  • 当连接使用完毕后,并不是真正的关闭,而是将这些数据状态还原,然后继续等待下一个人使用;

DataSource

  • 数据源DataSource作为中间层DriverManager生成的连接,组织到连接池中,然后从池中提供连接
  • DataSource中获取的连接来自于连接池中,而池中的连接根本也还是从DriverManager获取而来;
  • 对外呈现DataSource就是类似于DriverManager的一个存在。
    image.png

DataSource的形式是JNDI (Java Naming Directory Interface)

  • DataSource是JNDI资源的一种;
  • 可以简单的认为JNDI是一个哈希表,类型为<String,Object>
  • JNDI的两个最主要操作:bindlookup。bind操作负责往哈希表里存对象,lookup则根据这个键值字符串往外取对象。
  • 开发人员可以使用键值——也就是一个字符串名称——来获取某个对象。
  • 简言之就是可以给一个对象命名,然后可以通过名称找到这个对象。
  • 目前JBoss和各个数据库连接池提供了JNDI的支持。只不过数据库连接池厂商除了提供JNDI的方式外,还提供了各自更加简便的方式而已,我们目前使用的大部分是数据库连接池厂商各自简便的方式。

数据源DataSrouce的具体实现

  • 关于数据源有以下几个核心的接口
  • CommonDataSource 接口定义了DataSource、XADataSourceConnectionPoolDataSource 之间公用的方法。
  • DataSource 是官方定义的获取 connection 的接口;
  • ConnectionPoolDataSource 是官方定义的从 connection pool连接池 中拿 connection 的接口;
  • XADataSource是定义的用来获取分布式事务连接的接口
  • 也就是分为了三个方向,基本实现,连接池,事务;
    image.png

    image.png

DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

  • 基本实现 : 生成标准的 Connection 对象
  • 连接池实现: 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
  • 分布式事务实现: 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用, 分布式事务Transation对象资源类图如下:(可以请清晰的看到,分布式事务XADataSrouce获取XAConnection也是从数据库连接池中获取的)
    image.png

总结:

  • 因为JDBC每次获取连接都需要创建数据库连接,所以使用DataSource代替JDBC,应用程序使用DataSource接口方式操作数据库。
  • DataSourceJDBC的DriverManger方式穿件数据库连接,并讲数据库连接放入连接池中,用户获取数据库连接的时候只需要DataSource.getConnection()从数据库连接池中获取即可。
  • DataSource初始化的时候就默认创建多个数据库连接,放入连接池中。
  • 总之一句话:DataSource作为JDBC DriverManger的替代品,它的底层实现依然是DriverManger, 只不过DataSource除了基本的数据库连接外,拥有更多的功能:连接池,分布式事务等。

参考文章:Data Source与数据库连接池简介 JDBC简介(八)

推荐阅读更多精彩内容