实现了javax.sql.DataSource的才是标准的数据库连接池,按照字面意思,一般称之为数据源。
对于一个已知类的某个方法进行功能上的改变有以下三种方式: 1、定义子类,扩展父类的某个功能。(此处行不通) 2、利用包装设计模式改写原有的类的功能 a、编写一个类实现与被改写类(com.mysql.jdbc.Connection)相同的接口 b、定义一个引用,记住被改写类的实例 c、定义构造方法,传入被改写类的实例 d、对于要改写的方法,改写即可 e、对于不需要改写的方法,调用原有的对象的对应方法针对已经实现的类进行改写它的方法。
*****包装设计模式 *****默认适配器设计模式上一篇介绍动态代理模式
1 package cn.itcast.jdbc.pool; 2 3 import java.io.InputStream; 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.util.LinkedList; 7 import java.util.Properties; 8 9 import cn.itcast.util.JdbcUtil;10 //数据库连接池的原理11 public class SimpleConnectionPool {12 private static String driverClassName;13 private static String url;14 private static String user;15 private static String password;16 private static LinkedListpool = new LinkedList ();//存储连接的池17 static{18 try {19 InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");20 Properties props = new Properties();21 props.load(in);22 driverClassName = props.getProperty("driverClassName");23 url = props.getProperty("url");24 user = props.getProperty("user");25 password = props.getProperty("password");26 Class.forName(driverClassName);27 28 //初始化10个连接到池中29 for(int i=0;i<10;i++){30 Connection conn = DriverManager.getConnection(url, user, password);31 pool.add(conn);32 }33 // System.out.println("初始化的连接有:");34 // for(Connection c:pool)35 // System.out.println(c);36 } catch (Exception e) {37 e.printStackTrace();38 }39 }40 public synchronized static Connection getConnection(){41 if(pool.size()>0){42 Connection conn = pool.remove();//从池中拿到连接,并从池中删除掉43 44 // System.out.println("取出的是:"+conn);45 // System.out.println("池中还有:");46 // for(Connection c:pool)47 // System.out.println(c);48 return conn;49 }else{50 System.out.println("对不起!服务器真忙");51 return null;52 }53 }54 public static void release(Connection conn){ //把连接放回池中55 pool.add(conn);56 // System.out.println("回来的是:" +conn);57 // System.out.println("回来后池中的连接:");58 // for(Connection c:pool)59 // System.out.println(c);60 }61 }