前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[javaEE] 数据库连接池和动态代理

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

作者头像
唯一Chat
发布2019-09-10 16:31:50
5880
发布2019-09-10 16:31:50
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

实现javax.sql.DataSource接口

实现Connection getConnection()方法

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

代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTest {
    public 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);
        
    }
}

我的连接池

代码语言:javascript
复制
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;

import javax.sql.DataSource;

/**
 * 手写连接池
 * 
 * @author taoshihan
 * 
 */
public class MyPool implements DataSource {
    // 连接池
    public 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() throws SQLException {
        // 如果池中没有连接
        if (pool.size() == 0) {
            for (int i = 0; i < 5; i++) {
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/java", "root", "root");
                pool.add(conn);
            }
        }
        //先进先出
        Connection conn=pool.remove(0);
        System.out.println("获取一个连接,池里还剩余"+pool.size());
        return conn;
    }
    /**
     * 重置连接
     */
    public void resetConn(Connection conn){
        try {
            if(conn!=null && !conn.isClosed()){
                pool.add(conn);
                System.out.println("还回一个连接,池里还剩余"+pool.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public Connection getConnection(String username, String password)
            throws SQLException {
                return null;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

}

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

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

装饰的测试实现:

代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTest {
    public static void main(String[] args) throws Exception {
        
        //测试装饰模式
        Animal dog=new BigDog(new Dog());
        dog.eat();
        dog.sound();

    }
}

/**
 * 装饰模式测试
 * @author taoshihan
 *
 */
interface Animal{
    public void eat();
    public void sound();
}
class Dog implements Animal{

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

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

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

动态代理:

代码语言:javascript
复制
        
        //测试代理模式
        final Dog dog=new Dog();
        Animal proxy=(Animal) Proxy.newProxyInstance(Dog.class.getClassLoader(),Dog.class.getInterfaces() , new InvocationHandler() {
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                if("sound".equals(method.getName())){
                    System.out.println("大叫");
                    return null;
                }else{
                    return method.invoke(dog, args);
                }
            }
        });
        proxy.eat();
        proxy.sound();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档