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