sql plu可以连接,但是使用jdbc连接oracle的时候报数据库的错误ORA-12505:监听程序当前无法识别连接描述符中所给出的SID
这个是由于Oracle的service_name 和sid_name不一致,而PL/SQL DEVELOPER和SQLPLUS 采用service_name进行连接,而应用程序是按照sid_name进行连接,所以出现PL/SQL DEVELOPER和SQLPLUS 能够连接而应用程序却无法连接的问题。

1.查找SID名:借助Oracle的sqlplus工具并以管理员方式连接敲命令查看:select instance_name from v$instance;必须是管理员身份,否则“视图不存在”。

2.打开数据库实例的目录,例如:D:\oracle\software\product\11.2.0\dbhome_1\NETWORK\ADMIN
找到listener.ora文件(listener监听器进程的配置文件),使用文本编辑器打开。

3.打开后

# listener.ora Network Configuration File: D:\oracle\software\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\oracle\software\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\oracle\software\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    #这一段是需要增加的,GLOBAL_DBNAME和SID_NAME用查到的sid,ORACLE_HOME与上面该文件的保持一致。
    (SID_DESC =  
      (GLOBAL_DBNAME = orcl)  
      (ORACLE_HOME =  D:\oracle\software\product\11.2.0\dbhome_1)  
      (SID_NAME = orcl)  
    )  
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = kws-PC)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = D:\oracle\software

4.jdbc连接数据库

Connection conn=null;  
        try {  
            Class.forName("oracle.jdbc.driver.OracleDriver");//找到oracle驱动器所在的类  
            String url="jdbc:oracle:thin:@localhost:1521:orcl"; //URL地址  @ip:端口:sid
            String username="drp";  
            String password="drp";  
            conn=DriverManager.getConnection(url, username, password);  

        } catch (ClassNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (SQLException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  

    }  
//关闭连接
  public static void close(PreparedStatement pstmt){  
        if(pstmt !=null){  
            try {  
                pstmt.close();  
            } catch (SQLException e) {  

                e.printStackTrace();  
            }  
        }  
    }  

    public static void close(ResultSet rs){  
        if(rs !=null){  
            try {  
                rs.close();  
            } catch (SQLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    } 
     public static void close(Connection con){  
        if(con !=null){  
            try {  
                con.close();  
            } catch (SQLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    } 
//数据库操作
 String sql="insert into t_user(user_id,user_name,time)values(?,?,?)"; //?为参数占位符  
 PreparedStatement pstmt=null; //通常利用PreparedStatement进行操作,性能得到优化  
        try{  

            pstmt=conn.prepareStatement(sql);  
            pstmt.setString(1, user.getUserId());  
            pstmt.setString(2,user.getUserName());  
            pstmt.setTimestamp(3, new Timestamp(new Date().getTime()));//获取当前系统时间  
            pstmt.executeUpdate();//执行增删改操作  

        }catch(SQLException e){  
            e.printStackTrace();  
       }finally{
       close(pstmt);
       close(conn);
        }
//如果是查询的话对ResultSet的处理
 if(rs.next()){                
                user=new User();  
                user.setUserId(rs.getString("user_Id"));  
                user.setUserName(rs.getString("user_name")); }

jdbc连接oracle

格式一: Oracle JDBC Thin using a ServiceName: 
 jdbc:oracle:thin:@//:/ 
 Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE


注意这里的格式,@后面有//, 这是与使用SID的主要区别。
这种格式是Oracle 推荐的格式,因为对于集群来说,每个节点的SID 是不一样的,但是SERVICE_NAME 确可以包含所有节点。

格式二: Oracle JDBC Thin using an SID: 
 jdbc:oracle:thin:@:: 
 Example: jdbc:oracle:thin:@192.168.2.1:1521:X01A 
 Note: 
 Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.格式三:Oracle JDBC Thin using a TNSName: 
 jdbc:oracle:thin:@ 
 Example: jdbc:oracle:thin:@GL 
 Note: 
 Support for TNSNames was added in the driver release 10.2.0.1

关于sid和service name
可以这样理解:一个公司比喻成一台服务器,数据库是这个公司中的一个部门。
1、SID:一个数据库可以有多个实例(如RAC),SID是用来标识这个数据库内部每个实例的名字,
就好像一个部门里,每个人都有一个自己的名字。
2、SERVICE_NAME:是这个数据库对外宣称的名字,外面的人要想连接我这个数据库,
你就在客户端的连接串里写上service_name。它就像一个部门的名字,这个部门的名称在看门大爷(listener)那里有登记

具体定义:
1、数据库名是Oracle数据库的内部标识,一般在安装完后不应该改变,数据库的很多物理存储目录都用到了数据库名。
2、Instance_Name,ORACLE_SID,数据库实例名,是数据库和操作系统交互时用到的名称。
如果在一台机器上创建了多个数据库,通过Sqlplus想连接到其中的一个数据库,就需要指明ORACLE_SID:set ORACLE_SID=SIDNAME
sqlplus / as sysdba(这种连法只能在本机用,会根据ORACLE_SID连接到对应的实例)
通常碰到的12560错误一般就是因为实例名被错误修改或者服务没有被启动。
Instance_Name则是数据库的一个参数.
3、Service Name:服务名,如果数据库有域名则等同于Global DB Name、没有的话则等同于数据库名,这是因为数据库启动后会自动把数据库名注册到监听成为服务名,同时数据库参数service_names也会注册为服务名,所以一个数据库可以有多个服务名.
当在Oracle8i,9i,10g的客户端连接Oracle8i,9i,10g服务器的时候,主机字符串应该使用服务名。
4、Net Service Name:网络服务名,也有人叫TNS别名、网络连接串(connect string),在tnsnames.ora中配置的名称,如下面例子的DBTNS.
sqlplus sys/sys@orcl as sysdba(这种连法会根据tnsnames.ora中配置的网络服务名连接到本机或者远程的oracle,走的是网络通信)

linux下查询sid的方法:除了上述方法外还可以
在配置oracle环境变量的情况可以使用 echo $ORACLE_SID,如果没有可以使用ps -ef |grep oracle 来查询:
oracle 2548 1 0 Aug17 ? 00:00:00 ora_pmon_xxxx
后面的xxxx就是对应的sid。

在windows环境下,oracle是以后台服务的方式被管理的,所以看”控制面板->管理工具->服务 里面的名称:”OracleServiceORCL”,则ORCL就是sid;

service name
一般默认情况下sid与你的数据库的名称是一样的!
show parameter service_names