zoukankan      html  css  js  c++  java
  • JDBC连不上Oracle数据库的解决方法

    JDBC连不上Oracle数据库的解决方法

        问题: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 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进程处于可用状态。最普遍的通过网络连接。

  • 相关阅读:
    ubuntu+VS code+launch.json+task.json
    C++——运行时类型识别RTTI
    C++——模板
    C++——class类和struct结构体的唯一区别
    C++——右值引用
    C++——智能指针
    身份证号码格式检测
    PHP获取图片主题颜色
    PHP 压缩图片质量
    redis3.2装完后 其它机子访问爆protocol error, got 'n' as reply type byte
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400793.html
Copyright © 2011-2022 走看看