oracle之 Got minus one from a read call 与 ORA-27154: post/wait create failed

简介:

在部署应用的时候,有时候应用可以直接启动,但偶尔应用却无法启动,报错信息是: 

java.sql.SQLRecoverableException: IO Error: Got minus one from a read call  如图:

原因及解决方法

我有好几个应用系统需要连接数据库,测试发现如果这个应用在最开始启动就不会报错,如果是启动了好几个应用之后再启动的话就会报错了。
一个应用连接数据库的时候是通过连接池的机制来连接的,数据库用一个参数max-session来描述连接池的大小,而应用同样也有一个参数,这个参数表示它连接数据库连接池所占用的最少资源,例如:总共有10个应用需要连接数据库,如果每个应用连接数据库的最小连接数为10,那么10个应用总共会有100个连接(可以看做是线程数),这样就要求数据库连接池的max-session必须大于100,否则就会报“ Got minus one from a read call”的错误。 
因此,有两种方法可以解决这个问题: 
(1)扩大数据库连接池,这个需要系统数据库管理员来协助完成 
(2)减小应用连接数据库时需要的初始化连接数 
我的这个应用是java应用,关于数据库的设置在配置文件jdbc.properties里面,内容如下:

jdbc.driverClass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@nantianpaydb.baidupay.com:8002:ntpzn
jdbc.user=cif
jdbc.password=cif

#druid datasource
druid.initialSize=10
druid.minIdle=10
druid.maxIdle=100
druid.maxActive=500
druid.maxWait=30000
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 1 from dual
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.poolPreparedStatements=true
druid.maxPoolPreparedStatementPerConnectionSize=20
druid.filters=wall,stat


其中

druid.initialSize=10


就是一个应用连接数据库的初始化参数,只要将之调小即可解决问题。

扩展:如果由于调整了process 导致 数据库启动不来,报错如下

ORA-27154: post/wait create failed
ORA-27300: OS system dependent operation:semget failed with status: 28
ORA-27301: OS failure message: No space left on device
ORA-27302: failure occurred at: sskgpcreates

确认 df -h 、free -m 存储与内存充足情况下, 留意是不是 sem 信号量设置不当

# cat /proc/sys/kernel/sem
250 32000 32 128
-- 与上面对应
# semaphores: semmsl, semmns, semopm, semmni

设置 SEMMSL
SEMMSL 内核参数用于控制每个信号集合的最大信号数。

Oracle 建议将 SEMMSL 设置为 init.ora 文件(适用于 Linux 系统上所有数据库)中的最大 PROCESS 实例参数设置再加上 10。此外,Oracle 建议将 SEMMSL 设置为不小于 100。

设置 SEMMNI

SEMMNI 内核参数用于控制整个 Linux 系统中信号集的最大数量。Oracle 建议将 SEMMNI 设置为不小于 100。

设置 SEMMNS

SEMMNS 内核参数用于控制整个 Linux 系统中的信号(而非信号集)的最大数量。

Oracle 建议将 SEMMNS 设置为系统上每个数据库的 PROCESSES 实例参数设置之和,加上最大的 PROCESSES 的两倍,最后为系统上的每个 Oracle 数据库加上 10。

使用以下计算式确定可以在 Linux 系统上分配的信号的最大数量。它将是以下两者中较小的一个值:

SEMMNS -or- (SEMMSL * SEMMNI) 

设置 SEMOPM

SEMOPM 内核参数用于控制每个 semop 系统调用可以执行的信号操作数。

semop 系统调用(函数)能够使用一个 semop 系统调用完成多个信号的操作。一个信号集可以拥有每个信号集中最大数量的 SEMMSL,因此建议将 SEMOPM 设置为等于 SEMMSL。

Oracle 建议将 SEMOPM 设置为不小于 100。

设置信号内核参数

最后,我们来看如何使用一些方法来设置所有信号参数。在下文中,我想更改(增加)的唯一参数是 SEMOPM。所有其他的默认设置可以完全满足我们的示例安装。

可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/kernel/sem) 来更改所有信号设置的默认设置,而不必重新引导计算机:
# sysctl -w kernel.sem="250 32000 100 128"

然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf

文章可以转载,必须以链接形式标明出处。


本文转自 张冲andy 博客园博客,原文链接: http://www.cnblogs.com/andy6/p/7559893.html   ,如需转载请自行联系原作者
相关文章
|
监控 安全 C#
attempt to write a readonly database错误的解决(C#,SQLite)
今天打包WPF程序,安装后总是打不开,查看监控日志原来是SQLite的问题,报错如图     当向SQLite数据库中存入新纪录时总是显示attempt to write a readonly a database。
3252 0
|
SQL 关系型数据库 Oracle
ORA-01466: unable to read data - table definition has changed
1. Oracle建议我们等待大约5分钟之后再进行flashback query新创建的表,否则可能会碰到这个错误ORA-01466: unable to read data - table definition has changed.
1717 0
使用DBLINK查询时报ORA-00600: internal error code, arguments: [kzdlk_zt2 err]
  >                          >                                     ...
1444 0
解决webstom failed to change read-only files
我百思不得其解的是,为何我的文件不让我更改,变成了只读模式,后来我仔细回忆了一下,原来是因为我使用了root权限,来安装thinkjs之后,webstom没有root权限,所以我使用root,在终端敲下如下命令,即可解决问题 chown -R ae6623 lv-node 我解释一下,如上的命令...
1116 0