问题:sqlplus可以连上数据库,但是在外部通过JDBC却连不上
解决方法:
1. 先看几个配置文件:listener.ora tnsnames.ora sqlnet.ora
sqlnet.ora-----作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串.假如我的sqlnet.ora是下面这个样子
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那么,当你连接数据库的时候,如sqlplus sys/oracle@XE 客户端就会首先在tnsnames.ora文件中找XE的记录.如果没有相应的记录则尝试把XE当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上的GLOBAL_DBNAME=XE这个实例。如果sqlnet.ora是这个样子:
NAMES.DIRECTORY_PATH= (TNSNAMES)
那么客户端就只会从tnsnames.ora查找XE的记录。
tnsnames.ora------这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES时,才会尝试使用这个文件。
listener.ora------listener监听器进程的配置文件。listener进程,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。
listener.ora的例子
#下面定义LISTENER进程为哪个实例提供服务
#这里是XE,并且它对应的ORACLE_HOME和GLOBAL_DBNAME
#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做数据库连接
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME =XE)
(ORACLE_HOME = F:\Oracle\app\oracle\product\10.2.0\server)
(SID_NAME = XE)
)
)
#监听器的名字,一台数据库可以有不止一个监听器
#再向下面是监听器监听的协议,ip,端口等,这里使用的tcp1521端口,并且使用的是主机名
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = HUAN)(PORT = 1521))
)
上面的例子是一个最简单的例子,但也是最普遍的。一个listener进程为一个instance(SID)提供服务。
2. 问题解决步骤
(1) 在sqlnet.ora中增加一条(我用的是主机名做数据库连接)
NAMES.DIRECTORY_PATH= (HOSTNAME)
(2) 修改listener.ora文件
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = F:\Oracle\app\oracle\product\10.2.0\server)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = F:\Oracle\app\oracle\product\10.2.0\server)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = XE)
(GLOBAL_DBNAME=XE)
(ORACLE_HOME = F:\Oracle\app\oracle\product\10.2.0\server)
#(PROGRAM = extproc)
)
)
其中红色部分是新增内容,然后lsnrctl stop,lsnrctl start一下,问题搞定
3. 排错常用命令
tnsping XE
lsnrctl stop
lsnrctl start
lsnrctl reload
lsnrctl status
show sga //查看instance是否已经启动
select open_mode from v$database; //查看数据库是打开还是mount状态。
show parameter v$instance_name;
show parameter v$database;
show parameter db;
show parameter service_name;
4. 几种连接命令形式
1) sqlplus / as sysdba 这是典型的操作系统认证,不需要listener进程
2) sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需要listener进程
3) sqlplus sys/oracle@XE 这种方式需要listener进程处于可用状态。最普遍的通过网络连接。
小小问题却花费了我一个晚上的时间,最后要感谢陪我辛苦了一晚上的老婆,让你受累了,老婆,对不起!
分享到:
相关推荐
JDBC连接Oracle数据库常见问题及解决方法
NULL 博文链接:https://joinyo.iteye.com/blog/1947696
java使用JDBC和ODBC连接oracle数据库,虽然ODBC连接数据库不常用,但是大家还是可以了解一下
JDBC连接ORACLE数据库 源码
利用JDBC连接ORACLE数据库; 利用JDBC对ORACLE数据库进行增、删、改和查。
使用JDBC连接Oracle数据库使用JDBC连接Oracle数据库
JDBC连接oracle数据库
如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数 据。...本文将为大家介绍通过JDBC连接Oracle数据库的十大技巧。
JDBC连接Oracle数据库的代码和编写JDBC的经验
jdbc 连接mysql、oracle数据库的驱动
通过JDBC连接oracle数据库的十大技巧
JDBC连接oracle数据库.doc
JDBC实现Oracle数据库的增删改查
Oracle连接数据库JDBC驱动包,对于老版本的oracle,连接驱动比较难找比较难找,甲骨文官网下载难以查找旧版JDBC驱动。 压缩包搜集了几个版本的JDBC驱动,适用于Oracle9i 10,11等。
关于JDBC连接oracle数据库的步骤实例,新手可以借鉴,第一步加载驱动的时候可以用DriverManager或者Class.forName,下面注释掉的都是正确的代码,新手可以看看,高手勿喷
JDBC——连接oracle数据库
oracle数据库JDBC驱动oracle 10g方便连接oracle10g数据库使用
oracle驱动 JDBC连oracle数据库用,放心下载,绝对可用!
JDBC连接数据库各种数据库参数大全 1、Oracle8/8i/9i数据库(thin模式) 2、DB2数据库 3、Sql Server7.0/2000数据库 4、Sybase数据库 5、Informix数据库 6、MySQL数据库 7、PostgreSQL...
连接的是oracle 11g,配置成功,查询,更新,都测试成功了