DriverManager.registerDriver(new com.mysql.jdbc.Driver())为什么Driver会创建两次
2017-04-20 09:24
459 查看
在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里采用MySQL数据库),分别为:
Java代码
1. DriverManager.registerDriver(new Driver());
2. Class.forName(“com.mysql.jdbc.Driver”);
那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
Java代码
1. public static synchronized void registerDriver(java.sql.Driver driver)
2. throws SQLException {
3. if (!initialized) {
4. initialize();
5. }
6.
7. DriverInfo di = new DriverInfo();
8.
9. di.driver = driver;
10. di.driverClass = driver.getClass();
11. di.driverClassName = di.driverClass.getName();
12.
13. // Not Required – drivers.addElement(di);
14.
15. writeDrivers.addElement(di);
16. println(“registerDriver: ” + di);
17.
18. /* update the read copy of drivers vector */
19. readDrivers = (java.util.Vector) writeDrivers.clone();
20.
21. }
很明显,DriverManager将我们需要注册的驱动程序信息封装成DriverInfo放进了一个writeDrivers中,这个writeDrivers是DriverManager中声明的一个static类型Vector变量。在getConnection的时候会再用到。
那么Class.forName(“com.mysql.jdbc.Driver”)是如何注册驱动程序的呢,我们知道Class.forName(“类名”)的主要作用是向虚拟机实例化一个Class实例,我们看一下com.mysql.jdbc.Driver的源代码。
Java代码
1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
2. // ~ Static fields/initializers
3. // ———————————————
4.
5. //
6. // Register ourselves with the DriverManager
7. //
8. static {
9. try {
10. java.sql.DriverManager.registerDriver(new Driver());
11. } catch (SQLException E) {
12. throw new RuntimeException(“Can’t register driver!”);
13. }
14. }
在 com.mysql.jdbc.Driver中有一段静态代码块,是向 DriverManager注册一个Driver实例。这样在Class.forName(“com.mysql.jdbc.Driver”)的时候,就会首先去执行这个静态代码块,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
那么对于这两种方法,在这里,推荐使用第二种,即Class.forName(“类名”)的方式。原因有两点
1、在我们执行DriverManager.registerDriver(new Driver())的时候,静态代码块也已经执行了,相当于是实例化了两个Driver对象。
2、 DriverManager.registerDriver(new Driver())产生了一种对MySQL的一种依赖。而Class.forName的方式我们完全可以在运行的时候再动态改变。
Java代码
1. DriverManager.registerDriver(new Driver());
2. Class.forName(“com.mysql.jdbc.Driver”);
那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
Java代码
1. public static synchronized void registerDriver(java.sql.Driver driver)
2. throws SQLException {
3. if (!initialized) {
4. initialize();
5. }
6.
7. DriverInfo di = new DriverInfo();
8.
9. di.driver = driver;
10. di.driverClass = driver.getClass();
11. di.driverClassName = di.driverClass.getName();
12.
13. // Not Required – drivers.addElement(di);
14.
15. writeDrivers.addElement(di);
16. println(“registerDriver: ” + di);
17.
18. /* update the read copy of drivers vector */
19. readDrivers = (java.util.Vector) writeDrivers.clone();
20.
21. }
很明显,DriverManager将我们需要注册的驱动程序信息封装成DriverInfo放进了一个writeDrivers中,这个writeDrivers是DriverManager中声明的一个static类型Vector变量。在getConnection的时候会再用到。
那么Class.forName(“com.mysql.jdbc.Driver”)是如何注册驱动程序的呢,我们知道Class.forName(“类名”)的主要作用是向虚拟机实例化一个Class实例,我们看一下com.mysql.jdbc.Driver的源代码。
Java代码
1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
2. // ~ Static fields/initializers
3. // ———————————————
4.
5. //
6. // Register ourselves with the DriverManager
7. //
8. static {
9. try {
10. java.sql.DriverManager.registerDriver(new Driver());
11. } catch (SQLException E) {
12. throw new RuntimeException(“Can’t register driver!”);
13. }
14. }
在 com.mysql.jdbc.Driver中有一段静态代码块,是向 DriverManager注册一个Driver实例。这样在Class.forName(“com.mysql.jdbc.Driver”)的时候,就会首先去执行这个静态代码块,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
那么对于这两种方法,在这里,推荐使用第二种,即Class.forName(“类名”)的方式。原因有两点
1、在我们执行DriverManager.registerDriver(new Driver())的时候,静态代码块也已经执行了,相当于是实例化了两个Driver对象。
2、 DriverManager.registerDriver(new Driver())产生了一种对MySQL的一种依赖。而Class.forName的方式我们完全可以在运行的时候再动态改变。
相关文章推荐
- MySQL JDBC驱动 - Class.forName和java.sql.DriverManager.registerDriver (new Driver())的区别
- jdbc-mysql基础 注册驱动 DriverManager.registerDriver
- 为什么需要Class.forName("com.mysql.jdbc.Driver")
- JBoss中配置数据源出现错误:“Failed to register driver for: com.mysql.jdbc.Driver”的解决方法
- 为什么需要Class.forName("com.mysql.jdbc.Driver")
- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb
- 为什么jdbc链接时 只要class.forname("com.mysql.jdbc.Driver")即可?
- 为什么jdbc链接时 只要class.forname("com.mysql.jdbc.Driver")即可?
- JBoss中配置数据源出现错误:“Failed to register driver for: com.mysql.jdbc.Driver”的解决方法
- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver (in EnvironmentClassLoader[resin-system:,NEW
- Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web applica问
- mysql驱动配置:解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- invalid: "org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.j
- registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it
- Error loading driver:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- org.gjt.mm.mysql.Driver和com.mysql.jdbc.Driver的区别
- The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister i
- 解决 Could not load JDBC driver class [com.mysql.jdbc.Drivers]