Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the purpose of 'Class.forName("MY_JDBC_DRIVER")'?

Tags:

I understand that class loading is useful for load the class at runtime with its class name.

However while using JDBC in our project we know which driver we are going to use and mostly driver manager string is hard coded.

My question is: Why are we loading driver using Class.forName("JDBC_DRIVER") here?
Why can't we go ahead adding the driver in class path? since we know which driver jar we are going to use.

I believe Class.forName(JDBC_DRIVER) will load the Driver into DriverManager. Is it the only reason?

Edit 1:

The DriverManager API doc states that

As part of its(DriverManager) initialization, the DriverManager class will attempt to load the driver classes referenced in the "jdbc.drivers" system property.

Applications no longer need to explictly load JDBC drivers using Class.forName(). Existing programs which currently load JDBC drivers using Class.forName() will continue to work without modification.

Then when I use other than oracle driver; do I need to change the driver name string in system property?

like image 472
Kanagavelu Sugumar Avatar asked Oct 05 '11 14:10

Kanagavelu Sugumar


People also ask

What is the use of class forName?

forName. Returns the Class object associated with the class or interface with the given string name, using the given class loader. Given the fully qualified name for a class or interface (in the same format returned by getName ) this method attempts to locate, load, and link the class or interface.

What is the purpose of using class forName Oracle JDBC Oracledriver?

Class and the forName() is a static method of the java. lang. Class . The JDBC Drivers (String) will be loaded into the class dynamically at run time and forName method contains static block which creates the Driver class object and register with the DriverManager Service automatically.

When you say class forName () loads the driver class does it mean it imports the driver class using import statement explain?

14: When you say Class. forName() loads the driver class, does it mean it imports the driver class using import statement? No, it doesn't. An import statement tells the compiler which class to look for.

Which of the following is correct about class forName () method call?

Q 20 - Which of the following is correct about Class. forName method call? A - This method dynamically loads the driver's class file into memory, which automatically registers it.


1 Answers

First of: with modern JDBC drivers and a current JDK (at least Java 6) the call to Class.forName() is no longer necessary. JDBC driver classes are now located using the service provider mechanism. You should be able to simply remove that call and leave the rest of the code unchanged and it should continue to work.

If you're not using a current JDK (or if you have a JDBC driver that does not have the appropriate files set up to use that mechanism) then the driver needs to be registered with the DriverManager using registerDriver. That method is usually called from the static initializer block of the actual driver class, which gets triggered when the class is first loaded, so issuing the Class.forName() ensures that the driver registers itself (if it wasn't already done).

And no matter if you use Class.forName() or the new service provider mechanism, you will always need the JDBC driver on the classpath (or available via some ClassLoader at runtime, at least).

tl;dr: yes, the only use of that Class.forName() call is to ensure the driver is registered. If you use a current JDK and current JDBC drivers, then this call should no longer be necesary.

like image 121
Joachim Sauer Avatar answered Jan 19 '23 01:01

Joachim Sauer