The difference between downloading a driver and registering drivers

I am very new to JDBC and I wrote a small program to check for registered drivers. I wanted to do the following

  1. I checked the number of registers without loading drivers:

    I expected that it would not give anything to my surprise, it gives 3 registered drivers.

  2. I loaded the driver using Class.forName ();

    I expected him to show me four drivers, but again got a shock, he shows only 3 drivers

  3. Finally, I register the driver using DriverManager

    Now it shows four drivers.

Can someone help me understand what is going on here. My question is as follows

  1. These three drivers are loaded / registered by default.
  2. Do I load a class using Class.forNameregister driver? (I think the answer is not for this, because from my experience, I ask it just to be sure), if not, then the class is loaded just to search for the implementation of external interfaces, such as (DriverManager, etc. ... )
  3. Finally, what is the difference between downloading a driver and registering a driver

I have listed both the program and the output for your reference.

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import oracle.jdbc.driver.OracleDriver;

class Test3{
 public static void main(String[] args) throws Exception{

     //checking for registered drivers
     System.out.println("Drivers registered initially");
     Enumeration enumm = DriverManager.getDrivers();
     int count=1;
     while(enumm.hasMoreElements()){
         Driver dr=(Driver)enumm.nextElement();
         System.out.println(count+" "+dr);
         count++;
     }

     //loading the driver
     Class.forName("oracle.jdbc.driver.OracleDriver");
     System.out.println("\n\nDrivers after class loading");
     enumm = DriverManager.getDrivers();
     count=1;
     while(enumm.hasMoreElements()){
         Driver dr=(Driver)enumm.nextElement();
         System.out.println(count+" "+dr);
         count++;
     }

     //After Registering driver
     OracleDriver odr= new OracleDriver();
     DriverManager.registerDriver(odr);
     System.out.println("\nAfter registering oracle driver");
     enumm = DriverManager.getDrivers();
     count=1;
     while(enumm.hasMoreElements()){
         Driver dr=(Driver)enumm.nextElement();
         System.out.println(count+" "+dr);
         count++;
     }

}
}

Output:

Drivers registered initially

1 sun.jdbc.odbc.JdbcOdbcDriver@2c84d9

2 oracle.jdbc.OracleDriver@8bdcd2

3 com.mysql.jdbc.Driver@1f31ad9

Drivers after class loading

1 sun.jdbc.odbc.JdbcOdbcDriver@2c84d9

2 oracle.jdbc.OracleDriver@8bdcd2

3 com.mysql.jdbc.Driver@1f31ad9

After registering oracle driver

1 sun.jdbc.odbc.JdbcOdbcDriver@2c84d9

2 oracle.jdbc.OracleDriver@8bdcd2

3 com.mysql.jdbc.Driver@1f31ad9

4 oracle.jdbc.driver.OracleDriver@167acf2

+4
source share
2 answers

JDK6 JDBC , JVM - classpath. JDK6 Class.forName. , JVM.

+3

JDBC , java.sql.DriverManager ( ). .

JDBC 4.0 (Java 6), JDBC , java.sql.Driver, ( ). META-INF/services/java.sql.Driver.

DriverManager ( java.util.ServiceLoader , () , DriverManager.

:

  • Class.forName(...); ( JDBC 4)
  • DriverManager ( JDBC 1 , )

JDBC 4 ( , ), . Class.forName(..) , ( ). (, , ), .

+3

Source: https://habr.com/ru/post/1534375/


All Articles