在程序的运行中,有时候数据库会断开连接,然后报下面错误:
ORA-12519: TNS:no appropriate service handler found 可用的服务处理程序没有找到。
1. 简单解释下什么是service handler,以及service handler是什么时候被调用的?
在客户端和数据库oracle进行通信时,oracle需要进行完成一个过程"服务注册 (service registration)" . 服务注册是将数据库提供的服务名称,实例名,可用服务处理程序,端口号等告知listener 的过程。 当客户端的请求到达listener时,listenser将会选择一个合适的service handlers为之服务。可用的服务处理程序(service handlers)用于调度和派生子程序。
下面是参考的一篇文章http://blog.chinaunix.net/uid-20802110-id-4153116.html
2. 排查和解决
//查看所配置的processes最大连接数量
SQL> show parameter process;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
cell_offload_processing boolean TRUE
db_writer_processes integer 2
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 1000
log_archive_max_processes integer 4
processes integer 550 (配置最大连接进程550)
processor_group_name string
或
SQL> select value from v$parameter where name ='processes';
VALUE
--------------------------------------------------------------------------------
550
//查看所配置sessions最大连接数量
SQL> show parameter session;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
session_cached_cursors integer 50
session_max_open_files integer 10
sessions integer 848 (配置最大连接sessions 550)
shared_server_sessions integer
//查看实际process的连接数量 (包括oracle自身本地连接进程数和非本地的连接进程数)
SQL> select count(*) from v$process;
COUNT(*)
----------
45
//查看非本地连接数量
oracle@sha-oracle-04:~/export/dmpfiles/temp> ps -ef|grep LOCAL=NO|wc -l
15
oracle连接常见的有带LOCAL=NO参数或带LOCAL=YES的进程。
LOCAL=NO:非本地连接,即网络连接。它是通过Listener 连接到服务器的。客户端的应用通过客户端的监听向服务器的监听发送请求,服务器的监听接收后,在与数据库连接,执行相关操作,在把结果返回给客户端。这是通过监听的流程。 所以在客户端需要配置监听,即配置tnsnames.ora。
LOCAL=YES:本地连接。 本地连接不走监听,所以在服务监听没有启动的情况下,通过本地的sqlplus 还是可以连上数据库的。
//查看处于活动状态的进程列表(用户名和进程名)
SQL> select spid,username,program from v$process;
SPID USERNAME
------------------------ ---------------
PROGRAM
------------------------------------------------
PSEUDO
5747 oracle
oracle@sha-oracle-04 (PMON)
5752 oracle
oracle@sha-oracle-04 (PSP0
46 rows selected.
//更改最大进程数量
SQL> alter system set processes = 550 scope = spfile;
System altered.
修改system表的processes字段为550,
Oracle 里面有个叫做spfile的东西,就是动态参数文件,里面设置了Oracle 的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。更改参数的时候,有4种scope选项。scope就是范围
++ scope=spfile 仅仅更改spfile里面的记载,不更改内存,也就是不立即生效,而是等下次数据库启动生效。有一些参数只允许用这种方法更改
++ scope=memory 仅仅更改内存,不改spfile。也就是下次启动就失效了
++ scope=both 内存和spfile都更改
++ 不指定scope参数,等同于scope=both.
//关闭数据库instance
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
//启动数据库instance
SQL> startup
ORACLE instance started.