数据库连接池

数据库连接池
当没有使用数据库连接池的时候应用程序直接获取链接,用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天 10 万访问量,数据库服务器就需要创建 10 万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
连接池原理:
在服务器端一次性创建多个多个连接,将多个连接保存在一个连接池对象中,当请求需要操作数据库时,不会请求创建新的连接,而是直接从连接池中获得一个连接,操作数据库结束,并不需要真正关闭连接,而是将连接放回到连接池,在连接池使用饱和时,多余的请求会进入队列等待连接的释放。

编写连接池需要实现 javax.sql.DataSource 接口
DataSource 接口中定义了两个重载的 getConnection 方法:
Connection getConnection()
Connection getConnection(String?username, String?password) 实现 DataSource 接口,并实现连接池功能的步骤:在 DataSource 构造函数中批量创建与数据库的连接,并把创建的连接保存到一个集合对象中 实现 getConnection 方法,让 getConnection 方法每次调用时,从集合对象中取一个 Connection 返回给用户。 当用户使用完 Connection,调用 Connection.close() 方法时,Collection 对象应保证将自己返回到连接池的集合对象中, 而不要把 conn 还给数据库。

java 增强原有方法的三种途径
1,继承复写,必须控制对象的创建,
2,装饰模式,前提装饰类与被装饰类必须实现同一个接口或者继承同一个父类。装饰类构造函数参数接收被装饰类对象
3,动态代理,进行方法增强的最常用模式,较为灵活,根据源对象在内存中构造一个代理对象,源对象所有方法都将执行代理对象 invoke 方法。

在实际开发中并不会要求自己编写数据库连接池,会使用一些开源免费的数据库连接池。
Apache commins-dpcp 连接池
将 dpcp 和 pool 的 jar 包复制在 web-inf 下的 lib 目录进行导包

1,创建连接池使用 BasicDataSource 核心类,
BasicDataSource basicDataSource= new BasicDataSource();
2,连接池中创建连接
basicDataSource.setDriverClassName("");
basicDataSource.setUrl("");
basicDataSource.setUserNmae("");
basicDataSource.setPassword("");
3,从连接池中获取连接
Connection conn=basicDataSource.getConnection();

 


从这里可以看出开源数据库连接池的使用并没有简化代码,但是在内部实现时优化了性能。
继续增加扩展性可以将参数写入配置文件并编写 utils 工具类。
参数配置文件读取方式

Properties properties=new Properties();
properties.load(new FileInputStream(this.getClass().getResource("url").getFile()));
DataSource basicDataSource=BasicDataSourceFactory.createDataSource(properties);

 

c3p0 数据库连接池的使用此处不深入学习
Tomact 内部提供的数据库连接池
tomact 内部连接池就是 dbcp
Tomcat 并不支持所有的 JavaEE 规范,要使用内置的 dbcp 需要通过 JNDI 技术

<Context> 
<Resource name="jdbc/datasource" auth="Container" 
type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" 
url="jdbc:mysql://localhost:3306/jdbc"
maxActive="8" maxIdle="4"/> 
</Context>

 


1,在 tomcat 安装目录 /conf/context.xml 中进行配置对 tomcat 内部所有虚拟主机中任何工程都有效
2,在 tomcat 安装目录 /comfig/Catalina/ 虚拟主机目录 /context.xml 配置对当前虚拟主机任何工程都有效
3, 在 web 工程根目录 /meta-inf/context.xml 配置只对当前工程有效。
用 JNDI 访问连接池原理
1,将一个 java 对象,绑定在 JNDI 容器中,为 java 对象起一个名字
2,java 程序通过名字检索到该对象并调用。
访问具体过程
1,配置 context 文件
2,tomcat 启动时自动加载配置文件,根据配置文件创建连接池
3,为连接池对象绑定名称
4,通过名称检索访问被绑定对象
核心 APIContext,javax.naming.Context 接口。
注意事项
1,tomcat 连接数据库,而非自己工程连接数据库,所以需要将驱动 jar 包复制在 tomcat/lib 目录下
2,Java 程序通过 JNDI 访问对象 ---- 该 java 程序必须运行在同一个 JDNI 容器中,所以该 java 程序通常是 Servle 或者 Jsp 等运行在 tomcat 内部的程序。

//创建检索对象
Context initCtx=new InitialContext();
//默认查找顶级 java 名称串,固定为 "java:comp/env"
Context envCtx=(Context)initCtx.lookup("java:comp/env");
//根据名称设置查找连接池对象
DataSource ds=(DataSource)envCtx.lookup("jdbc/TestDB");
//或得连接池中的一个连接
Connection conn=ds.getConnection();