🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

3回答

13808閲覧

Oracle11g ストアドパッケージコンパイル直後の呼出し失敗について

net-ohkubo

総合スコア7

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2020/11/27 08:11

DBサーバでPL/SQL(ストアドパッケージ)をリコンパイルを実施した後、
WEB-APサーバからJDBCを使用してストアドパッケージ呼出し時に、
必ず初回だけは正しく呼び出せずにエラーとなります。

WEB-APサーバはApache Tomcat 8/JDK1.8を使用、
DBサーバはOracle11gです。

エラーは以下

### Error querying database. Cause: java.sql.SQLException: ORA-04068: パッケージの既存状態は廃棄されました。 ORA-04061: package body "PKGXXXXX"の既存状態は無効になりました。 ORA-04065: 実行されませんでした。package body "PKGXXXXX"を変更または削除しています ORA-06508: PL/SQL: コールしているプログラム単位が見つかりませんでした: "PKGXXXXX"

上記エラー発生後、同じ操作を実施すると
2回目以降は同エラーは発生しなくなります。

ストアドパッケージのリコンパイルより前に
WEB-APサーバ側で保持されているJDBC接続プールに
何等かの情報が古いまま保持されているからかと思ったのですが
具体的にはどのようなことが起きているのでしょうか。

また、本事象を回避をするためには、
ストアドパッケージのコンパイル後必ず
JDBC接続プールクリアの操作が必要となるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/11/27 08:21

コンパイル後に接続しなおしていますか?
net-ohkubo

2020/11/27 08:41

ご返信ありがとうございます。 いえ、サービス時間中のコンパイルのため、JDBC接続しなおしてはいないです。
guest

回答3

0

PACKAGE の中でグローバル変数を使用していると、コンパイルしたときに、このエラーが発生します。

SQL

1CREATE OR REPLACE PACKAGE BODY PKG_TEST IS 2 G_VALUE VARCHAR2(10); -- ← こんな感じのやつ 3FUNCTION

セション1と2があったとして

(1) セション1で PACKAGE を実行
(2) セション2でコンパイル
(3) セション1で PACKAGE を実行←ここで発生
(4) セション1で PACKAGE を実行←正常に実行できる

コンパイル後にセション2で実行しても発生しません。
また、コンパイル後に接続したセションでも発生しません。

なので、コンパイルしたら JDBC のプールをリセットする、もしくはエラーを拾ってリトライするくらいしか手立てがないと思います。

参考資料:
「6 PL/SQLサブプログラムおよびパッケージのコード化#パッケージの無効化とセッションの状態」
https://docs.oracle.com/cd/E16338_01/appdev.112/b56259/adfns_packages.htm#g1042030

投稿2020/11/30 02:18

編集2020/11/30 05:34
KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/11/30 02:24

接続プールは自身だけリセットが出来るのですか?
KOZ6.0

2020/11/30 02:29

たぶんできないんじゃないでしょうか。 サービスを止められないのであれば、この手は使えませんね。
net-ohkubo

2020/12/07 08:08

KOZ6.0さん ご回答いただきましてありがとうございました。 分かりやすくご記載いただき理解が深まりました。 解決策については、ご記載以外でDBMS_SESSIONの RESET_PACKAGE()を用いると解決することができました。
KOZ6.0

2020/12/07 22:44

おーこれは知りませんでした。ありがとうございます。 でも、不安になることが書いてあるので、負荷テストを入念に行う必要があると思います。
guest

0

接続しなおしていないという事なので、多分キャッシュに残っている情報との不整合が生じているのではないでしょうか。

接続を止めずに、コンパイルしたことは無いので、推測ですが。

一般的にホットスタンバイにする場合には、多重化して行うものです。

投稿2020/11/27 12:57

編集2020/11/27 13:02
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

net-ohkubo

2020/12/07 08:09

saziさん ご回答いただきありがとうございました。 KOZ6.0さん ご回答いただきましてありがとうございました。 DBMS_SESSIONのRESET_PACKAGE()を用いると解決することができました。
guest

0

自己解決

以下の記事を参考に
PROCEDURE/FUNCTION COMPILE時のORA-04068回避方法

以下をパッケージBODY部に追記することで、
リコンパイル直後のエラーの事象が解消できましたので共有です。
DBMS_SESSION.RESET_PACKAGE();

投稿2020/12/07 08:03

net-ohkubo

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/12/07 08:44

リンク先には > RESET_PACKAGEは、すべてのパッケージ変数が初期値に再設定されることを保証します。 とありますが、 > ただし、パッケージ変数値の再設定がアプリケーションに影響を与えないことを確認してください。 ともありますから、積極的には利用すべきではないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問