2015-10-17 120 views
1

我正在研究Java JDBC API,并且我读过数据库应用程序的第一步当然是获取到DBMS的连接。 现在,我知道DriverManager是包中的少数(我迄今为止唯一遇到的类)具体类之一,它具有私有构造函数和静态方法(这意味着我不能实例化它,即使我想)。 因此,DriverManager类(在JDBC 4.0之后)会自动加载包含在供应商驱动程序中的驱动程序接口实现(而不是手动调用Class.forName(“blahblah”)来加载类),并且实现类本身具有静态初始化块在他们做的东西沿着这些路线:DriverManager.registerDriver()静态方法

static { 
    Driver driver=new cfully.qualified.name.DriverClass(); 
    DriverManager.registerDriver(driver); 
} 

此注册驱动程序实现(如果有的话)在DriverManager的,这反过来将能够URL传递到数据库中所有已注册的驱动程序,以获取Connection对象。 现在,我不明白... DriverManager类如何存储(或注册)驱动程序?这些是实现java.sql.Driver的类的实例,它们是对象,所以我希望DriverManager的一个实例可以存储(比如在一个数组或者某个数据结构中)注册的驱动程序......但是没有据我所知(我称之为静态方法!)。 有人可以解释一下吗?

+0

我不知道您的期望,因为我不明白的解释做什么写在这里。明确你的具体问题并发布一个简单的例子。 –

+0

@RomanC,我不知道如何让你理解,因为问题的问题非常清楚。 – Luca

+0

是什么让你觉得它不会将它们存储在任何地方? – EJP

回答

1

这是它做什么

public static synchronized void registerDriver(java.sql.Driver driver) 
    throws SQLException { 
    if (!initialized) { 
     initialize(); 
    } 

    DriverInfo di = new DriverInfo(); 

    di.driver = driver; 
    di.driverClass = driver.getClass(); 
    di.driverClassName = di.driverClass.getName(); 

    // Not Required -- drivers.addElement(di); 

    writeDrivers.addElement(di); 
    println("registerDriver: " + di); 

    /* update the read copy of drivers vector */ 
    readDrivers = (java.util.Vector) writeDrivers.clone(); 

} 

所以它注册的驱动程序,类,驱动程序在

private static java.util.Vector readDrivers = new java.util.Vector(); 

类的名字,那么当一些确实getConnection(String url.....)

它将循环readDrivers的所有驱动程序试试这个

Connection result = di.driver.connect(url, info); 
if (result != null) { 
    return (result); 
} 

因此,它到一个实现java.sql.Driver中迅速决定他是否能够连接到所提供的URL

+0

你的答案对我来说不是很清楚,但它无法解释它存储驱动程序信息的位置以及调用getConnection()方法时会发生什么情况。谢谢! – Luca

+0

对不起,我尽力了; ),什么是不明确? –