Class.forName 如何加载数据库驱动
2012-12-17 13:56
465 查看
一直有一个疑问,Class.forName(driverName)是如何完成加载数据库驱动的,查阅了Oracle驱动的源码之后,大体弄清楚了。
我们知道,Class.forName所做的工作是加载指定的class文件到java虚拟机的内存,加载class文件到内存的时候,该class文件的静态变量和静态初始化块是要执行的,玄机即在此。
看Oracle数据库的驱动代码:
Java代码
private static OracleDriver defaultDriver = null;
static
{
try
{
if (defaultDriver == null)
{
defaultDriver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(defaultDriver);
}
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
OracleDriver.registerMBeans();
return null;
}
});
Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
}
catch (SQLException localSQLException)
{
Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "SQLException in static block.", localSQLException);
}
catch (RuntimeException localRuntimeException1)
{
Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "RuntimeException in static block.", localRuntimeException1);
}
try
{
Class localClass = Class.forName("oracle.security.pki.OraclePKIProvider");
Object localObject = localClass.newInstance();
}
catch (RuntimeException localRuntimeException2)
{
}
catch (Exception localException)
{
}
catch (NoClassDefFoundError localNoClassDefFoundError)
{
}
catch (Error localError)
{
}
catch (Throwable localThrowable)
{
}
systemTypeMap = new Hashtable(3);
try
{
systemTypeMap.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory"));
}
catch (ClassNotFoundException localClassNotFoundException1)
{
}
try
{
systemTypeMap.put("SYS.ANYTYPE", Class.forName("oracle.sql.AnyDataFactory"));
systemTypeMap.put("SYS.ANYDATA", Class.forName("oracle.sql.TypeDescriptorFactory"));
}
catch (ClassNotFoundException localClassNotFoundException2)
{
}
_Copyright_2007_Oracle_All_Rights_Reserved_ = null;
}
由上面的代码可以看出,在通过Class.forName加载oracle驱动的时候,在静态初始化块中,会完成驱动的注册工作,即创建驱动类的实例,并把实例注册给驱动管理器DriverManager,核心代码如下:
Java代码
if (defaultDriver == null)
{
defaultDriver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(defaultDriver);
}
如此之后,就不能理解,接下来就可以从驱动管理器中获得到数据库的连接了,如:
Java代码
public class ConnectionTool {
static String url = "jdbc:oracle:thin:@10.10.10.100:1521:loushang";
static String driverName = "oracle.jdbc.driver.OracleDriver";
public static Connection getCon(){
try {
Class.forName(driverName);
return DriverManager.getConnection(url, "apitest", "apitest");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
我们知道,Class.forName所做的工作是加载指定的class文件到java虚拟机的内存,加载class文件到内存的时候,该class文件的静态变量和静态初始化块是要执行的,玄机即在此。
看Oracle数据库的驱动代码:
Java代码
private static OracleDriver defaultDriver = null;
static
{
try
{
if (defaultDriver == null)
{
defaultDriver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(defaultDriver);
}
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
OracleDriver.registerMBeans();
return null;
}
});
Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
}
catch (SQLException localSQLException)
{
Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "SQLException in static block.", localSQLException);
}
catch (RuntimeException localRuntimeException1)
{
Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "RuntimeException in static block.", localRuntimeException1);
}
try
{
Class localClass = Class.forName("oracle.security.pki.OraclePKIProvider");
Object localObject = localClass.newInstance();
}
catch (RuntimeException localRuntimeException2)
{
}
catch (Exception localException)
{
}
catch (NoClassDefFoundError localNoClassDefFoundError)
{
}
catch (Error localError)
{
}
catch (Throwable localThrowable)
{
}
systemTypeMap = new Hashtable(3);
try
{
systemTypeMap.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory"));
}
catch (ClassNotFoundException localClassNotFoundException1)
{
}
try
{
systemTypeMap.put("SYS.ANYTYPE", Class.forName("oracle.sql.AnyDataFactory"));
systemTypeMap.put("SYS.ANYDATA", Class.forName("oracle.sql.TypeDescriptorFactory"));
}
catch (ClassNotFoundException localClassNotFoundException2)
{
}
_Copyright_2007_Oracle_All_Rights_Reserved_ = null;
}
private static OracleDriver defaultDriver = null; static { try { if (defaultDriver == null) { defaultDriver = new oracle.jdbc.OracleDriver(); DriverManager.registerDriver(defaultDriver); } AccessController.doPrivileged(new PrivilegedAction() { public Object run() { OracleDriver.registerMBeans(); return null; } }); Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0"); } catch (SQLException localSQLException) { Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "SQLException in static block.", localSQLException); } catch (RuntimeException localRuntimeException1) { Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "RuntimeException in static block.", localRuntimeException1); } try { Class localClass = Class.forName("oracle.security.pki.OraclePKIProvider"); Object localObject = localClass.newInstance(); } catch (RuntimeException localRuntimeException2) { } catch (Exception localException) { } catch (NoClassDefFoundError localNoClassDefFoundError) { } catch (Error localError) { } catch (Throwable localThrowable) { } systemTypeMap = new Hashtable(3); try { systemTypeMap.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory")); } catch (ClassNotFoundException localClassNotFoundException1) { } try { systemTypeMap.put("SYS.ANYTYPE", Class.forName("oracle.sql.AnyDataFactory")); systemTypeMap.put("SYS.ANYDATA", Class.forName("oracle.sql.TypeDescriptorFactory")); } catch (ClassNotFoundException localClassNotFoundException2) { } _Copyright_2007_Oracle_All_Rights_Reserved_ = null; }
由上面的代码可以看出,在通过Class.forName加载oracle驱动的时候,在静态初始化块中,会完成驱动的注册工作,即创建驱动类的实例,并把实例注册给驱动管理器DriverManager,核心代码如下:
Java代码
if (defaultDriver == null)
{
defaultDriver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(defaultDriver);
}
if (defaultDriver == null) { defaultDriver = new oracle.jdbc.OracleDriver(); DriverManager.registerDriver(defaultDriver); }
如此之后,就不能理解,接下来就可以从驱动管理器中获得到数据库的连接了,如:
Java代码
public class ConnectionTool {
static String url = "jdbc:oracle:thin:@10.10.10.100:1521:loushang";
static String driverName = "oracle.jdbc.driver.OracleDriver";
public static Connection getCon(){
try {
Class.forName(driverName);
return DriverManager.getConnection(url, "apitest", "apitest");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
相关文章推荐
- 由加载数据库驱动的方法Class.forName()看其作用!
- 1. Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
- 为什么加载数据库驱动只用Class.forName()
- Class.forName()、Class.forName().newInstance() 、New 三者区别! 终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- 如何用Class.forName方法动态加载构造方法带参数的类
- 解决Class.forName 加载驱动时出现ClassNotFoundException
- JDBC采用Class.forName加载驱动的意义
- JDBC中链接数据库前为什么要用Class.forName(驱动类)加载驱动类?
- Class.forName加载mysql驱动总是产生ClassNotFoundException异常
- jdbc加载驱动 Class.forName()的作用
- 数据库驱动为什么要使用Class.forName()
- 如何用Class_forName方法动态加载构造方法带参数的类
- 关于用Class.forName(“com.mysql.jdbc.Driver”)注册数据库驱动
- java 加载数据库驱动 与forname无关
- Class.forName()数据库驱动
- java连接数据库时加载驱动程序Class.forName(driveName)详解
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- 利用Class.forName()将驱动类加载到JVM
- java 中能否使用 动态加载的类(Class.forName) 来做类型转换?