1. package com.itheima.datasource;
  2.  
  3. import java.io.PrintWriter;
  4. import java.lang.reflect.InvocationHandler;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7. import java.sql.Connection;
  8. import java.sql.SQLException;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. import javax.sql.DataSource;
  13.  
  14. import com.itheima.utils.JdbcUtil;
  15.  
  16. /**
  17. * 引入Sun标准数据源接口 为了更多的人去用
  18. * DataSource :javax.sql.DataSource
  19. *
  20. * @author wangli
  21. *
  22. */
  23. public class MyDataSource3 implements DataSource {
  24. public static List<Connection> pool = new ArrayList<Connection>();//池子
  25. private static int size=10;
  26. public static void setSize(int size) {
  27. MyDataSource3.size = size;
  28. }
  29.  
  30. //初始化池中的连接
  31. static{
  32. try {
  33. for (int i = 0; i < size; i++) {
  34. pool.add(JdbcUtil.getConnection());
  35. }
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39.  
  40. }
  41.  
  42. //统一提供方法,用于从池中获取连接
  43. public synchronized Connection getConnection(){
  44. if(pool.size()>0){
  45. final Connection con = pool.remove(0);//删除这个连接,因为别人不能此时不能再用它 final 用匿名内部类里 con代表数据连接池里的池连接接口
  46.  
  47. //代理模式 JDK自带的相应代理相关类
  48. //Proxy动态代理相关类
  49. //Proxy
  50. // newProxyInstance(ClassLoader cl,Class<?>[] interfaces,InvocationHandler ih)
  51. // ClassLoader :代表类加载器 被代理的对象用什么类加载器,代理对象就要用什么加载器
  52. //interfaces :代表所实现的接口,被代理对象实现什么接口,代理对象就要实现什么接口
  53. //InvocationHandler 处理器 就是要处理相关的緢节问题 一般有一个匿名内部类
  54. //InvocationHandler 策略模式
  55. Connection proxyConn = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(), con.getClass().getInterfaces(),
  56. new InvocationHandler() {
  57.  
  58. @Override
  59. public Object invoke(Object proxy, Method method, Object[] args)
  60. throws Throwable {
  61. if("close".equals(method.getName())){
  62. //对于close方法要改写 添加到池中
  63. return pool.add(con);//加入池中
  64. }else{
  65. //对于其它方法,用mysql的connection对象的底层实现
  66. return method.invoke(con, args); 被代理对象和,被代理对象的方法里的参数
  67. }
  68. }
  69. }
  70. );
  71. return proxyConn;
  72. }else{
  73. throw new RuntimeException("池中无连接");
  74. }
  75.  
  76. }
  77.  
  78. //还回一个连接到池中
  79. public static void close(Connection con){
  80. pool.add(con);//将这个连接回收到池中
  81. }
  82.  
  83. @Override
  84. public PrintWriter getLogWriter() throws SQLException {
  85. // TODO Auto-generated method stub
  86. return null;
  87. }
  88.  
  89. @Override
  90. public void setLogWriter(PrintWriter out) throws SQLException {
  91. // TODO Auto-generated method stub
  92.  
  93. }
  94.  
  95. @Override
  96. public void setLoginTimeout(int seconds) throws SQLException {
  97. // TODO Auto-generated method stub
  98.  
  99. }
  100.  
  101. @Override
  102. public int getLoginTimeout() throws SQLException {
  103. // TODO Auto-generated method stub
  104. return 0;
  105. }
  106.  
  107. @Override
  108. public <T> T unwrap(Class<T> iface) throws SQLException {
  109. // TODO Auto-generated method stub
  110. return null;
  111. }
  112.  
  113. @Override
  114. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  115. // TODO Auto-generated method stub
  116. return false;
  117. }
  118.  
  119. @Override
  120. public Connection getConnection(String username, String password)
  121. throws SQLException {
  122. // TODO Auto-generated method stub
  123. return null;
  124. }
  125.  
  126. }

jdk 动态代理 数据连接池的更多相关文章

  1. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  2. JDK动态代理连接池

    JDK动态代理   1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧.累点到是没什么,可以完成功能就是好的.但是不 ...

  3. 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理

    [原创]分布式之缓存击穿   什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查 ...

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

    2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...

  5. Spring AOP详解 、 JDK动态代理、CGLib动态代理

    AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码 ...

  6. 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

    Spring AOP详解 . JDK动态代理.CGLib动态代理  原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...

  7. Spring AOP JDK动态代理与CGLib动态代理区别

    静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分 ...

  8. jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

    代理模式是一种很常见的模式,本文主要分析jdk动态代理的过程 1.举例 public class ProxyFactory implements InvocationHandler { private ...

  9. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

随机推荐

  1. PLSQL连接Oracle11g 64位

    目前plsql只有32位的,而Oracle11则是64位的,想要连接需要下载这个: 打开plsql,在Tools-->Prefences里面设置,如下图: 设置Oracle的主目录:下载文件解压 ...

  2. C#封装的VSTO Excel操作类

    自己在用的Excel操作类,因为经常在工作中要操作Excel文件,可是使用vba实现起来实在是不方便,而且编写也很困难,拼接一个字符串都看的眼花. 这个时候C#出现了,发现使用C#来操作Excel非常 ...

  3. 判断本地是否存在Jquery文件,如果不存在则使用CDN加速的Jquery文件

    <script>//判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库if (typeof jQuery == 'undefined') {document.wri ...

  4. wffmpeg64.dll调用 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    求解中.....

  5. 使用穷人版profiler定位调试MySQL

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 周末闲得蛋疼,来英飞特做人工空气净化器.开了电脑后,习惯性得点击xshell按钮,进入InnoSQL稳定性测 ...

  6. Swift 4.0 正式发布,更快更兼容更好用

    Swift4现已正式发布!Swift4在Swift3的基础上,提供了更强大的稳健性和稳定性,为Swift3提供源码兼容性,对标准库进行改进,并添加了归档和序列化等功能. 你可以通过观看WWDC2017 ...

  7. UICollectionView Layout自定义 Layout布局

    from:   http://www.tuicool.com/articles/vuyIriN 当我们使用系统自带的UICollectionViewFlowLayout无法实现我们的布局时,我们就可以 ...

  8. N - 畅通工程再续 (最小生成树)

    相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政 ...

  9. hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map

    题目传送门 题目大意: 给出一张n*n的图,机器人在一秒钟内任一格子上都可以有五种操作,上下左右或者停顿,(不能出边界,不能碰到障碍物).题目给出k个障碍物,但保证没有障碍物的地方是强联通的,问经过无 ...

  10. 爬虫初识和request使用

    一.什么是爬虫 爬虫的概念: 通过编写程序,模拟浏览器上网,让其去互联网上爬取数据的过程. 爬虫的工作流程: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或 ...