Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.getConnection("url", "userName", "password");api 上说,DriverManager会根据已经load的driver 来找一个适当的作为driver,由此得到connection,小弟想问一下,DriverManager 是如何得知有多少driver load 的???

解决方案 »

  1.   

    作为初始化的一部分,DriverManager 类会尝试加载在 "jdbc.drivers" 系统属性中引用的驱动程序类。这允许用户自定义由他们的应用程序使用的 JDBC Driver。例如,在 ~/.hotjava/properties 文件中,用户可以指定:  jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver
     程序还可以在任意时间显式地加载 JDBC 驱动程序。例如,my.sql.Driver 是使用以下语句加载的: 
     Class.forName("my.sql.Driver");
     在调用 getConnection 方法时,DriverManager 会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。
      

  2.   

    楼上说的不错.当调用Class.forName这个反射方法时就创建了驱动类的一个对象,对象的引用保存在DriverManager中
      

  3.   

    JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,oracle.jdbc.driver.OracleDriver就是Implementor,oracle.jdbc.driver.OracleDriver是Implementor的一个具体实现(请参考GOF的Bridge模式的描述,前一个Driver是一个接口,后者是一个实现了前面的Driver接口的类。
       Bridge模式中,Abstraction(DriverManager)是要拥有一个Implementor(Driver)的引用的,但是我们在使用过程中,并没有将Driver对象注册到DriverManager中去啊,这是怎么回事呢?jdk文档对Driver的描述中有这么一句:
         When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager 
    是oracle.jdbc.driver.OracleDriver在装载完后自动帮我们完成了这一步骤。
      

  4.   

    你看下OracleDriver的源代码就可以知道里面肯定有这个方法DriverManager.registerDriver