编写连接池需实现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); }
.....还有很多方法(重写的方法太多) }