Oracle共享连接是一种多用户共享服务器进程的连接模式,和专用连接不同,它不需要为每个用户连接单独分配服务器进程,适合高并发短事务的业务场景。要实现共享连接,除了数据库实例层面的参数配置,监听器的参数配置也是关键步骤,只有两者匹配才能让共享连接正常工作。

Oracle共享连接监听核心参数说明
监听配置中涉及共享连接的核心参数主要有以下几个,不同参数对应不同的配置位置:
- DISPATCHERS:属于数据库实例参数,用于指定共享服务器的调度进程数量和配置,是共享连接生效的基础,需要先在实例中设置。
- SHARED_SERVER:属于数据库实例参数,用于指定共享服务器进程的最小数量,同样需要先完成实例层面的配置。
- PROTOCOL:监听配置中的协议参数,共享连接通常基于TCP协议,需要在监听地址配置中明确指定。
- SERVICE:监听配置中的服务名参数,需要和数据库实例的服务名匹配,确保监听能正确识别共享连接请求对应的服务。
共享连接监听配置完整步骤
第一步:配置数据库实例参数
先登录Oracle数据库,设置共享连接相关的实例参数,执行以下SQL语句:
-- 设置调度进程参数,这里配置2个TCP协议的调度进程,服务名为orcl ALTER SYSTEM SET DISPATCHERS='(PROTOCOL=TCP)(SERVICE=orcl)(DISPATCHERS=2)' SCOPE=BOTH; -- 设置共享服务器最小进程数为3 ALTER SYSTEM SET SHARED_SERVERS=3 SCOPE=BOTH; -- 可选:设置最大共享服务器进程数,避免资源过度占用 ALTER SYSTEM SET MAX_SHARED_SERVERS=10 SCOPE=BOTH;
设置完成后可以通过查询视图确认参数是否生效:
-- 查询调度进程配置 SELECT * FROM V$DISPATCHER_CONFIG; -- 查询共享服务器进程状态 SELECT * FROM V$SHARED_SERVER;
第二步:修改监听器配置文件
Oracle监听器配置文件默认路径为$ORACLE_HOME/network/admin/listener.ora,我们需要在配置中添加共享连接相关的服务描述。以下是一个完整的监听配置示例:
# listener.ora 配置示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
)
)
# 共享连接服务配置,需要和实例中的SERVICE参数匹配
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SERVICE_NAME = orcl)
# 标记该服务支持共享连接
(ENVS = "DISPATCHERS=(PROTOCOL=TCP)(SERVICE=orcl)")
)
)第三步:重启监听并验证配置
修改完配置文件后,需要重启监听器让配置生效,执行以下命令:
# 停止监听 lsnrctl stop # 启动监听 lsnrctl start # 查看监听状态,确认共享服务已经注册 lsnrctl status
在监听状态输出中,如果能看到服务名orcl下包含"Shared"相关的服务描述,说明共享连接的监听配置已经生效。
共享连接验证方法
配置完成后,可以通过客户端使用共享连接方式连接数据库验证是否生效,连接时指定SERVER=SHARED参数:
-- 客户端连接字符串示例,使用共享连接模式 CONNECT username/password@//192.168.0.1:1521/orcl?SERVER=SHARED
连接成功后,可以查询视图确认当前连接是共享连接:
-- 查询当前连接的服务器模式,如果SERVER为SHARED则说明共享连接生效
SELECT SID, SERIAL#, SERVER FROM V$SESSION WHERE SID = (SELECT SYS_CONTEXT('USERENV','SID') FROM DUAL);常见问题排查
如果共享连接无法建立,可以先排查以下几个点:
- 检查实例的DISPATCHERS和SHARED_SERVERS参数是否正确设置,是否重启了实例让参数生效。
- 检查listener.ora中的服务名是否和实例的服务名完全一致,HOST地址和端口是否正确。
- 检查防火墙是否放开了监听端口1521的访问权限,避免网络层面拦截连接请求。
- 查看监听日志$ORACLE_HOME/network/log/listener.log,根据日志中的错误信息定位具体问题。