编写数据库连接池
编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:
Connection getConnection()
Connection getConnection(String username, String password)
实现DataSource接口,并实现连接池功能的步骤:
在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。
public class JdbcPool extends DataSource { private static LinkedList<Connection> list = new LinkedList<Connection>(); private static Properties prop =new Properties(); static{ try { InputStream inStream=JdbcPool.class.getClassLoader().getResourceAsStream("db.properties"); prop.load(inStream); String driver = prop.getProperty("driver"); String url = prop.getProperty("url"); String username = prop.getProperty("username"); String password = prop.getProperty("password"); Class.forName(driver); for(int i=0;i<10;i++){ Connection conn = DriverManager.getConnection(url, username, password); System.out.println("获取到了链接" + conn); list.add(conn); } } catch (Exception e){ throw new RuntimeException(e); } } @Override public Connection getConnection() throws SQLException { //这里不能用get(index)来获得链接,这个方法只是获得这个链接的引用 Connection conn=list.removeFirst(); MyConnection my=new MyConnection(conn); return my; } @Override public Connection getConnection(String arg0, String arg1) throws SQLException { // TODO Auto-generated method stub return super.getConnection(arg0, arg1); } //conn.close():直接调用这个会直接关闭这个连接,不会还给连接池 /* 在实际开发,发现对象的方法满足不了开发需求时,有三种方式对其进行增强 * 1.生子类(使用这个方法要把这个类的信息导入子类中:写一个connecton子类,覆盖close方法,增强close方法(这里不适合,Connection是由mysql驱动得到的, * 已经封装了连那个数据库,用户名等,假如这个方法行,要重写mysql的驱动) * 2.用包装设计模式(这里使用这个)---缺点:实现的方法太多了 * 3.用动态代理 aop 面向切面编程(后边介绍) */ //1.定义一个类,实现与被增强相同的接口 //2.在类中定义一个变量,记住被增强对象 //3.定义一个构造函数,接收被增强对象 //4.覆盖想增强的方法 //5.对于不想增强的方法,直接调用目标对象(被增强对象)的方法 class MyConnection implements Connection{ private Connection conn; public MyConnection(Connection conn){ this.conn=conn; }public boolean isWrapperFor(Class<?> iface) throws SQLException { // TODO Auto-generated method stub return this.conn.isWrapperFor(iface);
public void close() throws SQLException {
list.add(conn);
}
.....还有很多方法(重写的方法太多)
}
现在的几乎什么都不懂,但是不代表以后的我也是这样。