You may be required to determine the version of a JDBC driver used to connect to your Oracle Database. In cases were the JDBC driver used is the one included with Oracle Client or Database identification could be rather straight forward.
Many Oracle products that utilize JDBC connectivity store the JDBC driver used by the product in the ORACLE_PRODUCT_HOME/jdbc/lib
directory and include a Readme.txt file that states the driver name. In some products this is not always the case.
Another problem in identifying the version is that the actual file name it self does not contain a hint about the driver version. For example the following show the JDBC drivers included with Oracle Enterprise Manager 11gR1 Grid Control Agent and Oracle Database Enterprise Edition 11gR2.
[oracle@prod jdbc]$ ls /u01/app/oracle/product/agent11g/jdbc/lib ojdbc5dms_g.jar ojdbc5dms.jar ojdbc5_g.jar ojdbc5.jar ojdbc6dms_g.jar ojdbc6dms.jar ojdbc6_g.jar ojdbc6.jar [oracle@prod jdbc]$ [oracle@prod jdbc]$ ls /u01/app/oracle/product/11.2.0/dbhome_1/jdbc/lib ojdbc5dms_g.jar ojdbc5_g.jar ojdbc6dms_g.jar ojdbc6_g.jar simplefan.jar ojdbc5dms.jar ojdbc5.jar ojdbc6dms.jar ojdbc6.jar [oracle@prod jdbc]$
With the exception of the additional file simplefan.jar
in the Database JDBC directory the file names are the same. It is only when we look at the Readme.txt file do we see that the JDBC drivers have different versions.
[oracle@prod jdbc]$ head /u01/app/oracle/product/agent11g/jdbc/Readme.txt Oracle JDBC Drivers release 11.1.0.7.0 - Production README ========================================================== What Is New In This Release ? ----------------------------- Support for Java Standard Edition 6 (JSE6) and JDBC 4.0 JSE 6 (AKA Mustang) is supported by the Thin and OCI drivers including support for the new JDBC spec, JDBC 4.0. The new [oracle@prod jdbc]$ [oracle@prod jdbc]$ head /u01/app/oracle/product/11.2.0/dbhome_1/jdbc/Readme.txt Oracle JDBC Drivers release 11.2.0.1.0 production Readme.txt ========================================================== What Is New In This Release ? ----------------------------- Universal Connection Pool In this release the Oracle Implicit Connection Cache feature is deprecated. Users are strongly encouraged to use the new Universal [oracle@prod jdbc]$
While it might be expected that the drivers are different given each comes from a different 11g release of the specific product it could still lead to a source of confusion. And what if you are not aware of the difference in product releases?
Third party Software vendors are not obligated to adhere to a directory or file naming convention when using JDBC. This makes identifying the driver just by inspecting the file system difficult if not impossible.
Java provides an Interface called DatabaseMetaData
that can be used to find a variety of information about the database. The Interface provides four methods that return information pertaining to the JDBC Driver used.
String getDriverName() // Retrieves the name of the JDBC Driver String getDriverVersion() // Retrieves the version of the JDBC Driver String getDriverMajorVersion() // Retrieves the JDBC Driver Major Version number String getDriverMinorVersion() // Retrieved the JDBC Driver Minor Version number
Below is a simple Java class that makes a connection to a database and uses a DatabaseMetaData object to retrieve the JDBC Driver Name and version.
import oracle.jdbc.OracleConnection; import oracle.jdbc.pool.OracleDataSource; import java.sql.SQLException; import java.sql.DatabaseMetaData; import java.util.Properties; public class JDBCVersionInfo { public static void main(String[] args) { try { // Set up user connection properties Properties prop = new Properties(); prop.setProperty("user","hr"); prop.setProperty("password","password"); // open the connection OracleDataSource ods = new OracleDataSource(); ods.setConnectionProperties(prop); ods.setURL(/java/determine-jdbc-driver-version/"jdbc:oracle:thin:@/prod:1521/proddb"); OracleConnection ocon = (OracleConnection)ods.getConnection(); DatabaseMetaData dbmd = ocon.getMetaData(); System.out.println("Driver Name: " + dbmd.getDriverName()); System.out.println("Driver Version: " + dbmd.getDriverVersion()); } catch(SQLException e) { System.out.println(e.getMessage()); } } }
If you are familiar with compiling and executing Java code feel free to skip the rest of the post. For those that are not familiar with compiling and executing Java code the steps below will help you to compile the and execute the Java code on your machine.
In order to run this you will need need the Java JDK installed on your system and the JAVA_HOME/bin
directory should be in your path (example /opt/java/jdkx.x.x_xx/bin
).
Copy the code above and save in a file called JDBCVersionInfo.java.
The name and case are important. Provide a user name and an password that are valid for your system in prop.setProperty
lines 13 and 14.This code just makes a connection to the database no statements are executed.
Next on line 20 replace the prod:1521/proddb
with the database server, port number and database name that are valid for your system.
After saving the changes we can now compile the program. Below is the command to compile the program. Change the path following the -cp
to a path and JDBC driver on your system.
[oracle@prod code]$ javac -cp /u01/app/oracle/product/11.2.0/dbhome_1/jdbc/lib/ojdbc5.jar JDBCVersionInfo.java [oracle@prod code]$ [oracle@prod code]$ ls JDBCVersionInfo.class JDBCVersionInfo.java [oracle@prod code]$
Once the code have been compiled you will have two files with same name but different extensions. One will have the .java
extension and the other will have the extension .class
.
Next we run the compiled class file with command below. Note that the command to execute the class file is similar to the command to compile. Make sure you replace your path and file name in the command below. Also be sure to keep the trailing ;.
.
[oracle@prod code]$ java -cp /u01/app/oracle/product/11.2.0/dbhome_1/jdbc/lib/ojdbc5.jar;. JDBCVersionInfo Driver Name: Oracle JDBC driver Driver Version: 11.2.0.1.0-Production [oracle@prod code]$
Here we see the version of the JDBC driver with no guesswork.
Isn’t this way a bit faster?
dmitry@winbox$ cd /cygdrive/c/app/oracle/product/11.2.0/client_1/jdbc/lib
$ java -jar ojdbc6.jar
Oracle 11.2.0.1.0 JDBC 4.0 compiled with JDK6
$
???
Hello Dmitry,
Yes, that is much faster! Thank you for you sharing!
Eric
did you try it with ojdbc14.jar too? 😉
The java -jar trick does not work with ojbc14.jar. In that case, you need to use the JDBCVersionInfo.java code
Thankyou for this article !
I wondered if there is an 11.2.0.3 version for Linux ..
I will search ..
thanks for your upload. I found this informative, and managed to resolve my
problem with your content. Thanks again I will share on Facebook.