Ani*_*kur 12 java database jdbc
JDBC版本4中的一个重要补充您不必再通过调用显式加载驱动程序Class.forName.当您的应用程序首次尝试连接数据库时,会DriverManager自动加载应用程序中的驱动程序CLASSPATH.
我的问题是怎么样?如果类路径中有多个驱动程序怎么办?
我可以猜到的一件事是,在解析连接URL时,是否需要驱动程序是JDBC或ODBC,但是如何从多个jdbc兼容的驱动程序中说出哪一个将被选择用于我正在使用的数据库?(假设我使用的是MySql,我需要MySql-Connector驱动程序).在JVM中是否存在此类数据库驱动程序的静态映射?
Mar*_*eel 14
每个符合JDBC 4的驱动程序都在其jar中有一个文件META-INF/services/java.sql.Driver,在该文件中它将列出其实现java.sql.Driver.当您请求连接时,DriverManager将使用它ServiceLoader来查找META-INF/services/java.sql.Driver类路径中的所有(!)副本,然后将加载列出的所有类.当一个java.sql.Driver类被加载时,它必须自己注册DriverManager,所以DriverManager使用服务加载器加载所有类,并且每个Driver实现都自己注册.
当您从中请求连接时DriverManager,DriverManager将遍历所有已注册的驱动程序,要求他们进行连接Connection.驱动程序将使用JDBC url来检查它是否支持它的协议(例如,Jaybird/Firebird JDBC检查url是否以"jdbc:firebirdsql:"或开头"jdbc:firebird:").如果驱动程序不支持协议,它将返回null,如果它支持协议,它将返回已建立的连接,或者它将抛出SQLException(例如,如果您在URL中发生错误,或者它无法连接) .如果所有驱动程序都返回null(没有支持协议),那么DriverManager将抛出一个SQLException错误"No suitable driver found for <url>"
因此,只要它们支持不同的协议,在类路径上有多个驱动程序并不重要,但是如果同一个数据库有多个驱动程序(或至少:相同的协议前缀),它将使用驱动程序列表中的第一个驱动程序,并且如果该驱动程序失败SQLException,则不会尝试另一个.
Jun*_*san 11
有关JDBC4驱动程序加载的一些信息来自:http://www.onjava.com/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html
调用getConnection方法时,DriverManager将尝试从初始化时加载的JDBC驱动程序中找到合适的驱动程序,并使用与当前应用程序相同的类加载器显式加载.
DriverManager方法getConnection和getDrivers已得到增强,可支持Java SE服务提供程序机制(SPM).根据SPM,服务被定义为一组众所周知的接口和抽象类,服务提供者是服务的特定实现.它还指定服务提供程序配置文件存储在META-INF/services目录中.JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver.此文件包含JDBC驱动程序的java.sql.Driver实现的名称.例如,要加载JDBC驱动程序以连接到Apache Derby数据库,META-INF/services/java.sql.Driver文件将包含以下条目:
org.apache.derby.jdbc.EmbeddedDriver
Run Code Online (Sandbox Code Playgroud)
现在回答你的问题.
我的问题是怎么样?如果类路径中有多个驱动程序怎么办?
作为类加载器规则,将首先加载任何找到的类,如果它已经加载,则不会被类加载器重新加载.