Oracle数据库三种连接方式

访问Oracle数据库,可以通过三种方式:第一种方式是应用进程直接访问数据库实例的共享内存,第二种方式是通过beq协议在本机上访问

访问oracle数据库,可以通过三种方式:第一种方式是应用进程直接访问数据库实例的共享内存,第二种方式是通过beq协议在本机上访问,第三种方式是通过网络协议访问。第一种方式使用的场合很少,我们不做讨论。下面着重讨论通过第二种和第三种方式访问数据库。

首先,后两种访问数据库的方式都是基于two-task结构的,都需要在数据库服务器上建立一个服务进程(server进程,或者前台进程)来为客户端应用服务(在这里我们只讨论独立服务器模式,共享服务器模式十分类似,我们将在后面进行专题描述)。two-task架构下访问数据库,首先需要在服务器端创建一个进程,这个进程启动时先要映射共享内存,然后才能够通过共享内存中的内部数据结构完成会话的初始化工作。

在本机上不经过SQL*Net连接数据库,前台进程和用户进程之间通过IPC机制进行通信,通信协议就是著名的Bequeath协议,简称BEQ协议。而如果通过SQL*Net连接数据库,那么就需要使用网络协议。现在TCP/IP协议已经成为使用最为广泛的协议,因此我们主要面对的是TCP/IP协议,而10多年前,著名的SPX协议、DECnet协议、Token Ring协议等都曾经是DBA进程配置的协议。使用SQL*Net协议的前台进程和用户进程之间的通信采用Socket通信。实际上,在服务器上,我们也可以使用SQL*Net连接数据库,只不过我们很少会去这样做,因为BEQ协议在效率上高于Socket通信。

除了使用的协议不同,在本机上通过BEQ协议连接数据库实例和通过SQL*Net连接数据库实例还有什么不同吗?很多DBA可能会感觉有所不同,因为在本机上直接连接数据库协议,前台进程是shell进程产生的子进程;而通过SQL*Net连接数据库实例,server进程是LISTENER(tnslsnr)产生的子进程,如果监听器进程的属性不同,那么产生的子进程会和shell直接产生的子进程有所不同。这一点不同在早期的Oracle版本中确实存在,而自从$ORACLE_HOME/bin/oracle这个映像文件被设定为s属性后,这个问题就不存在了。Oracle映像通过s属性可以将子进程的属性转为Oracle用户。

不过使用BEQ协议和网络协议在服务进程方面还是有所不同的,BEQ协议通过IPC通信,因此不需要使用Socket,而通过网络协议(SQL*Net)连接,客户进程最初连接的是tnslsnr进程,tnslsnr进程接受了连接请求后,为其创建一个子进程,然后通知客户端进程重新连接到子进程上继续工作。在这个时候,就存在一个Socket重定向的问题。监听器产生子进程时会为新的连接分配一个未被使用的端口号,,这个子进程启动后就在该端口上侦听,同时监听器会通知客户端进程,要求其重定向到新的端口号。此时客户端进程会关闭老的Socket,并打开一个新的Socket,完成登录操作。

火山方舟 火山方舟

火山引擎一站式大模型服务平台,已接入满血版DeepSeek

火山方舟 99 查看详情 火山方舟

可能有些DBA对上面的讨论感到有些迷茫了,怎么讨论实例的问题,一下子又转到了监听器的工作机制上了,这些知识对于DBA又有什么作用呢?我们刚才一直在强调实例是客户端访问数据库的通道,因此讨论客户端如何通过监听器连接数据库就十分有意义了。

首先第一点,现在很多客户对系统安全性要求很高,因此服务器上大量的网络端口是被封掉的,只有必须使用的才会被开放。那么对于Oracle数据库来说,我们只需要开放监听器所需要的端口就可以了吗?事实上不是这样的,除了开放类似1521的监听端口外,我们还需要开放一些高端口,这些端口将被用于Socket重定向。

可能很多用户在客户端连接数据库的过程中经常会碰到TNS-12535之类的错误,开始的时候总是从网络超时的角度去分析,不过这样分析往往很难找到真正的故障原因。这类问题在一个存在防火墙的环境中,往往是由于在防火墙环境下的Socket重定向引起的,特别是在有NAT功能的防火墙上,这类问题很容易出现。客户端连接的是一个NAT翻译后的IP地址,而重定向的时候,监听器要求客户端连接到真实的IP地址上,这样就会出现连接超时导致的失败。这种情况一般的解决方案是使用connect manager(CMAN),老白也曾经碰到过几个这样的客户,最后都是通过CMAN来彻底解决问题的。

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/561420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 01:04:37
下一篇 2025年11月10日 01:21:00

相关推荐

  • 解决node-oracledb Thin模式下不支持0x939密码验证器错误

    本文旨在解决使用node-oracledb在thin模式下连接oracle数据库时遇到的“密码验证器类型0x939不受支持”错误。该问题通常源于数据库使用了较旧的密码哈希算法。教程将详细介绍针对不同oracle数据库版本的解决方案,包括启用thick模式、调整数据库参数以及重置用户密码等,以确保no…

    2025年12月21日
    100
  • 如何使用C#调用Oracle数据库?需要什么提供程序?

    推荐使用Oracle.ManagedDataAccess,通过NuGet安装后,使用OracleConnection连接数据库,注意配置正确的连接字符串并避免生产环境硬编码。 要在C#中调用Oracle数据库,你需要使用合适的数据库提供程序来建立连接、执行命令和处理结果。目前最常用的是Oracle官…

    2025年12月17日
    000
  • python-oracledb 游标与绑定变量:连接管理与数据持久化解析

    本文深入探讨了 `python-oracledb` 中游标对象 (`cursor`) 和绑定变量 (`cursor.var()`) 的工作机制及其生命周期。我们将澄清绑定变量在客户端Python环境与服务端Oracle数据库会话之间的行为差异,特别是数据在连接断开与重连后是否保持的问题。文章还将提供…

    2025年12月14日
    000
  • python-oracledb 游标对象详解:生命周期、绑定变量与连接管理

    本文深入探讨 `python-oracledb` 中游标对象(cursor)和绑定变量(bind variables)的工作机制。我们将阐明 `cursor.var()` 如何创建客户端 Python 对象以管理绑定变量,并解释数据库会话与游标的生命周期。通过示例代码,纠正关于连接关闭与重开后变量值…

    2025年12月14日
    000
  • 解决Oracle中pd.read_sql的IN子句参数绑定问题

    本文探讨了在使用pandas的`pd.read_sql`函数查询oracle数据库时,针对`in`子句无法直接绑定python元组或列表参数的`databaseerror`问题。核心内容是揭示oracle驱动的参数绑定机制,并提供一种将元组/列表动态展开为多个命名参数的有效解决方案,确保sql查询的…

    2025年12月14日
    000
  • 动态SQL查询:根据日期范围检索数据库表

    本文介绍如何使用动态SQL查询数据库中表名包含特定日期范围的表。虽然将数据存储在多个按日期命名的表中通常不是最佳实践,但本文提供了一种使用动态SQL来解决此问题的方案,包括从数据字典中提取表名,解析日期,以及构建和执行包含 UNION ALL 操作的查询。同时,本文也建议采用更规范化的数据存储方式,…

    2025年12月12日
    200
  • 从Oracle BLOB数据类型在PHP中显示图片:常见问题与解决方案

    本文详细阐述了如何通过php脚本从oracle数据库中获取blob格式的图片数据并正确显示在网页上。核心在于确保php脚本仅输出图片二进制流,避免任何额外的字符或html标签,并正确设置http `content-type` 头。文章将提供示例代码和关键注意事项,帮助开发者避免常见的“图片无法显示”…

    2025年12月12日
    000
  • Oracle视图应用实战

    1、 在Oracle数据库中创建视图,并通过查询语句获取视图中的数据内容。 2、 对已存在的Oracle视图进行结构或定义修改,并执行重新编译以确保其有效性。 3、 %ignore_a_1%览当前数据库中存在的视图列表,并根据需要删除指定的视图对象。 4、 执行对Oracle视图的数据查询操作,同时…

    2025年12月3日 软件教程
    000
  • 开启Oracle数据库闪回功能

    –关闭数据库,需要将数据库打开到mount状态才能开启闪回功能: SQLgt; shutdown immediate Database closed. Database dismoun –关闭数据库,需要将数据库打开到mount状态才能开启闪回功能: sql> shut…

    2025年12月2日 数据库
    000
  • Oracle数据库管理常用的监控脚本——极大的简化运维工作

    最近几天都研究SHELL脚本,为了方便对公司的Oracle运维,简化管理,学习一些SHELL脚本是非常有必要的,通过书本和网上的一些资料 最近几天都研究shell脚本,为了方便对公司的oracle运维,简化管理,学习一些shell脚本是非常有必要的,通过书本和网上的一些资料,整理出了一些比较精典的脚…

    数据库 2025年12月2日
    000
  • Oracle数据库之PL/SQL的”适配”新生

    32位的PL/SQL在64的机子上无法连接64位的Oracle数据库。本来笔者已经放弃使用PL/SQL的,而是选择使用Oracle 的SQL Developer。可 两天真是有够郁闷的,原因无他,32位的pl/sql在64的机子上无法连接64位的oracle数据库。本来笔者已经放弃使用pl/sql的…

    2025年12月2日 数据库
    000
  • Oracle数据库使用NFS存储,启动报错提示无法锁定文件

    Oracle报错信息: SQLgt; startup gt; ORA-10997: another startup/shutdown operation of this instance inprogress gt; ORA oracle报错信息: SQL> startup > ORA-…

    2025年12月2日 数据库
    100
  • Oracle数据库根据不同条件给同一字段修改相应的值

    Oracle数据库根据不同条件给同一字段修改相应的值: 例如:根据职务调整雇员的工资,如果职务为ldquo;SALESMANrdquo;或者ldquo oracle数据库根据不同条件给同一字段修改相应的值: 例如:根据职务调整雇员的工资,如果职务为“SALESMAN”或者“ANALYST”工资上调1…

    2025年12月2日 数据库
    000
  • 优化JPA动态计数查询:规避EXISTS子句及其性能考量

    本文探讨了jpa在使用`criteriabuilder`进行`countdistinct`操作时,可能生成包含`exists`子句的sql计数查询,尤其是在eclipselink等特定jpa实现中。我们将分析`exists`子句的性能影响,并指出其并非总是低效。文章提供了多种优化策略,包括评估现有查…

    2025年12月2日 java
    000
  • 高效管理Oracle日期列:使用触发器自动注入SYSDATE

    本教程将详细介绍如何在Oracle数据库中,通过创建数据库触发器,实现数据行插入或更新时,自动将当前数据库系统日期(SYSDATE)注入到指定日期列。该方法确保了日期数据的准确性和一致性,避免了应用层手动管理的复杂性,是处理此类需求的高效且推荐实践。 在数据库应用开发中,一个常见的需求是自动记录数据…

    2025年12月2日 java
    100
  • Oracle数据库:利用触发器实现列的SYSDATE自动更新

    本文将详细介绍如何在oracle数据库中,通过创建数据库触发器,实现数据表列(如`dat_update`)在每次插入或更新操作时自动获取并存储当前的数据库系统日期(`sysdate`)。针对应用层(如hibernate的`@columntransformer`)难以有效管理数据库原生时间戳的场景,数…

    2025年12月2日 java
    000
  • 如何在Oracle数据库中利用触发器自动更新SYSDATE时间戳

    本文详细介绍了在oracle数据库中,如何通过创建数据库触发器,实现对指定日期时间列(如`dat_update`)的自动管理。当数据行发生插入或更新操作时,该列将自动接收数据库当前的`sysdate`值,确保时间戳的准确性和一致性。文章通过具体示例代码演示了触发器的创建、测试及其工作原理,并探讨了相…

    2025年12月2日 java
    000
  • 在Oracle数据库中利用触发器实现列自动更新SYSDATE

    本文详细阐述了如何在Oracle数据库中,通过创建数据库触发器,实现对指定日期列(如`dat_update`)的自动更新。当数据发生插入或更新操作时,该列将自动接收数据库的当前系统日期(`SYSDATE`),确保数据的时间戳一致性和准确性。教程将涵盖触发器的创建、配置及实际测试,是确保数据层时间戳自…

    2025年12月2日 java
    100
  • Oracle数据库中实现列自动更新SYSDATE的专业指南

    本教程详细介绍了如何在oracle数据库中利用数据库触发器,实现对指定列(如`dat_update`)在数据插入或更新时自动填充或更新为数据库系统时间(`sysdate`)。通过创建`before insert or update`触发器,确保了时间戳的精确性和一致性,无需应用层额外干预,提供了一个…

    2025年12月2日 java
    100
  • 深入理解Hibernate One-to-One映射与外键约束处理

    本文深入探讨了hibernate中一对一(one-to-one)关联映射的常见问题,特别是当父实体依赖于子实体时,可能导致的外键约束违规。通过分析`question`和`answer`实体间的映射示例,我们揭示了`ora-02291`错误的根源,并提供了两种有效的解决方案:手动控制持久化顺序或利用`…

    2025年12月2日 java
    000

发表回复

登录后才能评论
关注微信