博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库连接池
阅读量:2387 次
发布时间:2019-05-10

本文共 2216 字,大约阅读时间需要 7 分钟。

数据库连接池的实现原理
  • 早期数据库操作

1.原理:一般来说,java应用程序访问数据库的过程是:

①装载数据库驱动程序;

②通过jdbc建立数据库连接;

③访问数据库,执行sql语句;

④断开数据库连接。

  • 数据库连接池

编写class实现DataSource接口

class构造器一次性创建10个连接,将连接保存LinkedList

实现getConnectionLinkedList返回一个连接

提供将连接放回连接池中方法

  • 连接池考虑更多问题

并发问题

多数据库服务器和多用户

事务处理

连接池的分配与释放

连接池的配置与维护

  • 成熟的开源连接池

dbcp

c3p0

参考网址http://blog.csdn.net/shuaihj/article/details/14223015

几种常见数据库连接池

http://blog.csdn.net/m0_37893932/article/details/73930014?locationNum=3&fps=1

http://blog.csdn.net/sosfnima/article/details/52825640

背景

如果是一个简单的应用,对于数据库的访问不频繁,当我们访问数据库时,就新建一个连接,用完后就关闭。这样不会带来性能上的明显开销。但是对于一个复杂的数据库应用,频繁的建立、关闭连接,会极大降低系统的性能。

数据库连接池正是为了解决资源频繁分配、释放所造成的问题。它提供一套高效的连接分配、使用策略,最终目标是实现连接的高效和安全的复用。

是什么

连接池是创建和管理多个连接的技术。数据库连接池是在应用程序启动时,建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应在请求队列中排队等待。而且,应用程序可根据池中连接的使用率,动态增加或减少池中的连接数。

当关闭操作时,连接并不是真正的关闭,而是返回到连接池中作为空闲连接在后面继续使用。

作用

有了连接池,我们就没必要直接与数据源打交道了,连接池在你的程序所在的机器内存,数据源不一定,并且数据源和连接池会保持一定数量的连接。这样我们访问数据库的时候,就不需要找数据源要连接,直接在本地内存中取得连接,可以提高程序的性能。

连接池的存在是为了效率,因为实例化一个连接很耗费资源,而连接又有可重用的特征,所以可以把一定数量的连接放在连接池里以提高效率

优点

1、资源重用

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

2、更快的系统响应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

3、统一的连接管理,避免数据库连接泄露

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。一个最小化的数据库连接池实现。

1 :直连数据库方式

当调用DataSource.getConnection()时,其实它调用的是DriverManager.getConnection(url, user, password)来获取一个Connection,Connection使用完后被close,断开与数据库的连接,我们称这总方式是直连数据库,因为每次都需要重新建立与数据库之间的连接,而并没有把之前的Connection保留供下次使用.

2:池化连接方式 

1.可以说这种方式就是使用了连接池技术.DataSource内部封装了一个连接池,当你获取DataSource的时候,它已经敲敲的与数据库建立了多个Connection,并将这些Connection放入了连接池,此时调用DataSource.getConnection()它从连接池里取一个Connection返回,Connection使用完后被close,但这个close并不是真正的与数据库断开连接,而是告诉连接池"我"已经被使用完,"你"可以把我分配给其它"人"使用了.就这样连接池里的Connection被循环利用,避免了每次获取Connection时重新去连接数据库

对DataSource的两种实现方式已经介绍完毕,现在知道DataSource与连接池之间的是关系而不是区别了吧,因为DataSource与连接池根本就不是同一类型的东西,只有同一类型的东西才存在区别,例如:oracle与db2都是数据库,它们才存在区别

DataSource与连接池的关系是:DataSource利用连接池缓存Connection,以达到系统效率的提升,资源的重复利用

而连接池它可以单独存在,不需要依靠DataSource来获取连接,你可以直接调用连接池提供的方法来获取连接

目前大多数应用服务器都支持池化连接方式的DataSource

一般场景:JNDI-> DataSource->连接池(c3p0,dbcp,Proxool等)->DriverManager->connection

你可能感兴趣的文章
安全工具集合
查看>>
Metasploit 3.3 Development Updates
查看>>
Windows Services for UNIX Version 3.5
查看>>
Linux 测试工具
查看>>
Modifying SSH to Capture Login Credentials from Attackers
查看>>
nikto 2.1 coming
查看>>
How to own a Windows Domain
查看>>
Longcat – multi-protocol stress testing tool
查看>>
数据流0day原理+实践
查看>>
淺談以STIX實現網路威脅情報標準化框架
查看>>
Top IT management trends - the next 5 years
查看>>
推荐 OWASP - Transport Layer Protection Cheat Sheet
查看>>
AutoNessus v1.3.2 released
查看>>
hack tools
查看>>
rhel5中管理swap空间
查看>>
/proc filesystem allows bypassing directory permissions on Linux
查看>>
nginx dos
查看>>
RASP解决方案包括开源方案
查看>>
Linux下共享文件系统文件传输的简单设计(转载)
查看>>
点评Ubuntu下的文件安全删除工具
查看>>