在看jdbc时,书上说java6支持驱动程序自动加载,也就是不用Class.forName显示加载

在看jdbc时,书上说java6支持驱动程序自动加载,也就是不用Class.forName显示加载,请问是如何实现的,朋友们请看清问题回答

用 WinRAR 或 WinZip 打开 那个 JDBC 4.0+ 的驱动程序,(早期版本的驱动程序是不支持的),你可以看到 META-INF 文件夹下面多出了一个文件,它里面写着驱动程序的名字。JDBC  DriverManager 会自动搜索  META-INF/xxxxx 去尝试读取它找到的任何 jar 中的这个目录,如果有东西就会自动 Class.forName 加载它,这在 Java 中叫 Service Provider discovery 机制,自动发现,JSP 中的 tld 文件也是使用类似的机制,以前需要我们手工把它们配置在 web.xml  里面,后来不需要了,你可以找一个 jstl.jar 打开来看看,设计原理是一样的。以后你可以模仿一样,在 META-INF 中添加一个东西来当然插件机制。扫描 META-INF 也可能由 JVM 自动来完成并添加它到 System.getProperties() 里面。


如图:

追问

就是是它里面帮我们加载了?

追答

首先,这个 META-INF/services (猜想,不一定是,也可能是 META-INF/drivers,因为我手上没有 JDBC 4.0+ 的驱动包) 已经由 JVM 帮我们扫描过并添加到 System.setProperties("jdbc.drivers", System.getProperties("jdbc.drivers") + ';' + $扫描到的drivers); 这样把所有可用的 jdbc.drivers 拼接起来用分号隔开,以后 DriverManager 就会从 System.getProperties("jdbc.drivers"); 中读取并全部加载它们。

你需要做的是通过观察找出线索。

追问

那个service文件是在驱动里面,drivermanager怎么知道有这个文件

追答

JRE 可能自动搜索 jar 中的 META-INF 目录,也可能是 DriverManager 自动搜索。
你写个 main class 尝试搜索 new Jar("a.jar") 然后读取它的 manifest,这个 manifest 是 Java 的规范格式,所以可能 java 或 classloder 可以自动处理它们。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-06
的确是这样的,原来获取连接是以下3步

1. 加载JDBC驱动;
2. 定义连接的URL;
3. 建立连接;

现在可以省去驱动的加载,
就是不写Class.forName()方法,
直接使用Connection获取数据库连接追问

为什么?

追答

为什么,我也不知道,这是JVM底层的实现,感兴趣的话你可以去比较源码。

第2个回答  2013-12-06
估计是自动判定连接数据库的
根据URL能判定出来
其实在实际开发中JDBC的开发并不是那么重要的,因为有太多完美的连接池框架(Hibernate mybatis等),除非你自己写连接池0.0
你可以自己找一下有没有这个方法,但是建议你不要太深究,因为可以说是 没用!
如果实在想看的话 就到java.sql.*这个库下找找看吧
第3个回答  2013-12-06
这个和java版本有关?
第4个回答  2013-12-13
下个金山助手也吧
第5个回答  2013-12-30
您好,这样的情况建议您下载最新版本的驱动精灵,或是直接在线升级一下驱动精灵。希望可以帮到您。