简单数据库连接池实现(1)---使用动态代理绑定连接

Spring事务使用ThreadLocal绑定连接并通过动态代理增强 Spring默认的事务是自动开启的,我么们没执行一次DAO就是获取了一次连接,这样无法实现多条操作统一提交,比如转账,这时我们一种解决思路就是将connection连接与当前线程绑定,这样我们这么线程在操作时,获取的都是同一个连接。 创建连接工具类 /** * 连接的工具类,它用于从数据源中获取一个连接,并且实现和线程的绑定 */ public class ConnectionUtils { ... 阅读详情

由于一般使用的是标准的JDBC Connection,程序员由于编程习惯,可能会习惯性的调用close方法关闭连接。这样一来连接无法得到重用,数据库连接池机制形同虚设。解决这个问题的好的办法是使用Dynamic Proxy模式。

 

通过实现一个绑定到Connection对象的InvocationHandler接口实现,我们可以在Connection.close方法被调用时将其截获,并以我们自己实现的close方法将其替代,使连接返回到连接池等待下次重用,而不是直接关闭。 

(这段话来自《深入浅出Hibernate》)

1 动态代理绑定类------将动态代理绑定到连接,截取close方法,替换成连接池的回收连接方法(将连接重新放回池中)

 

package cn.kai.datasource_proxy;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.sql.Connection;

 

public class ConnectionHandler implements InvocationHandler {

private Connection realConnection;

private DBConnectionPool pool;

public ConnectionHandler(DBConnectionPool pool) {

this.pool = pool;

}

/**

* 将动态代理绑定到指定Connection

* @param conn

* @return 绑定代理后的Connection

*/

public Connection bind(Connection conn) {

this.realConnection = conn;

Connection proxyConn = (Connection)Proxy.newProxyInstance(

conn.getClass().getClassLoader(),

conn.getClass().getInterfaces(),

this);

return proxyConn;

}

/**

* 方法调用拦截器

* 判断当前调用的方法是否是close方法

* 如是,调用pool.releaseConnectin方法作为标准close方法的替代

* */

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object obj = null;

if("close".equals(method.getName())) {

pool.releaseConnection(realConnection);

System.out.println("not really closed");

}else {

obj = method.invoke(realConnection, args);

}

return obj;

}

}

 

2简单连接池代码

package cn.kai.datasource_proxy;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

 

/**

 * 使用了动态代理的简单连接池

 * @author zhangkai

 *

 */

public class DBConnectionPool {

private String url = "jdbc:mysql://localhost:3306/airline_jdbc";

private String username = "root";

private String password = "root";

/* 使用LinkedList作为连接的容器 */

private LinkedList<Connection> pool = new LinkedList<Connection>();

 

/** 初始化连接数 */

private static int init_connection_count = 5;

/** 最大连接数 */

private static int max_connection_count = 10;

/** 当前连接数 */

int current_connection_count = 0;

 

public DBConnectionPool() {

for(int i = 0; i < init_connection_count; i++) {

try {

this.pool.addLast(this.createConnection());

this.current_connection_count++;

} catch (Exception e) {

e.printStackTrace();

throw new ExceptionInInitializerError(e);

}

}

}

 

public Connection getConnection() throws Exception {

/*防止并发访问时资源冲突*/

synchronized(pool) {

if(pool.size() > 0) {

return pool.removeFirst();

}

if(this.current_connection_count < max_connection_count) {

this.current_connection_count++;

return this.createConnection();

}

throw new Exception("连接已用尽");

}

}

 

/**释放连接*/

public void releaseConnection(Connection conn) {

if(pool.size() < max_connection_count) {

this.pool.addLast(conn);

}else {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

 

/**真正创建连接的方法*/

private Connection createConnection() throws Exception {

//在JDBC工具类中加载驱动

Connection conn = DriverManager.getConnection(url,username,password);

ConnectionHandler proxy = new ConnectionHandler(this);

//返回使用了动态代理绑定的连接,在以后关闭该连接时,实际上被放回了连接池

return proxy.bind(conn);

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PCL学习笔记()——点云曲面重建 文章目录一、凸包算法二、 单纯的点云数据固然很好,但仅仅是点的话仍是不够的,因为这不利于我们后续对实体对象的渲染与各种应用,如计算实体的表面积、体积等等,所以这就需要我们对实体进行点云的曲面重建。 一、凸包算法 在计算机图形学中,凸包是指在任意维空间中包含某一有限点集P的最小凸集,它由凸包顶点构成,在二维上其表现形式为一个凸多边形,而在三维上则表现为一个凸多面体。在二维层面上来讲,最常用的凸包算法有Graham扫描法和Jarvis卷包裹法,但前者并不适用于三维层面,后者倒是可以扩展到三维。除此之外,在 阅读详情

相关推荐

2026年03月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《。订阅后可阅读专栏内所有文章。

人生就是一个不断学习的过程 280

Seata AT模式源码解析() ------ DataSourceProxy

  由于seata需要兼容现有常用的ORM框架,所以直接使用DataSourceProxy实现DataSource接口,在项目中作为数据源对象。 @Primary @Bean public DataSourceProxy dataSourceProxy(DataSource dataSource) { //持有了目标数据源对象,该DataSourceProxy构造函数,会把RootContext的DEFAULT_BRANCH_TYPE设置为BranchType.AT return new Data

qwerty的博客 1008

基于Matlab的级联型IIR滤波器设计与FPGA实现.zip

基于Matlab的级联型IIR滤波器设计与FPGA实现

SQL Server绑定连接的类型

SQL Server数据库中,提供了本地绑定连接和分布式绑定连接这两种SQL Server绑定连接的类型,希望对您能够有所帮助。 AD: SQL Server绑定连接是为了降低SQL Server锁冲突,下面就为您详细介绍SQL Server绑定连接的类型,如果您感兴趣的话,不妨一看。 SQL Server绑定连接的类型: 在SQL Server数据库

tianlianchao1982的专栏 762

一种实现数据库连接池的方法(JAVA)

数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式

longyanqian的专栏 1150

使用JAVA中的动态代理实现数据库连接池

http://www.oschina.net/question/12_4528#tags_nav 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在 互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池 都要求

qq309414557的博客 2863

Java数据库连接池

一、应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。如下图所示: 二、使用数据库连接池优化程序性能 2.1数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在...

pan_junbiao的博客 2117

心得1--自定义连接池与开源组织编写的连接池介绍

1.使用数据库连接池优化程序性能 l     应用程序直接获取链接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。 应用程序直接获取连接图解: N个用户—》service—》dao—》DB   用连接池的情况

ykblog.github.io 1503

数据库连接池实现

一、设计数据库连接池数据库连接池可以作为一个容器,在这个容器里边含有Connection(JDBC接口),可以将Connection作为一个管道,每一次线程获取Connection(获取管道)后进行数据库操作。 1、Connection的存储结构选择Linkedlist 2、线程释放管道:从Linkedlist删除该管道,通过wait-notify唤醒阻塞线程 3、线程获取管道:选择两种模式:...

洛豳枭薰 344

java基础-数据库连接池

文章目录1.1自定义数据库连接池1.2开源连接池1.2.1DBCP1.2.2C3P0 数据库连接对象创建工作,比较消耗性能。 2.一开始现在内存中开辟一块空间(集合) , 一开先往池子里面放置 多个连接对象。 后面需要连接的话,直接从池子里面去。不要去自己创建连接了。 使用完毕, 要记得归还连接。确保连接对象能循环利用。 1.1自定义数据库连接池 /** * 实现 DataS...

言凡的博客 529

数据库连接池

数据库连接池 数据库连接池是什么,有什么用? 连接池:就是创建一个容器,用于装入多个Connection对象,在使用连接对象时,从容器中获取一个Connection,使用完成后,在将这个Connection重新装入到容器中。这个容器就是连接池(DataSource) 也叫做数据源. 我们可以通过连接池获取连接对象. 优点: 节省创建连接与释放连接 性能消耗 ---- 连接池连接起到复用的作用 ...

weixin_43949154的博客 327

MyBatis原理——DataSource分析及数据库连接池实现

目录前言PooledDataSourcePoolStatePooledConnection总结 前言 前边《MyBatis原理——传统JDBC操作数据库》 提到,在MyBatis中,对于数据源DataSource有两个实现:非池化版本UnpooledDataSource和池化版本PooledDataSource。 非池化版本比较简单,和传统通过DriverManager获取数据库连接类似,只不过多了MyBatis的一些包装和校验。下边来记录下池化版本的实现。 PooledDataSource 简单看一下P

编程碎碎念 605

连接池

1连接池 问题:连接池是什么,有什么用? 连接池:就是创建一个容器,用于装入多个connection对象,在使用连接对象时,从容器中获取一个connection,使用完成后,在将这个connection重新装入到容器中。这个容器就是连接池(DataSource),也叫做数据源。 我们可以通过连接池获取连接对象, 优点:节省连接与释放连接 性能消耗–连接池连接起到复用的作用,提高程序性能 、、、...

zhoudado921的博客 1591

Hibernate5-查询与排序

1.创建项目,项目名称hibernatedemo4,目录结构如图所示2.在项目中创建lib目录存储jar文件,目录结构如图所示3.在src目录中创建实体Bean Forum,包名(com.mycompany.demo.bean),如图所示4.实体Bean Forum的内容如下packagecom.mycompany.demo.bean; publicclassFor...

weixin_34220834的博客 391

JNDI创建动态数据库连接池原理

利用JNDI创建数据库连接池可以使我们很轻松的连接数据库减少连接代码的数量,使连接更稳定,在这种连接情况下速度相对较快. 1)连接池原理一主要通过启动JBOSS时调用配置文件mssql-ds.xml寻找配置文件中的IP地址和用户密码,通过JTDS来验证验证通过的的用户将有效的对应的用户名和IP等在JAVA的命名空间中存入信息,当你写JSP文件时你只需要通过数据源DATESOURCE寻找你你定义的

萧逸闲侃 1208

D19-JDBC连接池&动态代理

1.PreparedStatement预编译对象 1.1 SQL注入 登录案例: 可以在不输入密码的情况下登录成功! String sql = &amp;amp;amp;amp;amp;quot;select * from user where username = '&amp;amp;amp;amp;amp;quot; + username + &amp;amp;amp;amp;amp;quot;' and password = '&amp;amp;amp;amp;a

御灵龍的博客 321

Weblogic常用监控指标以及监控工具小结

Weblogic常用监控指标 JMSRuntime JMSServersCurrentCount 返回当前JMS服务的连接数 ConnectionsCurrentCount 返回本JMS服务器上当前的连接数 JMSServersHighCount 返回自服务器启动后JMS服务的最大连接数 ConnectionsHighCount 返回本JMS服务器自上次重置后的最大连接

hualusiyu的专栏 1万+

动态代理实现数据库连接池功能(代理Connection的close方法)

package cn; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.DriverManager; import java.util.Li

u010644448的专栏 2784
上一篇: Tomcat 6.0配置数据源(DBCP)和JNDI使用
下一篇: Java RMI原理与使用---基础篇
ksharer
博客等级 码龄18年 13粉丝 7原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值