简体   繁体   English

无法从Java连接到Oracle DB - ORA-12560:TNS:协议适配器错误

[英]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). 这是我创建的第一个Java应用程序(使用Eclipse IDE)和第二个基于Oracle的应用程序(我多年来一直是.NET / MSSQL人员)。 The first Oracle app I wrote in .NET did not have any issues, and I'm trying to connect to the same server. 我在.NET中编写的第一个Oracle应用程序没有任何问题,我正在尝试连接到同一台服务器。

  • I have installed: 我安装了:
    • 'Java 2 Platform, Enterprise Edition 1.4 SDK' 'Java 2平台,企业版1.4 SDK'
    • 'Java DB `10.5.3.0' -'Java(TM) 6 Update 21 'Java DB`10.5.3.0'-'Java(TM)6 Update 21
    • 'Java(TM) SE Development Kit 6 update 21 'Java(TM)SE开发套件6更新21
    • 'Oracle IRM Client' (11g) 'Oracle IRM客户端'(11g)
    • Oracle 11g Release 2 JDBC Drivers (ojdbc6.jar) Oracle 11g第2版JDBC驱动程序 (ojdbc6.jar)

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 线程“main”中的异常java.sql.SQLException:ORA-12560:TNS:协议适配器错误

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'. 我已经谷歌了解了这个...我试过在tnsnames.ora文件中添加一个'TNS条目'。 I've tried adding '##NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)' to the sqlnet.ora file. 我尝试将'## NAMES.DIRECTORY_PATH =(TNSNAMES,EZCONNECT)'添加到sqlnet.ora文件中。 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). 服务器是远程的(我没有在本地安装Oracle服务器,只是客户端)。 Maybe I have wrong version of Java SDK or the wrong version of the JDBC .jar file?? 也许我有错误版本的Java SDK或错误版本的JDBC .jar文件? I just need to connect to Oracle and run a single simple query! 我只需要连接到Oracle并运行一个简单的查询! Thanks much for any help. 非常感谢您的帮助。

Try using the type IV JDBC driver instead of OCI if you can. 如果可以,请尝试使用类型IV JDBC驱动程序而不是OCI。 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): 我会尝试看起来更像这样的代码(填写驱动程序,URL,用户名和密码的默认值):

    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;
        }
    }

If you want something simple, you should try using the THIN client instead of OCI client. 如果您想要简单的东西,您应该尝试使用THIN客户端而不是OCI客户端。 Don't forget to include the right jar (ojdbc5.jar for Java 5, ojdbc6.jar for Java 6). 不要忘记包含正确的jar(适用于Java 5的ojdbc5.jar,适用于Java 6的ojdbc6.jar)。

Is the ServiceName you specified the service name of the Oracle instance you're trying to connect to? ServiceName是否指定了您尝试连接的Oracle实例的服务名称? You're sure the port is correct? 你确定端口是正确的吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Error While making http request from Oracle DB Trigger - java.sql.SQLException: ORA-29273: HTTP request failed ORA-12541: TNS:no listener - Error While making http request from Oracle DB Trigger - java.sql.SQLException: ORA-29273: HTTP request failed ORA-12541: TNS:no listener Java Connect Oracle数据库TNS - Java Connect oracle DataBase TNS 使用 TNS 连接到外部 Oracle DB - Connect to an external Oracle DB using TNS JDBC Oracle 错误:java.sql.SQLException:ORA-12592:TNS:坏包 - JDBC Oracle error: java.sql.SQLException: ORA-12592: TNS:bad packet 无法连接到Oracle DB,因为java.sql.SQLException而出现错误:Io异常:网络适配器无法建立连接 - Not able to connect to Oracle DB getting error as java.sql.SQLException: Io exception: The Network Adapter could not establish the connection 使用Java连接到Oracle DB - Connect to Oracle DB with Java 如何将JDBC连接到tns oracle - How to connect JDBC to tns oracle java.sql.SQLException: ORA-12505, TNS:listener 当前不知道连接描述符中给出的 SID - java.sql.SQLException: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 从 Java 调用 Oracle Function 时出现错误 ORA-00900 - Error ORA-00900 while calling a Oracle Function from Java JDBC oracle连接错误:ORA-12519,TNS:找不到合适的服务处理程序 - JDBC oracle connection error: ORA-12519, TNS:no appropriate service handler found
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM