[javaEE] 数据库连接池和动态代理详解编程语言

实现javax.sql.DataSource接口

实现Connection getConnection()方法

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

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); 
         
    } 
}

我的连接池

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对象,因此无法通过继承改造这个对象

装饰的测试实现:

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("大叫"); 
    } 
     
}

动态代理:

         
        //测试代理模式 
        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();

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/industrynews/12629.html

(0)
上一篇 2021年7月19日 14:45
下一篇 2021年7月19日 14:45

相关推荐

发表回复

登录后才能评论