javaoracle-databasejdbcora-12560

Cannot connect to Oracle DB from Java - ORA-12560: TNS:protocol adapter error


This is my first Java application I am creating (using Eclipse IDE) and the second Oracle based app (I'm a .NET/MSSQL guy for years). The first Oracle app I wrote in .NET did not have any issues, and I'm trying to connect to the same server.

My code is very simple. Here it is:

  OracleDataSource ods = new OracleDataSource();
            ods.setURL("jdbc:oracle:oci:@");
            ods.setUser("username");
            ods.setPassword("password");
            ods.setServerName("servername");
            ods.setPortNumber(1549);
            ods.setServiceName("foo.myservice.com");
   Connection conn = ods.getConnection();

I get below exception:

Exception in thread "main" java.sql.SQLException: ORA-12560: TNS:protocol adapter error

at oracle.jdbc.driver.T2CConnection.checkError(T2CConnection.java:737)
at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:401)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
at oracle.jdbc.driver.T2CConnection.<init>(T2CConnection.java:148)
at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:53)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:280)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:207)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:157)
at Select.GetScalar(Select.java:47)
at Job.Run(Job.java:20)
at Main.main(Main.java:19)

I have google'd the hack out of this.. I've tried adding a 'TNS entry to the tnsnames.ora file'. I've tried adding '##NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)' to the sqlnet.ora file. I've tried various other things but nothing is working.

Has anyone experienced this before and has any clue on how to get this to work?? Am I using the wrong version? Server is remote (I don't have Oracle server installed locally, just client). Maybe I have wrong version of Java SDK or the wrong version of the JDBC .jar file?? I just need to connect to Oracle and run a single simple query! Thanks much for any help.


Solution

  • Try using the type IV JDBC driver instead of OCI if you can. The thin url looks like this:

    jdbc:oracle:thin:@host[:port]/service
    

    I'd try code that looked more like this (fill in your defaults for the driver, URL, username, and password):

        package persistence;
    
        import java.sql.*;
        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;
    
        public class DatabaseUtils
        {
    
            private static final String DEFAULT_DRIVER = "";
            private static final String DEFAULT_URL = "";
            private static final String DEFAULT_USERNAME = "";
            private static final String DEFAULT_PASSWORD = "";
    
            public static void main(String[] args)
            {
                String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER);
                String url = ((args.length > 1) ? args[1] : DEFAULT_URL);
                String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME);
                String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD);
    
                Connection connection = null;
    
                try
                {
                    connection = createConnection(driver, url, username, password);
                    DatabaseMetaData meta = connection.getMetaData();
                    System.out.println(meta.getDatabaseProductName());
                    System.out.println(meta.getDatabaseProductVersion());
                }
                catch (Exception e)
                {
                    e.printStackTrace(); 
                }
                finally
                {
                    close(connection);
                }
            }
    
            public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException
            {
                Class.forName(driver);
    
                if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0))
                {
                    return DriverManager.getConnection(url);
                }
                else
                {
                    return DriverManager.getConnection(url, username, password);
                }
            }
    
            public static void close(Connection connection)
            {
                try
                {
                    if (connection != null)
                    {
                        connection.close();
                    }
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
    
    
            public static void close(Statement st)
            {
                try
                {
                    if (st != null)
                    {
                        st.close();
                    }
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
    
            public static void close(ResultSet rs)
            {
                try
                {
                    if (rs != null)
                    {
                        rs.close();
                    }
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
    
            public static void rollback(Connection connection)
            {
                try
                {
                    if (connection != null)
                    {
                        connection.rollback();
                    }
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
    
            public static List<Map<String, Object>> map(ResultSet rs) throws SQLException
            {
                List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
    
                try
                {
                    if (rs != null)
                    {
                        ResultSetMetaData meta = rs.getMetaData();
                        int numColumns = meta.getColumnCount();
                        while (rs.next())
                        {
                            Map<String, Object> row = new HashMap<String, Object>();
                            for (int i = 1; i <= numColumns; ++i)
                            {
                                String name = meta.getColumnName(i);
                                Object value = rs.getObject(i);
                                row.put(name, value);
                            }
                            results.add(row);
                        }
                    }
                }
                finally
                {
                    close(rs);
                }
    
                return results;
            }
        }