最近在看数据库连接池源码的时候遇到了一个问题:
/*构造方法,做一些初始化工作*/
private ConnectionPool() {
pool = new Vector<Connection>(poolSize);
for (int i = 0; i < poolSize; i++) {
try {
Class.forName(driverClassName);
conn = DriverManager.getConnection(url, username, password);
pool.add(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这是数据库连接池的一个构造函数,发现了这样一行代码觉得有些疑惑:
Class.forName(driverClassName);
这个是我们常见的反射机制,通过类名获取一个类,但是这里的Class.forName()没有返回值,但是我在JDK文档里查看方法明明是如下定义的:
public static Class forName(String className) throws ClassNotFoundException
具体看看怎么回事,查阅了一番之后发现,Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
所以在JDBC中直接通过Class.forName(driverClassName)将对应的driver向DriverManager进行注册就可以了。