有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这是我正在创建的第一个Java应用程序(使用EclipseIDE)和第二个基于Oracle的应用程序(我多年来一直是.NET/MSSQL专家)。我写的第一个Oracle应用程序。NET没有任何问题,我正在尝试连接到同一台服务器

  • 我已安装:
    • “Java 2平台,企业版1.4 SDK”
    • 'Java DB`10.5.3.0' -'Java(TM)6更新21
    • 'Java(TM)SE开发工具包6更新21
    • “Oracle IRM客户端”(11g)
    • Oracle 11g Release 2 JDBC Drivers(ojdbc6.jar)

我的代码非常简单。这是:

  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();

我得到以下例外:

线程“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)

我已经用谷歌破解了这个。。我已尝试将“TNS”条目添加到tnsnames。ora文件'。我试着加上“##的名字。目录_PATH=(TNSNAMES,EZCONNECT)“”到sqlnet。ora文件。我试过其他各种方法,但都不管用

以前是否有人经历过这种情况,并且对如何使其发挥作用有任何线索??我使用了错误的版本吗?服务器是远程的(我没有在本地安装Oracle服务器,只有客户端)。可能我有错误版本的JavaSDK或错误版本的JDBC。jar文件??我只需要连接到Oracle并运行一个简单的查询!谢谢你的帮助


共 (3) 个答案

  1. # 1 楼答案

    如果可以的话,尝试使用type IV JDBC驱动程序而不是OCI。精简url如下所示:

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

    我会尝试这样的代码(填写驱动程序、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;
            }
        }
    
  2. # 2 楼答案

    如果你想要简单的东西,你应该尝试使用瘦客户端而不是OCI客户端。 不要忘记包含正确的jar(对于Java 5,ojdbc5.jar;对于Java 6,ojdbc6.jar)

  3. # 3 楼答案

    您指定的ServiceName是否是您尝试连接到的Oracle实例的服务名称?你确定端口正确吗