1、连接池概念

用池来管理Connection,这样可以重复使用Connection。有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池,池就可以再利用这个Connection对象了。

2、自定义连接池

1)基于MySQL学习(五)——使用JDBC完成用户表CRUD的操作,把db.properties和JDBCUtils_V3.java文件复制到当前包下

2)MyConnection.java文件

装饰者设计模式,专门用于增强方法(此处如果不对close()做增强方法,用户调用conn.close()将连接真正释放,连接池将无连接可用,所以我们希望用户调用了close()方法,连接仍归还给连接池)

 //1.实现同一个接口
public class MyConnection implements Connection{
//3.定义变量
private Connection conn; private LinkedList<Connection> pool; //2.编写一个构造方法(参数使用了面向对象的多态特性)
public MyConnection(Connection conn,LinkedList<Connection> pool){
this.conn=conn;
this.pool=pool;
}
//4.书写需要增强的方法
@Override
public void close() throws SQLException {
pool.add(conn);
}
/*
* 此方法必须覆盖!否则会出现空指针异常
*/
@Override
public PreparedStatement prepareStatement(String sql) throws SQLException {
return conn.prepareStatement(sql);
}
……
}

3)MyDataSource1.java文件

创建连接池实现数据源,并实现接口javax.sql.DataSource

 public class MyDataSource1 implements DataSource{
//1.创建一个容器用于存储Connection对象
private static LinkedList<Connection> pool=new LinkedList<Connection>();
//2.创建5个连接放到容器中去
static{
for(int i=0;i<5;i++){
Connection conn=JDBCUtils_V3.getConnection();
//放入池子中的connection对象已经经过改造了
MyConnection myconn=new MyConnection(conn,pool);
pool.add(myconn);
}
}
/**
* 重写获取连接的方法
*/
@Override
public Connection getConnection() throws SQLException {
Connection conn=null;
//3.使用前先判断
if(pool.size()==0){
//3.1池子里没有,我们再创建一些
conn=JDBCUtils_V3.getConnection();
pool.add(conn);
}
//4.从池子里面获取一个连接对象Connection
conn=pool.remove(0);
return conn;
}
……
}

4)TestMyDataSource.java文件

 public class TestMyDataSource {
/*
* 添加用户
* 使用改造过后的Connection
*/
@Test
public void testAddUser1(){
Connection conn=null;
PreparedStatement pstmt=null;
//1.创建自定义连接池对象
DataSource dataSource=new MyDataSource1(); try {
//2.从池子中获取连接
conn=dataSource.getConnection();
String sql="insert tbl_user values(null,?,?)";
//必须在自定义的conntection类中重写prepareStatement(sql)语句
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "chenga");
pstmt.setString(2, "123");
int rows=pstmt.executeUpdate();
if(rows>0){
System.out.println("添加成功");
}else{
System.out.println("添加不成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//调用的release()方法中的close()其实是MyConnection的close()方法,该方法内部将当前连接归还到连接池
JDBCUtils_V3.release(conn,pstmt,null);
}
}
}

执行Junit Test,效果如下:

MySQL学习(六)——自定义连接池的更多相关文章

  1. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  2. JDBC连接池原理、自定义连接池代码实现

    首先自己实现一个简单的连接池: 数据准备: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AU ...

  3. 自定义连接池DataSourse

    自定义连接池DataSourse 连接池概述: 管理数据库的连接, 作用: 提高项目的性能.就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.所有的连接池必须实 ...

  4. JDBC连接池-自定义连接池

    JDBC连接池 java JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  .关闭  ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...

  5. MySQL学习(一)——Java连接MySql数据库

    MySQL学习(一)——Java连接MySql数据库 API详解: 获得语句执行 String sql = "Insert into category(cid, cname) values( ...

  6. JDBC自定义连接池

    开发中,"获得连接"和"释放资源"是非常消耗系统资源的,为了解决此类性能问题可以采用连接池技术来共享连接Connection. 1.概述 用池来管理Connec ...

  7. SpringBoot 整合mongoDB并自定义连接池

    SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...

  8. MySQL学习——操作自定义函数

    MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...

  9. JAVA自定义连接池原理设计(一)

    一,概述 本人认为在开发过程中,需要挑战更高的阶段和更优的代码,虽然在真正开发工作中,代码质量和按时交付项目功能相比总是无足轻重.但是个人认为开发是一条任重而道远的路.现在本人在网上找到一个自定义连接 ...

随机推荐

  1. windows下安装ImageMagick扩展

    最近项目中需要用到图片的一些特殊处理——比如:根据用户请求生成任意尺寸的图像.经过一些资料的查找,最终选用了php_imagick.利用 ImageMagick,你可以根据web应用程序的需要动态生成 ...

  2. 今天,你Try-Catch了吗?

    引言: 高级语言中的异常处理很好用,对于有可能出错的代码我们用Try-Catch包起来,就能保证系统健壮的运行了,但是你的Try-Catch用对了吗? 今天code review的时候,老板给我提了个 ...

  3. Codeforces 991E. Bus Number (DFS+排列组合)

    解题思路 将每个数字出现的次数存在一个数组num[]中(与顺序无关). 将出现过的数字i从1到num[i]遍历.(i from 0 to 9) 得到要使用的数字次数数组a[]. 对于每一种a使用排列组 ...

  4. Android ImageView 替换图片

    网上找了半天,找到的都是错的,都不是我想要的效果.我想要的是点击一个图片后,图片被替换. 通过一下方法可以实现:“v”是ImageView对象,“image_name”是替换后的图片资源 ((Imag ...

  5. input的radio根据value和name反向显示

    1.获取radio的值,是根据name设置一组单选框. 例如: <div id="sexBox"> <input type="radio" i ...

  6. kafka内外网集群配置

    linux下配置使用以第一台为例(先配置好jdk环境)1.解压kafka:2.10-0.10.1.12.修改zookeeper.properties 新增配置:maxClientCnxns=0 tic ...

  7. selenium+xpath获取href的坑

    先上HTML文档 <html> <body> <a href="http://www.example.com">Example</a> ...

  8. 异构关系数据库(Sqlserver与Oracle)之间的数据类型转换参考

    一.Oracle到SqlServer的数据类型的转变 编号 Oracle ToSqlServer SqlServer 1 BINARY_DOUBLE VARCHAR(100) real 2 BINAR ...

  9. arXiv 2015深度学习年度十大论文

    由康奈尔大学运营维护着的arXiv网站,是一个在学术论文还未被出版时就将之向所有人开放的地方.这里汇聚了无数科学领域中最前沿的研究,机器学习也包括在内.它反映了学术界当前的整体趋势,我们看到,近来发布 ...

  10. H2数据库入门使用

    H2数据库入门使用 学习了: https://www.cnblogs.com/xdp-gacl/p/4171024.html http://www.cnblogs.com/xdp-gacl/p/417 ...