8.数据库连接池的connection都是长连接的,以方便多次调用,多人连续使用。dataSourcePool
9.数据库连接池中的连接,是在你用完之后,返回给数据库连接池的,并不是close()掉,而是返回,以方便下次其他人使用。
10.数据库连接池会自己通过代码用心跳机制,保证随时最小的连接connection数量同时存在,利用发送空数据的方式。
11.我们平常用的数据库连接都是长连接的,因为我们每次都是从数据库连接池中去拿connection的!!!db source里都是长连接!!
12.一个Connection实例,即对应底层一个TCP链接!一个Connection实例,即对应底层一个TCP链接!
13.connection不是线程安全的!Connection不是线程安全的,它在多线程环境中使用时,会导致数据操作的错乱,特别是有事务的情况.connection.commit()方法就是提交事务,你
可以想象,在多线程环境中,线程A开启了事务,然后线程B却意外的commit,这该是个多么纠结的情况.
14.多个线程同用一个connection会不会提高效率,减少多次连接的消耗?答:不会,因为connection里,每个方法都是synchronized,都执行了同步。所以并不会提高效率。
如:
public int executeUpdate(){
synchronized(connection){
//do
}
}
15.菜鸟一般都是两种方法使用connection:1。要么就是只用一个connection,多个线程都用一个connection。2.要么就是每个方法里面创建一个connection,每次调用都创建
一个connection。
这两种都是效率低下的。
因为TCP链接的创建开支是昂贵的,当然DB server所能承载的TCP并发连接数也是有限制的.因此每次调用都创建一个Connection,这是不现实的;所以才有了数据库连接池的出现.

16.数据库连接池中保持了一定数量的connection实例,当需要DB操作的时候"borrow"一个出来,使用结束之后"return"到连接池中,多线程环境中,连接池中的connection实例交替
性的被多个线程使用.

17.数据库连接池,怎样归还connection?
Connection connection = pool.getConnection();
//do
pool.release(connection);//归还资源

18.2. 在使用dataSourcePool的情况下,一个线程中所有的DB操作使用的是同一个connection吗??
比如线程A,依次调用了2个方法,每个方法都进行了一次select操作,那么这两个select操作是使用同一个connection吗?
第一感觉就是: dataSourcePool本身是否使用了threadLocal来保存线程与connection实例的引用关系;如果使用了threadLocal,那么一个线程多次从pool中获取是同一个
connection,直到线程消亡或者调用向pool归还资源..
如果在spring环境中(或者其他ORM矿建中),这个问题需要分2种情况:事务与非事务.
在非事务场景下,一切都很简单,每一次调用,都是从pool中取出一个connection实例,调用完毕之后归还资源,因此多次调用,应该是不同的connection实例.
public List<Object> select(String sql){
Connection connection = pool.getConnection();
//do
pool.release(connection);//归还资源
}
在使用事务的场景下,情况就有所不同,开启一个新事务的同时,就会冲pool中获取一个connection实例,并将transaction和connection互为绑定,即此transaction中只会使用此
connection,此connection此时只会在一个transaction中使用;因此,在此事务中,无论操作了多少次DB,事实上只会是一个connection实例,直到事务提交或者回滚,当事务提交或
者回滚时,将会解除transaction与connection的绑定关系,同时将connection归还到pool中

//开启事务
public TransactionHolder transaction(){
Connection connection = pool.getConnection();
connection.setAutoCommit(false);
return new TransactionHolder(connection);
}//执行sql
public boolean insert(String sql,TransactionHolder holder){
Connection connection = holder.getConnection();
//do
try{
//doInsert
return true;
}catch(Exception e){
holder.setRollback(true);
}
return false;
}//提交事务
public void commit(TransactionHolder holder){
Connection connection = holder.getConnection();
connection.commit();
holder.unbind();//解除绑定
pool.release(connection);//归还资源
}

在有事务的情况上,伪代码可能就像上述例子.对于跨DB分布式事务,可能更加的复杂.

1.先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是
准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能提升的益处不言而喻。
2.注意返回给连接池后这些连接并不会关闭
3.注意返回给连接池后这些连接并不会关闭
4.注意返回给连接池后这些连接并不会关闭
5.所以数据库连接池都是长连接,数据库连接池都是长连接。因为一个连接供给很多次调用。一个连接供给多人调用。当然是长连接了。
6.数据库连接池会利用心跳机制,保证连接池中随时都有最小数量的连接connection随时存在,以随时调用。它利用心跳机制,发送少量的空数据保持连接connection不会因不
发送数据而超过timeout,进而挂掉。

7.几个概念:
最小连接--应用启动后随即打开的连接数以及后续最小维持的连接数。

本文不问思想借鉴http://blog.csdn.net/xwq911/article/details/49150043 感谢作者

创建一个数据库连接池:

public class SimplePoolDemo {//创建一个连接池private static LinkedList<Connection> pool = new LinkedList<Connection>(); //初始化10个连接static{try {for (int i = 0; i < 10; i++) {Connection conn = DBUtils.getConnection();//得到一个连接pool.add(conn);}} catch (Exception e) {throw new ExceptionInInitializerError("数据库连接失败,请检查配置");}}//从池中获取一个连接public static Connection getConnectionFromPool(){return pool.removeFirst();//移除一个连接对象}//释放资源public static void release(Connection conn){pool.addLast(conn);}
}

数据库连接池的深入理解相关推荐

  1. 【手写系列】理解数据库连接池底层原理之手写实现

    前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,再将管道放入池子中,从而避免了 ...

  2. 数据库连接池和connection的理解

    数据库连接池Data Source Pool的理解 1.数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接,避免了每个方法里new connection的耗费资源和时间. ...

  3. 对数据库连接池的理解

    对数据库连接池的理解: java操作数据库需要使用JDBC来进行操作,每次操作需要获取和数据库的一个连接,并在连接中进行操作. 但是,频繁的打开链接,关闭连接势必对系统性能造成消耗.所以,把获取连接与 ...

  4. 深入理解数据库连接池DBCP

    1.DBCP简介 DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需 ...

  5. 数据库连接池的作用及理解

    初识为什么要用连接池: 对于一个简单的数据库引用,用于对数据库的访问不是很频繁,这种情况可以简单的在需要访问数据库时,创建一个链接,用完关闭它,这样做不会有太明显的性能上的开销.但是对于复杂的数据库引 ...

  6. Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10

    问题描述: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10at com.alibab ...

  7. 数据库连接池为什么要用threadlocal呢?不用会怎样?

    点击关注公众号,Java干货及时送达 来源:blog.csdn.net/qq_42405666/article/details/108258820 这个问题我疑问了很久很久,主要如下截图. 个连接对应 ...

  8. Spring Boot 数据库连接池入门

    本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-19 目录. 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在我 ...

  9. c mysql 关闭连接池_数据库连接池关闭的时间

    上一篇说到分析关闭连接与不关闭连接的性能,到后来我发现自己得出的结论有误.经过多次测试发现关闭连接和不关闭连接耗费的时间基本一样.进哥也说了这是有连接池的原因.其实,自己以前对Ado.net了解的不深 ...

  10. java中数据库连接池_Java中的数据库连接池

    本文译自Baeldung的博客 概述 连接池是一种众所周知的数据库访问模式,主要目的是减少创建数据库连接和读/写数据库操作的开销. 简单来说,连接池本质上就是数据库连接缓存的一种实现方式,可以通过对其 ...

最新文章

  1. ImageView 常用属性的分析
  2. 计算机音乐情深深雨蒙蒙,情深深雨蒙蒙 MIDI File Download :: MidiShow
  3. 抢票神器成GitHub热榜第一,支持候补抢票,Python跑起来
  4. python包介绍:numpy
  5. Python 包管理之 poetry
  6. python编程代码执行漏洞_代码执行漏洞 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. angularjs $state.go页面不刷新数据
  8. 【Python实例第20讲】手写数字识别问题的K-Means聚类
  9. 众信金融8·28开放日:聆听投资人心声
  10. 群联PS3111坏硬盘修复记录
  11. unity虚拟摇杆控制的实现
  12. android imageview 图片模糊,imageview实现高斯模糊
  13. 微信机器自动问答机器人
  14. 树莓派 3B+/4B 连接“手机热点“或“WiFi“ 后无法上网(必解)
  15. 【优化】共轭函数(Conjugate Function)超简说明
  16. mysql注入转义绕过_SQL注入防御绕过——宽字节注入
  17. android布局空格以及首行缩进表示符
  18. 烤仔说 | Babe Babe Běibèi oh~
  19. IT外企那点儿事(15): 好员工和坏员工只有一步之遥
  20. JS快速解析Excel文件

热门文章

  1. caffe 训练solver配置
  2. Python---基础-运算符int和range函数
  3. 2017中国大学生程序设计竞赛 - 女生专场C【前后缀GCD】
  4. 7832:最接近的分数
  5. ndoejs后台查询数据库返回的值-进行解析
  6. Codeforces Round #328 (Div. 2)D. Super M 虚树直径
  7. OC中iO操作相关方法
  8. (转)Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
  9. C# webclient UploadStringAsync如何得到变量?
  10. ADO.NET访问数据集的表、行和列