本文针对Oracle的避免无解决方案,只尽量保持程序可以顺利运行。只是遇到问题的现象描述。如今很多项目的数据库即将转为mysql的国内二开数据库等其他类型的数据库。不知道以后会不会还有人用Oracle数据库。
查日志程序除首次退出记录数据库线程僵死,利用sqlplus直接连接,发现也僵死。针对这个现象作为开发,客户端我们是可以控制阻塞和非阻塞。一般为了防止因为服务端异常僵死,我们一般采用非阻塞连接,其他环境数据库异常我们一般会获得连接超时。而这次却僵死很久。因此反馈数据库异常,运维排查数据库服务器CPU100%。
程序在线却不服务,进行源码分析。发现首次重启进行主线程连接数据库加载。因此数据库连接僵死。造成程序无法正常服务。而以前其他环境数据库异常会报道time out 无连接僵死的情况。根据程序对落盘要求不高的项目性质,提供程序进行优化方案,数据库操作脱离主线程。而数据库提供的数据进行本地备份,作为程序启动优先加载项目,保证数据库异常可以业务畅通。
针对开发经验反馈给DBA客户端配置是否有相关设置可以设置超时配置,后续暂无解决方案。自己查阅Oracle官方文档,看到的是服务端的配置项数据。反馈给DBA,暂时没有客户端的配置项。
?
SQLNET.RECV_TIMEOUT=3
?
SQLNET.SEND_TIMEOUT=3
https://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#NETRF227
?
You can also set this parameter on the client-side to specify the time, in seconds, for a client to wait for response data from the database server after connection establishment. Without this parameter, the client may wait a long period of time for a response from a database server saturated with requests. If you choose to set the value, then set the value to an initial low value and adjust according to system and network capacity. If necessary, use this parameter with the SQLNET.SEND_TIMEOUT parameter
注﹕在修改sqlnet.ora文件之后重新启动监听﹐修改才能生效﹗﹗﹗
oracle网络设置主要包括三个文件,sqlnet.ora\ lisnter.ora\ tnsnames.ora
1、通过netmgr 可以配置 lisnter.ora 和 tnsnames.ora
2、lisnter.ora 为oracle服务器使用的监听器配置文件,监听器可以通过 lsnrctl 进行管理
3、tnsnames.ora 为客户端配置文件,为连接服务器的参数信息
4、sqlnet.ora 为服务端sql*net 网络配置文件,主要参数如下:
1.设置日志参数
#设置客户端和服务器端的log文件的目录
LOG_DIRECTORY_CLIENT
LOG_DIRECTORY_SERVER
#设置客户端和服务器端的log文件的名称
LOG_FILE_CLIENT
LOG_FILE_SERVER
2.设置默认的domain,会在连接中自动追加domain
NAMES.DEFAULT_DOMAIN
如设置NAMES.DEFAULT_DOMAIN=us.acme.com
使用conn scott/tiger@test连接数据库时会自动追加domain,变成conn scott/tiger@test.us.acme.com,而直接使用connscott/tiger@test.us.acme.com连接数据库则不会追加
//可以通过show parameter domain查看,一般将该参数注释掉;如果设置了该参数
//通过netmgr设置本地服务名时系统会在本地服务名后面自动追加该参数
//sql*plus访问时如果该参数存在,则会在服务名追加该参数,然后利用追加后的服务名,在tns中查找
//造成tnsping可以 但是使用sqlplus不可以的现象
3.设置客户端的命名方法和优先级(最常用的参数),可选值有tnsnames,onames,hostname,ldap等
NAMES.DIRECTORY_PATH
例如:names.directory_path =(tnsnames,onames,hostname)
//服务端的解析路径1.tnsname; 2.oname; 3.hostname
4.设置允许连入数据库的客户端版本,可选值10,9,8,7
SQLNET_ALLOWED_LOGON_VERSIONS
5.设置使用何种验证方式,可选值
none(使用用户名/密码的方式连接数据库)
all(使用所有方式的验证,包括OS验证)
nts(OS验证方式,连入OS后可以不用密码连接数据库)
SQLNET.AUTHENTICATION_SERVICES
6.设置客户端和服务器是否使用加密,可选值
accepted(如果对方设置为requested或required,则使用加密服务)
rejected(不使用加密服务,即使对方设置为requested也不使用)
requested(如果对方使用加密服务,则使用加密服务)
required(使用加密服务,如果对方没有使用则无法连接)
SQLNET.ENCRYPTION_CLIENT
SQLNET.ENCRYPTION_SERVER
#设置使用的加密算法
SQLNET.ENCRYPTION_TYPES_CLIENT
SQLNET.ENCRYPTION_TYPES_SERVER
7.设置连入数据库后必须在多长时间内完成认证(如:输入用户名/密码),超过此时间没有完成的话,数据库会断开此连接,并将客户端的IP地址和ORA-12170: TNS:Connect timeout occurred错误信息记录到sqlnet.log,而且客户端会收到ORA-12547: TNS:lost contact或ORA-12637: Packet receive failed错误信息。这个设置主要是为了防止denial-of-service攻击
SQLNET.INBOUND_CONNECT_TIMEOUT
8.设置在指定的时间间隔内必须有数据接收/发送,为了防止长时间的等待
SQLNET.RECV_TIMEOUT
SQLNET.SEND_TIMEOUT