public class DefaultConnectionProvider implements ConnectionProvider实现了interface ConnectionProvider
这个类被设计为数据库连接提供者,在DefaultConnectionProvider类中有一个内部类,关键的功能都放这个内部类实现:private class ConnectionPool implements Runnable 连接池,实现了runnable,被设计成为一个后台线程。
这个类的属性包括:
private Thread runner; 在构造函数中调用了runner=new Thread(this);runner.start();保存自身线程的引用,这个用法感觉很不适应。
private Connection[] connPool; 连接数组
private int[] connStatus; 状态数组
private long[] connLockTime, connCreateDate; //
private String[] connID; 连接编号
private String dbDriver, dbServer, dbLogin, dbPassword, logFileString; 数据库的信息
private int currConnections, connLast, minConns, maxConns, maxConnMSec;
//available: set to false on destroy, checked by getConnection()
private boolean available=true;
private PrintWriter log;
private SQLWarning currSQLWarning;
private String pid; 线程编号??构造函数中赋值pid=fomatter("yyyy.MM.dd G 'at' hh:mm:ss");
构造函数:
public ConnectionPool (String dbDriver, String dbServer, String dbLogin,
String dbPassword, int minConns, int maxConns,
String logFileString, double maxConnTime) throws IOException
设置了数据库的信息,循环5次try{createConn(id);}catch{},写入log;
创建单个连接:
private void createConn(int i) throws SQLException
根据i 创建connPoll[i]的链接,DriverManager.getConnection(dbServer,dbLogin,dbPassword);
connID[i] = String.valueOf(getConnectionHash(connPool[i])); 后面继续看这个方法的实现。
获得连接编号:
private int getConnectionHash(Connection con);
return System.identityHashCode(con);
直接返回了jdk里面的方法:
public static int identityHashCode(Object x)
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
关闭连接池:
public void destroy(int millis) throws SQLException
结束线程的执行:runner.interrupt();等待线程结束:runner.join(millis);等待无人使用连接或者超时:
while((useCount=getUseCount())>0 && System.currentTimeMillis() -startTime <= millis) ;
正常情况下关闭所有连接connPool[i].close(),超时情况下将信息写入log;
获得连接编号:
idOfConnection(Connection conn)
遍历连接数组,比较编号。
获得当前活动的链接数
public int getUseCount()
从0到currConnections循环查询connStats进行统计,使用同步机制synchronized(connStatus)
这些是基本的数据库连接池的实现方法,jive的实现方法并不复杂,下面介绍数据库设置保存。
jive使用内省和反射保存属性,是否这样有利于扩展增加其他的设置?
BeanInfo beanInfo = Introspector.getBeanInfo(conProvider.getClass());
PropertyDescriptor[] propDescriptors = beanInfo.getPropertyDescriptors();
String[] propertyNames = DefaultConnectionProviderBeanInfo.PROPERTY_NAMES;
descriptor = getPropertyDescriptor(propDescriptors,"maxConnections");
writeMethod = descriptor.getWriteMethod();
args = new Integer[1];
args[0] = new Integer(maxConnections);
writeMethod.invoke(conProvider, args);