美文网首页
数据库连接池

数据库连接池

作者: MinoyJet | 来源:发表于2017-11-25 13:43 被阅读0次

1、java连接池概念

  • 背景

    当我们需要进行数据库的相关操作时,需要先创建一个java.sql.Connection对象,但是创建该对象的资源消耗非常大,设想在Web应用中,为用户的每一个请求就操作一次数据库,当有10000个在线用户并发操作的话,就计算机而言,仅仅创建Connection对象不包括做业务的时间就要损耗很多时间,对性能要求严格的应用是不能容忍这种耗费的。

  • 为什么如此浪费时间

    创建一个java.sql.Connection对象的代价是如此巨大,是因为创建一个Connection对象的过程,在底层就相当于和数据库建立的通信连接,在建立通信连接的过程,消耗了这么多的时间,而往往我们建立连接后(即创建Connection对象后),就执行一个简单的SQL语句,然后就要抛弃掉,这是一个非常大的资源浪费!

  • 解决方法,线程池

    可以在创建了Connection对象,并操作完数据库后,可以不释放掉资源,而是将它放到内存中,当下次需要操作数据库时,可以直接从内存中取出Connection对象,不需要再创建了,这样就极大地节省了创建Connection对象的资源消耗。由于内存也是有限和宝贵的,这又对我们对内存中的Connection对象怎么有效地维护提出了很高的要求。我们将在内存中存放Connection对象的容器称之为 连接池(Connection Pool)。下面让我们来看一下MyBatis的线程池是怎样实现的。

2、你使用哪个连接池?

  • 使用mybatis中的连接池
  • 在想要了解数据库连接池原理之前需要了解一个Mybatis用来存放数据库连接池状态的类:PoolStatePooledConnection 以及 PooledDataSource 类属性以及之间的关系:
  • PoolState
    • PoolState数据库连接池状态类、其内部有标识数据库连接池状态的各个属性、重点是两个属性:List<PooledConnection> idleConnections用于存放空闲状态的数据库连接。List<PooledConnection> activeConnections用于存放活动状态的连接、也就是正在使用的数据库连接。
    • PoolState内部持有一个DataSource引用、在PoolState被实例化时初始化、主要用于展示当前数据库连接的一些配置信息、比如用户名、密码等。
  • PooledConnection
    • PooledConnection内部持有一个PooledDataSource、同样在PooledConnection被构造时实例化PooledDataSource、其中有两个属性private long createdTimestamp; private long lastUsedTimestamp;用来标识当前PooledConnection的创建时间和最后使用时间、用来判断此连接是否过期。
  • PooledDataSource
    • PooledDataSource 简单的线程安全的数据库连接池、对外提供数据库连接池功能。

3、知道哪些连接池

C3P0、DBCP、......

相关文章

网友评论

      本文标题:数据库连接池

      本文链接:https://www.haomeiwen.com/subject/tmkcbxtx.html