MySQL学习(六)——自定义连接池
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学习(六)——自定义连接池的更多相关文章
- java自定义连接池
1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...
- JDBC连接池原理、自定义连接池代码实现
首先自己实现一个简单的连接池: 数据准备: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AU ...
- 自定义连接池DataSourse
自定义连接池DataSourse 连接池概述: 管理数据库的连接, 作用: 提高项目的性能.就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.所有的连接池必须实 ...
- JDBC连接池-自定义连接池
JDBC连接池 java JDBC连接中用到Connection 在每次对数据进行增删查改 都要 开启 .关闭 ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...
- MySQL学习(一)——Java连接MySql数据库
MySQL学习(一)——Java连接MySql数据库 API详解: 获得语句执行 String sql = "Insert into category(cid, cname) values( ...
- JDBC自定义连接池
开发中,"获得连接"和"释放资源"是非常消耗系统资源的,为了解决此类性能问题可以采用连接池技术来共享连接Connection. 1.概述 用池来管理Connec ...
- SpringBoot 整合mongoDB并自定义连接池
SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...
- MySQL学习——操作自定义函数
MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...
- JAVA自定义连接池原理设计(一)
一,概述 本人认为在开发过程中,需要挑战更高的阶段和更优的代码,虽然在真正开发工作中,代码质量和按时交付项目功能相比总是无足轻重.但是个人认为开发是一条任重而道远的路.现在本人在网上找到一个自定义连接 ...
随机推荐
- PHP配置优化:php-fpm配置解读
PHP-FPM是一个PHP FastCGI管理器,php-fpm.conf配置文件用于控制PHP-FPM管理进程的相关参数,比如工作子进程的数量.运行权限.监听端口.慢请求等等. 我们在编译安装PHP ...
- FrameLsyout
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_ ...
- Windows10 下安装 Mongodb
一.先登录Mongodb官网https://www.mongodb.com/download-center#community 下载 安装包.32.64位的都行.
- jq——DOM文档处理
内部插入:父子级关系 1 $(a).append($(b))把b插入到a里面(a里面的面后) $("div").append($("<p>段落</p&g ...
- jq——属性和方法
ps:所有元素要加上“” 属性: 1) attr:属性,元素.attr(); 获取属性 $("input").click(function(){ console.log($( ...
- 并发编程——全局解释器锁GIL
1.全局解释器锁GIL GIL其实就是一把互斥锁(牺牲了效率但是保证了数据的安全). 线程是执行单位,但是不能直接运行,需要先拿到python解释器解释之后才能被cpu执行 同一时刻同一个进程内多个线 ...
- 11、E-commerce in Your Inbox:Product Recommendations at Scale-----产品推荐(prod2vec和user2vec)
一.摘要 本文提出一种方法,将神经语言模型应用在用户购买时间序列上,将产品嵌入到低维向量空间中.结果,具有相似上下文(即,其周围购买)的产品被映射到嵌入空间中附近的向量. 二.模型: 低维项目向量表示 ...
- NodeJS加密算法(转)
nodejs中常用加密算法 1.Hash算法加密: 创建一个nodejs文件hash.js,输入内容如下: 1 var crypto = require('crypto'); //加载crypto ...
- Android开发进度06
1,今日:目标:完成后台账单的增删改查 2,昨天:用户的增删改查 3,收获:熟练了SQLite操作 4,问题:无
- 《一个民企CEO的职场阳谋》–读书总结(下)
职场是一个战场,很多人几十年在这里战斗. 职场是一个熔炉,很多人大半生在这里修炼. 如果在办公室里得不到快乐,生活就不会快乐. 如果公司里头感觉不到幸福,人生就不会幸福.(以上四句来自老刘的博客) & ...