jdbc连接池学习笔记

这篇博客详细介绍了Java中JDBC连接池的使用,包括自定义连接池的概念和动态代理的应用,以及JDCP和C3P0两种常见连接池的配置方式。文章提供了相关jar包的下载链接,并强调了配置文件的位置和正确关闭连接的重要性。
摘要由CSDN通过智能技术生成

前言:

第一步还是先自定义,了解底层如何实现,再去运用工具组件

自定义连接池:

主要是用到了动态代理,和反射
使用动态代理,可以监测接口中方法的执行
(一旦方法被执行就可以执行额外添加的功能)

Proxy

static Object newProxyInstance(
//当前使用的类加载器
ClassLoader loader,    
//目标对象(Connection)实现的接口类型
Class<?>[] interfaces,   
事件处理器:当执行上面接口中的方法的时候,就会自动触发事件处理器代码,把当前执行的方法(method)作为参数传入。
InvocationHandler h    
)  

动态代理总结:

使用代理,可以在不实现接口的情况,对接口的方法进行扩展,  
添加额外的用户需要的业务逻辑!
public class pool {

    private int init_count = 3;
    private int max_count = 6;
    private int current_count = 0;
    private String url = "jdbc:mysql://localhost:3306/day15?serverTimezone=Asia/Shanghai&useUnicode=tr";
    private LinkedList<Connection> pool = new LinkedList<Connection>();

    public pool() {
        for (int i = 0; i < init_count; i++) {
            current_count++;
            Connection connection = createConnection();
            pool.addLast(connection);
        }
    }

    private Connection createConnection() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 原始的目标对象
            final Connection connection = DriverManager.getConnection(url, "root", "123456");
            //
            Class[] xx=connection.getClass().getInterfaces();
            for(int i=0;i<xx.length;i++) {
                System.out.println(xx[i].getName());
            }

            Connection proxy = (Connection) Proxy.newProxyInstance(
                    // 类加载器
                    connection.getClass().getClassLoader(),
                    // connection.getClass().getInterfaces(),当目标对象是一个具体的类时
                    // 目标对象实现的接口,如上getInterfaces()也可以
                    new Class[] { Connection.class }, 
                    //当调用connection对象方法的时候, 自动触发事务处理器
                    new InvocationHandler() {

                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                            Object result = null;
                            String methodName = method.getName();
                            if ("close".equals(methodName)) {
                                System.out.println("当前执行close方法");
                                realeaseConnection(connection);
                                System.out.println("当前连接放入连接池");
                            } else {
                                //// 调用目标对象方法
                                result = method.invoke(connection, args);
                            }
                            return result;
                        }
                    });
            return proxy;
        } catch (Exception e) {
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值