Friday, August 5, 2022

[Solved] How to solve java.lang.UnsatisfiedLinkError: no ocijdbc11 in Java with Oracle 11g, 12c, 19c and 21c

"java.lang.unsatisfiedlinkerror no ocijdbc11 in java.library.path" error comes when you try to connect to Oracle 11g database using OCI (thick) driver by using tns name, but the ocijdbc11.dll file is not available in PATH or java.library.path environment variable. ocijdbc11.dll is a native library and if you know Java searches native library in PATH or a location specified by java.library.path system property, if it doesn't find the dll, then it throws java.lang.unsatisfiedlinkerror no ocijdbc11 in java.library.path error. This dll is usually found in C:\Programs\Oracle\ora11g\bin\ocijdbc11.dll, but it could vary depending upon your Oracle installation.

By the way, this error can come with different Oracle version and missing ODBC driver for example you can get similar error with different version number when you to connect to Oracle 12c, 18c, 19c, or even 21c. The only thing which will be differnet is the version of the DLL which is missing. So all the tips you will learn in this article can be used to solve the UnsatisfiedLinkError with different Oracle and ODBC version.

The first step to solving this error is a search for this dll in your machine, if you are using windows, just search in your C drive. If the dll is not there then you need to download that from Oracle's website. If it's already present then just add its location into PATH variable.

If you are explicitly providing java.library.path then also provide it there e.g.
-Djava.library.path=C:\Programs\Oracle\ora11g\bin\ocijdbc11.dll .

By the way, this is not the standard way to connect to the Oracle database from Java. Oracle users mainly use OCI drivers for OS authentication or if they don't know the IP address of the server and want to connect using TNSE, but if you are not concerned of that, you can always use Oracle JDBC thin driver to connect. For that, you just need to include ojdbc.jar in your classpath.

Just remember if you use an OCI URL e.g. "jdbc:oracle:oci:/@"+tnsName then you are using a thick driver and you need oracle client libraries on the PATH, for that you need Oracle client to be installed on your machine, but if you use the thin driver with following URL format "jdbc:oracle:thin:@"+dbServer+":"+port+":"+SID; you just need driver's JAR file and no native library will be required because of its type 4 pure Java driver.




Error - java.lang.UnsatisfiedLinkError: no ocijdbc11 in Java

Here is the complete error this could be different for different ODBC version but if you are getting an UnsatisfiedLinkError with JDBC ODBC library then all the steps mentioned here can be used to solve your problem.   
Exception in thread "main" java.lang.UnsatisfiedLinkError:
  no ocijdbc11 in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)


Analysis - What is the root cause of java.lang.UnsatisfiedLinkError: no ocijdbc11 error?

If you look at the error you will find that Java is complaining that ocijdbc11 dll is not found in java.library.path. If you further look then you will say that Oracle Driver is using System.loadLibrary() method to load the native library, which explains why Java is searching for dll in java.library.path.

Btw, this is optional if you don't provide this system property Java will look on all folders included in PATH environment variable.




Solution: How to fix java.lang.UnsatisfiedLinkError: no ocijdbc11 in Java 

There are two ways to solve the problem, first check if ocijdbc11.dll is present in your machine or not. For that do a wide search on your C driver where programs are installed.

If you don't find this dll file then you need to install Oracle client to get this dll. If you install Oracle 11g in 64-bit Windows 7 machine then this native library can be found in C:\Programs\Oracle\ora11g\bin\ocijdbc11.dll folder. Now just add this folder to your PATH and run your program again, provided any other error you should be able to connect to Oracle server.

The second solution is to use Oracle JDBC thin driver to connect Oracle database. For this you need to change your JDBC URL format as "jdbc:oracle:thin:@"+dbServer+":"+port+":"+SID; and include ojdbc6.jar in to your CLASSPATH.

Always remember the difference between PATH and CLASSPATH, PATH is used to locate executable files, native library files but JAR is always loaded from the classpath. This is also the standard way to connect to Oracle 11g database.

 By the way, if you truly want to learn Java database programming from scratch, I suggest you take a look at these best JDBC courses for Java programmers. This course explains every important detail of Java database connectivity. You can also see Core Java Volume II - Advanced Features by Cay S. Horstmann to learn more about database programming in Java using JDBC. One of the complete books to learn Java.



java.lang.unsatisfiedlinkerror no ocijdbc11 in java.library.path in SQL Developer

After Toad, Oracle's SQL Developer is the next popular tool for connecting to Oracle database and this a Java client. That's why you need both thick and thin drivers in your machine, which I guess also comes when you install SQL Developer. It uses the thick driver when using the TNS name and thin driver when using the basic connection.

For the thick driver, you need ocijdbc11.dll in your PATH and for the thin driver, you need ojdbc6.jar or ojdbc6_g.jar, later one is a debug version. So if you get this error while using SQL Developer, follow the above step to sort it out.

If you are using Oracle 10g then you will likely to see java.lang.unsatisfiedlinkerror no ocijdbc10 in java.library.path, the solution is same find the dll and add into PATH. Also, ojdbc6.jar can be found in C:\Programs\Oracle\ora11g\jdbc\lib\ location, where ORACLE_HOME.

How to fix java.lang.unsatisfiedlinkerror no ocijdbc11 in java.library.path


Since this is also a type of java.lang.unsatisfiedlinkerror, you can also see this tutorial to get a general idea about how to solve this error in Java. You will likely to see this type of error whenever your Java program will use native libraries, either internal or external to do stuff.


That's all about how to fix java.lang.unsatisfiedlinkerror no ocijdbc11 in java.library.path error in Java. You get this error when you try to connect to an Oracle 11g database from Java program by using its TNS name and not the IP address. You can fix this error by adding ocijdbc11.dll in your PATH environment variable or into your java.library.path variable.

If that DLL is not available in your system then download and install Oracle client like SQL Developer, which contains both thick and thin JDBC driver to connect to Oracle database. 

If you get java.lang.unsatisfiedlinkerror no ocijdbc10 in java.library.path means you are connecting to Oracle 10g database but the solution is same with the only difference in Oracle version difference. Let us know if you face any issue while connecting to Oracle database from Java and I will try to help you here. 

Other common error which comes while connecting to a database like Oracle, MySQL, SQL SERVER from Java program :
  • How to connect to MySQL database from Java Program [steps]
  • General Guide to solve java.lang.ClassNotFoundException in Java [guide]
  • java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory? [solution]
  • How to solve java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver in Java? [solution]
  • How to fix java.lang.ClassNotFoundException: org.postgresql.Driver error in Java? [solution]
  • How to solve java.lang.ClassNotFoundException:org.Springframework.Web.Context.ContextLoaderListener [solution]
  • How to solve java.lang.ClassNotFoundException: com.mysql.jdbc.Driver in Java MySQL? [solution]

3 comments:

  1. Your instructions are very thorough but I'm still stuck. Would you mind helping? Thank you.

    ReplyDelete
  2. Hello rstaad, Sure, can you explain the problem and what you have tried so far?

    ReplyDelete
  3. Can you please help me here. I've oracle 11g installed but and ocijdbc11.dll is in the path but i'm getting error for ocijdbc10.dll

    "If you get java.lang.unsatisfiedlinkerror no ocijdbc10 in java.library.path means you are connecting to Oracle 10g database but the solution is same with the only difference in Oracle version difference. Let us know if you face any issue while connecting to Oracle database from Java and I will try to help you here. "

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    ----------------
    ----------------

    ReplyDelete