サーバーを再起動した後、TomcatサーバーからのOracle接続は毎晩タイムアウトします。再起動する前は、接続はタイムアウトしませんでした。これで、朝、アプリケーションはDBにアクセスしているときにJDBC接続エラーをスローします。 Tomcatを再起動すると問題が修正されます。これは、接続が再確立されたためだと思います。これは、Oracle DBがセッションをタイムアウトしたことが原因だと思います。 Oracle 11gでセッションタイムアウトを無効にするにはどうすればよいですか?
ありがとうございます。
スティーブ
開発とテストを省略したConfig.groovy。
dataSource {
pooled = true
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}
// environment specific settings
environments {
production {
dataSource {
driverClassName = "Oracle.jdbc.driver.OracleDriver"
username = "XXXXX"
password = "XXXXXX"
dialect = "org.hibernate.dialect.Oracle10gDialect"
dbCreate = "update" // one of 'create', 'create-drop','update'
url = "jdbc:Oracle:thin:@XXXXXX:1521:xxxx"
}
} }
これは通常、Tomcatが接続しているユーザーに関連付けられたプロファイルによって制御されます。
SQL> SELECT PROFILE, LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME = 'IDLE_TIME';
PROFILE LIMIT
------------------------------ ----------------------------------------
DEFAULT UNLIMITED
SQL> SELECT PROFILE FROM DBA_USERS WHERE USERNAME = USER;
PROFILE
------------------------------
DEFAULT
したがって、接続しているユーザーのアイドル時間は無制限です-タイムアウトはありません。
Adamはすでにデータベースプロファイルを提案しています。
SQLNET.ORAファイルを確認できます。 EXPIRE_TIME パラメータがありますが、これは既存の接続を終了するのではなく、失われた接続を検出するためのものです。
夜間に発生することを考えると、アイドルタイムアウトのように聞こえ、アプリサーバーとデータベースサーバーの間のファイアウォールに到達する可能性があります。 EXPIRE_TIMEを設定するとmay発生を停止します(クライアントが生きているかどうかをチェックするために10分ごとにチェックが行われるため)。
または、データベースがシャットダウンして再起動され、接続が切断されている可能性があります。
または、Tomcatを validationQuery で構成して、Tomcatを再起動せずに接続を自動的に再起動できるようにする必要があります。
これは、おそらくアプリケーションの接続プールが原因です。 Oracle DBMSの問題ではありません。ほとんどの接続プールには、接続を提供する前に実行できる検証ステートメントがあります。 Oracleでは、「デュアルから1つ選択」が必要です。
サーバーを再起動した後に発生し始めた理由は、接続プールが再起動なしで追加された可能性があり、接続プールの使用を初めて経験しているためです。データベース接続を処理するリソースファイルの変更日はいつですか?
クエリの検証例:
<Resource name="jdbc/EmployeeDB" auth="Container"
validationQuery="Select 1 from dual" type="javax.sql.DataSource" username="dbusername" password="dbpassword"
driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database"
maxActive="8" maxIdle="4"/>
EDIT:Grailsの場合、Grailsプールには同様の構成オプションがあります。 Grails 1.2の例( Grails 1.2 のリリースノートを参照)
dataSource {
pooled = true
dbCreate = "update"
url = "jdbc:mysql://localhost/yourDB"
driverClassName = "com.mysql.jdbc.Driver"
username = "yourUser"
password = "yourPassword"
properties {
maxActive = 50
maxIdle = 25
minIdle = 5
initialSize = 5
minEvictableIdleTimeMillis = 60000
timeBetweenEvictionRunsMillis = 60000
maxWait = 10000
}
}
アイドル時間ではなく合計セッションライフタイムに基づいてOracleセッションプールの有効期限を有効にする方法を探すためにこの質問に行きました。もう1つの目標は、アプリケーションで予期せぬ強制終了を回避することです。
プール 検証クエリ を設定することで可能であるようです
select 1 from V$SESSION
where AUDSID = userenv('SESSIONID') and sysdate-LOGON_TIME < 30/24/60
これにより、アプリケーションに影響を及ぼさない予測可能な方法で30分を超えるエージングセッションが終了します。
DBは接続がドロップしたことを知っていますか、それともセッションはまだv $ sessionにリストされていますか?これは、ネットワークによってドロップされていることを示していると思います。問題が発生するまでにアイドル状態を維持できる時間、およびTCPアイドル値(net.ipv4.tcp_keepalive_time、tcp_keepalive_probesおよびtcp_keepalive_intervalがsysctlから正しくリコールした場合)に類似している場合)?デフォルトでsysctlの変更が持続するかどうかを思い出せませんが、それは変更され、再起動によってリセットされたものである可能性があります。
また、サーバー全体をバウンスせずにJDBC接続をリセットできる場合もあります。確かにWebLogicではできますが、私はそれほど役に立ちませんが、Tomcatの同等機能についてはよく知りません。
Oracleデータベースのセッションタイムアウト設定を変更するのではなく、アプリケーション接続プール設定を確認します。彼らがタイムアウトするのは正常です。
こちらをご覧ください: http://grails.org/doc/1.0.x/guide/3.%20Configuration.html#3.3%20The%20DataSource
「pooled」パラメータを正しく設定しましたか?
挨拶、ラース
編集:
あなたの設定は最初の一見では問題ないようです。今日、この問題に遭遇しました。多分それはあなたの痛みに関連しています:
"データベースがメンテナンスのために停止しているときにアプリケーションが起動すると、例外の無限ループ"