数据库连接池dataesoruce pool深入理解
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 = ; i < ; 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);
}
}
数据库连接池dataesoruce pool深入理解的更多相关文章
- Flask(5)- Flask-Session组件、WTForms组件、数据库连接池(POOL)
一.Flask-Session 我们使用过flask内置的session,知道它是把session存放在浏览器,即客户端.今天要学习的flask-session是flask的第三方组件,看一下它和fl ...
- 数据库连接池和connection的理解
数据库连接池Data Source Pool的理解 1.数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接,避免了每个方法里new connection的耗费资源和时间. ...
- node+mysql 数据库连接池
1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- flask数据库连接池DBUtils
数据库连接池 为啥要使用数据库连接池 频繁的连接和断开数据库,消耗大,效率低 DBUtils可以创建多个线程连接数据库,且一直保持连接,不会断开 执行数据库操作时,由数据池分配线程,当数据池空时,可选 ...
- java jdbc深入理解(connection与threadlocal与数据库连接池和事务实)
1.jdbc连接数据库,就这样子 Class.forName("com.mysql.jdbc.Driver");java.sql.Connection conn = DriverM ...
- 【Druid】 阿里巴巴推出的国产数据库连接池com.alibaba.druid.pool.DruidDataSource
阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好 简单使用介绍 Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息 ...
- 理解数据库连接池和ThreadLocal实现的事务控制
我发现 不少人 误解了这两者. csdn上也有人提出过这种疑问: http://bbs.csdn.net/topics/250061733 经过查阅资料和认真分析,我特说明一下这两者概念上的区别. 我 ...
随机推荐
- URL重写及ASP.NET路由、Http处理模块、程序等
这段时间在学习ASP.NET路由.HTTP处理等内容,了解了一些,但又未完全弄懂,似是而非,不管如何,作一总结,供日后借鉴和修改. 一.IIS6和IIS7经典模式和集成模式 在IIS6及IIS7经典模 ...
- UVA1630 Folding 区间DP
Folding Description Bill is trying to compactly represent sequences of capital alphabetic characte ...
- Linux - xshell 链接CentOS 设置高亮
默认是黑白的! 用了vim 指令还是黑白的. 两种途径设置,一种是通过Alt+P. 一种是选择配色方案来设置.
- poj 2031--Building a Space Station(prim)
Building a Space Station Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6064 Accepte ...
- Java访问HTTPS时证书验证问题
为了尽可能避免安全问题,公司的很多系统服务都逐步https化,虽然开始过程会遇到各种问题,但趋势不改.最完美的https应用是能实现双向认证,客户端用私钥签名用服务端公钥加密,服务端用私钥签名客户端都 ...
- Chrome 行情抓取插件
Chrome 行情抓取插件 上班想偷偷摸摸看行情?自己动手写插件啊,尝试写了一个,新建文件夹,命名为StockMonitor,放入文件如下: 3个.png图标文件,19X19.48X48.128X12 ...
- Arduino-IIC-Wire.h
前言:Wire.h是Arduino的IIC库. 一.Wire库函数 Wire.begin() Wire.requestFrom() Wire.beginTransmission() Wire.endT ...
- JavaScript的switch循环
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- vue 子组件向父组件传值通信
父组件 子组件 子组件用this.$emit
- SQLite Tips
附加数据库 Attach database filename as database_name; 主数据库默认为 "Main", 在使用Attach命令时, 不能将database ...