oracle之 Got minus one from a read call 与 ORA-27154: post/wait create failed
在部署應(yīng)用的時(shí)候,有時(shí)候應(yīng)用可以直接啟動,但偶爾應(yīng)用卻無法啟動,報(bào)錯(cuò)信息是:?
java.sql.SQLRecoverableException: IO Error: Got minus one from a read call ?如圖:
原因及解決方法
我有好幾個(gè)應(yīng)用系統(tǒng)需要連接數(shù)據(jù)庫,測試發(fā)現(xiàn)如果這個(gè)應(yīng)用在最開始啟動就不會報(bào)錯(cuò),如果是啟動了好幾個(gè)應(yīng)用之后再啟動的話就會報(bào)錯(cuò)了。
一個(gè)應(yīng)用連接數(shù)據(jù)庫的時(shí)候是通過連接池的機(jī)制來連接的,數(shù)據(jù)庫用一個(gè)參數(shù)max-session來描述連接池的大小,而應(yīng)用同樣也有一個(gè)參數(shù),這個(gè)參數(shù)表示它連接數(shù)據(jù)庫連接池所占用的最少資源,例如:總共有10個(gè)應(yīng)用需要連接數(shù)據(jù)庫,如果每個(gè)應(yīng)用連接數(shù)據(jù)庫的最小連接數(shù)為10,那么10個(gè)應(yīng)用總共會有100個(gè)連接(可以看做是線程數(shù)),這樣就要求數(shù)據(jù)庫連接池的max-session必須大于100,否則就會報(bào)“ Got minus one from a read call”的錯(cuò)誤。?
因此,有兩種方法可以解決這個(gè)問題:?
(1)擴(kuò)大數(shù)據(jù)庫連接池,這個(gè)需要系統(tǒng)數(shù)據(jù)庫管理員來協(xié)助完成?
(2)減小應(yīng)用連接數(shù)據(jù)庫時(shí)需要的初始化連接數(shù)?
我的這個(gè)應(yīng)用是java應(yīng)用,關(guān)于數(shù)據(jù)庫的設(shè)置在配置文件jdbc.properties里面,內(nèi)容如下:
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
就是一個(gè)應(yīng)用連接數(shù)據(jù)庫的初始化參數(shù),只要將之調(diào)小即可解決問題。
擴(kuò)展:如果由于調(diào)整了process 導(dǎo)致 數(shù)據(jù)庫啟動不來,報(bào)錯(cuò)如下
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
確認(rèn) df -h 、free -m 存儲與內(nèi)存充足情況下, 留意是不是 sem 信號量設(shè)置不當(dāng)
# cat /proc/sys/kernel/sem
250 32000 32 128
-- 與上面對應(yīng)
# semaphores: semmsl, semmns, semopm, semmni
設(shè)置 SEMMSL
SEMMSL 內(nèi)核參數(shù)用于控制每個(gè)信號集合的最大信號數(shù)。
Oracle 建議將 SEMMSL 設(shè)置為 init.ora 文件(適用于 Linux 系統(tǒng)上所有數(shù)據(jù)庫)中的最大 PROCESS 實(shí)例參數(shù)設(shè)置再加上 10。此外,Oracle 建議將 SEMMSL 設(shè)置為不小于 100。
設(shè)置 SEMMNI
SEMMNI 內(nèi)核參數(shù)用于控制整個(gè) Linux 系統(tǒng)中信號集的最大數(shù)量。Oracle 建議將 SEMMNI 設(shè)置為不小于 100。
設(shè)置 SEMMNS
SEMMNS 內(nèi)核參數(shù)用于控制整個(gè) Linux 系統(tǒng)中的信號(而非信號集)的最大數(shù)量。
Oracle 建議將 SEMMNS 設(shè)置為系統(tǒng)上每個(gè)數(shù)據(jù)庫的 PROCESSES 實(shí)例參數(shù)設(shè)置之和,加上最大的 PROCESSES 的兩倍,最后為系統(tǒng)上的每個(gè) Oracle 數(shù)據(jù)庫加上 10。
使用以下計(jì)算式確定可以在 Linux 系統(tǒng)上分配的信號的最大數(shù)量。它將是以下兩者中較小的一個(gè)值:
SEMMNS -or- (SEMMSL * SEMMNI)?
設(shè)置 SEMOPM
SEMOPM 內(nèi)核參數(shù)用于控制每個(gè) semop 系統(tǒng)調(diào)用可以執(zhí)行的信號操作數(shù)。
semop 系統(tǒng)調(diào)用(函數(shù))能夠使用一個(gè) semop 系統(tǒng)調(diào)用完成多個(gè)信號的操作。一個(gè)信號集可以擁有每個(gè)信號集中最大數(shù)量的 SEMMSL,因此建議將 SEMOPM 設(shè)置為等于 SEMMSL。
Oracle 建議將 SEMOPM 設(shè)置為不小于 100。
設(shè)置信號內(nèi)核參數(shù)
最后,我們來看如何使用一些方法來設(shè)置所有信號參數(shù)。在下文中,我想更改(增加)的唯一參數(shù)是 SEMOPM。所有其他的默認(rèn)設(shè)置可以完全滿足我們的示例安裝。
可以通過使用以下命令直接更改 /proc 文件系統(tǒng) (/proc/sys/kernel/sem) 來更改所有信號設(shè)置的默認(rèn)設(shè)置,而不必重新引導(dǎo)計(jì)算機(jī):
# sysctl -w kernel.sem="250 32000 100 128"
然后,通過將該內(nèi)核參數(shù)插入到 /etc/sysctl.conf 啟動文件中,您可以使這種更改永久有效:
# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
本文轉(zhuǎn)自 張沖andy 博客園博客,原文鏈接:?http://www.cnblogs.com/andy6/p/7559893.html? ,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的oracle之 Got minus one from a read call 与 ORA-27154: post/wait create failed的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP系列(九)PHP文件系统处理
- 下一篇: 关于内核页表和进程页表的一个问题