javax.sql.DataSource.

Java.sql.*

DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

  1. 基本实现 - 生成标准的 Connection 对象 – 一个DataSource数据源中,只有一个Connection ,这个不是池管理。
  2. 连接池实现 [W1] - 生成自动参与连接池的 Connection 对象。
  3. 分布式事务实现 - 生成一个 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)相关推荐

  1. 郑志远的java学习笔记

    郑志远的java学习笔记 郑志远    CCB 1         Java起源 略 2         Java语言概述 1.面向对象编程的3个原则:封装(encapsulation).继承(inh ...

  2. java学习笔记:全部,txt版本

    java学习笔记:全部,txt版本 笔者注: 1.不知道怎么上传附件,所以就把txt文本内容全部贴在这里吧. 2.已经把txt版本的笔记上传到CSDN了,我没有设置索要积分才能下载,但是不知道为什么C ...

  3. java学习笔记---5

    IO流 I〇流概述: lO:输入/输出(Input/Output) 流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的: ...

  4. Java学习笔记-Day42 HTML概述

    Java学习笔记-Day42 HTML概述 一.前端简介 二.HTML 语言 1.简介 2.HTML的编写规范 3.HTML标签的声明 4.HTML的调试 5.标记语言的特点 6.头标签head 7. ...

  5. Java学习笔记(原创)

    Java学习笔记(原创) 2011-12-01 16:37:00|  分类: Java|举报|字号 订阅 下载LOFTER客户端 基本知识 一. Java基础 1. java语言的特点: ①简单:没有 ...

  6. Java学习笔记--StringTokenizer的使用

    2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...

  7. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  8. java学习笔记11--集合总结

    java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...

  9. java学习笔记7--抽象类与抽象方法

    接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...

最新文章

  1. Python之glob模块进行文件匹配及遍历
  2. 笔试编程常用函数(Java)
  3. Java for LeetCode 061 Rotate List
  4. 【转】C#命名空间大全详细教程
  5. hdu java_HDU-java实现1176
  6. HTML5 Canvas专题
  7. 【Android】spannableStringBuilder
  8. dmg为什么下载成php,解答:dmg是什么意思,dmg文件如何打开,及怎么把dmg转换成iso
  9. java ttf_java直接使用ttf字体,解决window和linux之间的差异
  10. 微软出品的Python小白神器,真香!
  11. ios开发——图层的新建属性设置和添加
  12. PHP阅读文章送积分规则代码,php实现微信公众号文章付费阅读功能的代码分享
  13. loadrunner12录制事件一直卡在11就不动了,大佬们,求助啊!!!
  14. DirectX11 简介+环境配置
  15. netty 多线程用一个长连接(channel) 发送消息 并发安全吗?
  16. 在微软工作有多舒服?不加班,最高20天全薪年假,下班有时间玩狼人杀
  17. 洛谷B2075 幂的末尾(解决pow数据爆炸,取后n位,不足补零)
  18. java获得日期去掉横杠,python怎么去掉日期中的横杠?
  19. 车载大屏仪表用什么软件开发的
  20. 关于角色移动的几种方法

热门文章

  1. java物理架构_Java应用架构读书笔记(1):物理设计与逻辑设计
  2. 华为交换机接口允许vlan通过_VLAN工作原理之TRUNK:控制允许通过的VLAN(Allowed List)...
  3. 翻牌游戏如何打乱牌面java_如何游戏4Bet底池?
  4. 浙江大学_包家立教授计算生物学2_信源编码理论
  5. 天语手机android 4.4.4,天语 V8 4.4.4 ROM刷机包 MIUI 6 合作版
  6. linux实验二目录与文件查看相关命令,Linux文件和目录管理相关命令(二)
  7. java restclient 调用_restclient 访问 springmvc java工程接口
  8. 文字虚线怎么去掉_PS十秒钟更改图片上的文字?没问题!这个小技巧你轻松get到手「16期」...
  9. 社区发现(六)--模块度
  10. 嵌入式系——软件管理工程