java学习笔记—标准连接池的实现(27)
javax.sql.DataSource.
Java.sql.*
DataSource
接口由驱动程序供应商实现。共有三种类型的实现:
- 基本实现 - 生成标准的 Connection 对象 – 一个DataSource数据源中,只有一个Connection ,这个不是池管理。
- 连接池实现 [W1] - 生成自动参与连接池的 Connection 对象。
- 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。JTA.jar – SUN。
标准的连接池,要求:
1:实现dataSource接口。
2:声明一个集合类用于管理多个连接。
3:必须要拥有一种能力,回收连接。
4:必须要实现一个方法,getConnection以获取一个连接。
5:实现DataSource接口的类,一般不能拥有static池对象。List.
6:在一个程序中,要求只拥有一个DataSource实例就可以了。
以下是具体的实现:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; import javax.sql.DataSource; /*** 标准的连接*/ public class DBPool implements DataSource {//声明一个池管理对象private LinkedList<Connection> pool = new LinkedList<Connection>();//在初始化这个DataSourc的子类时在构造方法设置多个连接public DBPool(){try{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql:///db909?characterEncoding=UTf8";for(int i=0;i<3;i++){Connection con = DriverManager.getConnection(url,"root","1234");//将生成的这个连接。放到pool pool.add(con);}}catch(Exception e){throw new RuntimeException(e.getMessage(),e);}}public Connection getConnection() throws SQLException {return pool.removeFirst();}///其他的方法。不实现 }
2:实现连接的回收
package cn.itcast.utils;import java.io.PrintWriter; 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.sql.SQLException; import java.util.LinkedList; import javax.sql.DataSource; /*** 标准的连接*/ public class DBPool implements DataSource {//声明一个池管理对象private LinkedList<Connection> pool = new LinkedList<Connection>();//在初始化这个DataSourc的子类时在构造方法设置多个连接public DBPool(){ try{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql:///db909?characterEncoding=UTf8";for(int i=0;i<3;i++){final Connection con = DriverManager.getConnection(url,"root","1234");Object proxyedConn =Proxy.newProxyInstance(DBPool.class.getClassLoader(), new Class[]{Connection.class},new InvocationHandler() {public Object invoke(Object proxyedConnection, Method method, Object[] args)throws Throwable {if(method.getName().equals("close")){synchronized (pool) { pool.addLast((Connection) proxyedConnection);pool.notify();}return null;}//目标方法的返回值Object returnValue=method.invoke(con, args); return returnValue;}});pool.add((Connection) proxyedConn);}}catch(Exception e){throw new RuntimeException(e.getMessage(),e);}}public Connection getConnection() throws SQLException { synchronized (pool) {if(pool.size()==0){try {pool.wait();} catch (InterruptedException e) {e.printStackTrace();}return getConnection();}Connection con = pool.removeFirst();System.err.println("siize:"+pool.size());return con;}} }
转载于:https://www.cnblogs.com/zhenghongxin/p/4399132.html
java学习笔记—标准连接池的实现(27)相关推荐
- 郑志远的java学习笔记
郑志远的java学习笔记 郑志远 CCB 1 Java起源 略 2 Java语言概述 1.面向对象编程的3个原则:封装(encapsulation).继承(inh ...
- java学习笔记:全部,txt版本
java学习笔记:全部,txt版本 笔者注: 1.不知道怎么上传附件,所以就把txt文本内容全部贴在这里吧. 2.已经把txt版本的笔记上传到CSDN了,我没有设置索要积分才能下载,但是不知道为什么C ...
- java学习笔记---5
IO流 I〇流概述: lO:输入/输出(Input/Output) 流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的: ...
- Java学习笔记-Day42 HTML概述
Java学习笔记-Day42 HTML概述 一.前端简介 二.HTML 语言 1.简介 2.HTML的编写规范 3.HTML标签的声明 4.HTML的调试 5.标记语言的特点 6.头标签head 7. ...
- Java学习笔记(原创)
Java学习笔记(原创) 2011-12-01 16:37:00| 分类: Java|举报|字号 订阅 下载LOFTER客户端 基本知识 一. Java基础 1. java语言的特点: ①简单:没有 ...
- Java学习笔记--StringTokenizer的使用
2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- java学习笔记11--集合总结
java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
最新文章
- Python之glob模块进行文件匹配及遍历
- 笔试编程常用函数(Java)
- Java for LeetCode 061 Rotate List
- 【转】C#命名空间大全详细教程
- hdu java_HDU-java实现1176
- HTML5 Canvas专题
- 【Android】spannableStringBuilder
- dmg为什么下载成php,解答:dmg是什么意思,dmg文件如何打开,及怎么把dmg转换成iso
- java ttf_java直接使用ttf字体,解决window和linux之间的差异
- 微软出品的Python小白神器,真香!
- ios开发——图层的新建属性设置和添加
- PHP阅读文章送积分规则代码,php实现微信公众号文章付费阅读功能的代码分享
- loadrunner12录制事件一直卡在11就不动了,大佬们,求助啊!!!
- DirectX11 简介+环境配置
- netty 多线程用一个长连接(channel) 发送消息 并发安全吗?
- 在微软工作有多舒服?不加班,最高20天全薪年假,下班有时间玩狼人杀
- 洛谷B2075 幂的末尾(解决pow数据爆炸,取后n位,不足补零)
- java获得日期去掉横杠,python怎么去掉日期中的横杠?
- 车载大屏仪表用什么软件开发的
- 关于角色移动的几种方法
热门文章
- java物理架构_Java应用架构读书笔记(1):物理设计与逻辑设计
- 华为交换机接口允许vlan通过_VLAN工作原理之TRUNK:控制允许通过的VLAN(Allowed List)...
- 翻牌游戏如何打乱牌面java_如何游戏4Bet底池?
- 浙江大学_包家立教授计算生物学2_信源编码理论
- 天语手机android 4.4.4,天语 V8 4.4.4 ROM刷机包 MIUI 6 合作版
- linux实验二目录与文件查看相关命令,Linux文件和目录管理相关命令(二)
- java restclient 调用_restclient 访问 springmvc java工程接口
- 文字虚线怎么去掉_PS十秒钟更改图片上的文字?没问题!这个小技巧你轻松get到手「16期」...
- 社区发现(六)--模块度
- 嵌入式系——软件管理工程