[javaEE] 数据库连接池和动态代理

实现javax.sql.DataSource接口

实现Connection getConnection()方法

定义一个静态的成员属性LinkedList类型作为连接池,在静态代码块中初始化5条数据库连接,添加到连接池中,在getConnection方法中,当获取连接的时候在连接池中remove掉一条连接就可以了

import java.lang.reflect.InvocationHandler;
 java.lang.reflect.Method;
 java.lang.reflect.Proxy;
 java.sql.Connection;
 java.sql.ResultSet;
 java.sql.Statement;

public class JDBCTest {
    static void main(String[] args) throws Exception {
        //使用反射的方式
        Class.forName("com.mysql.jdbc.Driver");
        获取数据库连接,导包的时候,注意要导java.sql下的,面向接口编程
        MyPool pool=new MyPool();
        Connection conn=pool.getConnection();
        获取传输器对象
        Statement statement=conn.createStatement();
        获取结果集对象
        ResultSet resultSet=statement.executeQuery("select * from user"遍历
        while(resultSet.next()){
            String username=resultSet.getString("username");
            System.out.println(username);
        }
        关闭资源
        resultSet.close();
        statement.close();
        pool.resetConn(conn);
        
    }
}

我的连接池

 java.io.PrintWriter;
 java.sql.DriverManager;
 java.sql.SQLException;
 java.sql.SQLFeatureNotSupportedException;
 java.util.LinkedList;
 java.util.List;
 java.util.logging.Logger;

 javax.sql.DataSource;

/**
 * 手写连接池
 * 
 * @author taoshihan
 * 
 */
class MyPool implements DataSource {
     连接池
    static List<Connection> pool = new LinkedList<Connection>();
     初始化
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            for (int i = 0; i < 5; i++) {
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/java","root","root");
                pool.add(conn);
            }
        } catch (Exception e) {
        }
    }

    
     * 获取连接
     */
    @Override
    public Connection getConnection()  SQLException {
         如果池中没有连接
        if (pool.size() == 0) {
            );
                pool.add(conn);
            }
        }
        先进先出
        Connection conn=pool.remove(0);
        System.out.println("获取一个连接,池里还剩余"+pool.size());
        return conn;
    }
    
     * 重置连接
     */
    void resetConn(Connection conn){
         {
            if(conn!=null && !conn.isClosed()){
                pool.add(conn);
                System.out.println("还回一个连接,池里还剩余"+pool.size());
            }
        }  (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public Connection getConnection(String username,String password)
             SQLException {
                return null;
    }

    @Override
    public PrintWriter getLogWriter()  TODO Auto-generated method stub
        void setLogWriter(PrintWriter out)  TODO Auto-generated method stub

    }

    @Override
    void setLoginTimeout(int seconds) int getLoginTimeout() return 0public Logger getParentLogger()  SQLFeatureNotSupportedException {
        public <T> T unwrap(Class<T> iface) boolean isWrapperFor(Class<?> iface) false;
    }

}

 

 

使用继承,装饰,动态代理改造一个类中的方法

继承的缺点:此时我们已经得到了Connection对象,因此无法通过继承改造这个对象

装饰的测试实现:

 Exception {
        
        测试装饰模式
        Animal dog=new BigDog( Dog());
        dog.eat();
        dog.sound();

    }
}


 * 装饰模式测试
 *  taoshihan
 *
 interface Animal{
     eat();
     sound();
}
class Dog  Animal{

    @Override
     eat() {
        System.out.println("吃");
    }

    @Override
     sound() {
        System.out.println("汪");
    }
}
此时我想修改Dog类中的sound方法
class BigDog private Dog dog;
     BigDog(Dog dog) {
        this.dog=dog;
    }
    
     * 这个方法调原来的
      eat() {
        dog.eat();
    }
    
     * 这个方法进行装饰
     

    @Override
     sound() {
        System.out.println("大叫");
    }
    
}

动态代理:

        
        测试代理模式
        final Dog dog= Dog();
        Animal proxy=(Animal) Proxy.newProxyInstance(Dog.class.getClassLoader(),Dog.class.getInterfaces(), InvocationHandler() {
            
            @Override
             Object invoke(Object proxy,Method method,Object[] args)
                     Throwable {
                if("sound".equals(method.getName())){
                    System.out.println("大叫");
                    ;
                }else{
                     method.invoke(dog,args);
                }
            }
        });
        proxy.eat();
        proxy.sound();

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


@ 注解能被用来为程序元素( 类、 方法、 成员变量等) 设置元数据。 值得指出的是, 注解不影响程序代码的执行, 无论增加、 删除注解, 代码都始终如一地执行。 如果希望让程序中的注解在运行时起一定
@ 1、线性表的概念 线性表是最常见也是最简单的一种数据结构。简言之, 线性表是n个数据元素的有限序列。 其一般描述为: A={a1,a2,……an) 一个数据元素通常包含多个数据项, 此时每个数据元
简介 ArrayList是开发中使用比较多的集合,它不是线程安全的,CopyOnWriteArrayList就是线程安全版本的ArrayList。CopyOnWriteArrayList同样是通过数组
在 Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续
话不多说,先上图。 1、基本概念 欲说线程,必先说进程。 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进
@ 网络基础 计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。 那什么是互联网呢?互联网是网络的网络(internet
JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。 先上图: 1、JVM基本概念 1.1、JVM是什么 JVM 的全称是 「Java Virtual Machine
@ 本文基于jdk1.8 HashMap采用 key/value 存储结构,每个key对应唯一的value。 在jdk1.7之前,HashMap 的内部存储结构是数组+链表。 在jdk1.8中 Has
@ Eclipse是很多Java开发者的第一个开发工具,尽管开源的Eclipse在一后起之秀的对比下,显得有些颓势,但是,Eclipse有着丰富的插件支持。选择合适的插件,Eclipse表示:老夫也能
@ 准备 LinkedList是基于双向链表数据结构实现的Java集合(jdk1.8以前基于双向循环链表),在阅读源码之前,有必要简单了解一下链表。 先了解一下链表的概念:链表是由一系列非连续的节点组
@ 写博客哪有刷逼乎有意思 1 写博客哪有刷逼乎有意思 2 写博客哪有刷逼乎有意思 3 类的加载、 连接和初始化 系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类。 JVM 和
树结构是一类重要的非线性数据结构。直观来看,树是以分支关系定义的层次结构。树结构在客观世界广泛存在,如人类社会的族谱和各种社会组织机构都可用树来形象表示。 树在计算机领域中也得到广泛应用,尤以二叉树最
@ 本文基于jdk1.8 String类可谓是我们开发中使用最多的一个类了。对于它的了解,仅仅限于API的了解是不够的,必须对它的源码进行一定的学习。 一、前置 String类是Java中非常特别的一
随便打开一个招聘网站,看看对高级Java工程师的技能要求。 抛开其它的经验能力等等,单纯从技术,或者说知识上来讲,可以发现一些共通的地方。 Java基础 计算机基础 数据库,SQL/NoSQL 常用开
@ JDBC指Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。 1、JDBC典型用法 1.1、JDBC 4.2 常用接口和类简介
简介 ArrayList是基于数组实现的一种列表。 ArrayList继承体系如下: 图一:ArrayList继承体系 ArrayList实现了List, RandomAccess, Cloneabl
@ Java 的 IO 通过 java.io 包下的类和接口来支持, 在 java.io 包下主要包括输入、 输出两种 10 流, 每种输入、 输出流又可分为字节流和字符流两大类。 其中字节流以字节为
@ 使用断言 断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。 断言的概念 假设确信某个属性符合要求, 并且代码的执行依赖于这个属性。例如, 需要计算:
@ Java 程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。 Java 提供了 System 类和 Runtime 类来与程序的运行平台进行交互。 Syste
@ Java 提供了一个操作 Set 、 List 和 Map等集合的类:Collections , 该工具类里提供了大量方法对集合元素进行排序、 查询和修改等操作,还提供了将集合对象设置为不可变、对