*

[Java]DbUtilsでORA-12519エラー

公開日: : 最終更新日:2015/04/27 java, Oracle

DbUtilsを使ってたんですが、Oracleに対して処理するとORA-12519というエラーコードで例外が投げられてしまって悩んでました。

具体的なエラー

ソース

private static String url = "jdbc:oracle:thin:@localhost:1521:xe";
private static String user = "wannabe";
private static String pass = "wannabe";

public static void main(String[] args){
    OracleDataSource ds;
    try {
        ds = new OracleDataSource();
        ds.setURL(url);
        ds.setUser(user);
        ds.setPassword(pass);
        Connection con = ds.getConnection();
        QueryRunner runner = new QueryRunner(ds);
        String sql = "SELECT * FROM hoge_table";
        ResultSetHandler<List<Map<String, Object>>> rs = new MapListHandler();
        for(int i = 0; i < 1000; i++){
            runner.query(sql, rs);
        }

    } catch (SQLException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }
}

出てくるエラー

致命的: null
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

こんな感じのメッセージ。
意味としては接続しようとしたら拒否されました、という意味です。
これを引き起こす原因としてよくあるのはConnectionやResultSetのcloseし忘れです。

しかしながら、DbUtilsってそこらへんの煩雑な処理を隠蔽して、自動で行ってもらうためのユーティリティです。
じゃあクローズしてあるはずでは?

仮説

切断は確実にDbUtilsは行っているはず。
Oracleのセッション数は150ぐらい設定してあったはず。
で、あればセッションが切断し切れていないのでしょうか。

という仮説を立ててソースを以下に書き直して実験してみます。

public static void main(String[] args) throws InterruptedException{
    OracleDataSource ds;
    try {
        ds = new OracleDataSource();
        ds.setURL(url);
        ds.setUser(user);
        ds.setPassword(pass);
        Connection con = ds.getConnection();
        QueryRunner runner = new QueryRunner(ds);
        String sql = "SELECT * FROM hoge_table";
        ResultSetHandler<List<Map<String, Object>>> rs = new MapListHandler();
        for(int i = 0; i < 1000; i++){
            runner.query(sql, rs);
            Thread.sleep(50);
        }

    } catch (SQLException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }
}

処理の繰り返し部分で0.05秒中断してみました。

結果

上手く動いてしまいました。

ということで仮説はあたらずとも遠からず。
Oracleの設定を変えればもしかしたら中断しなくてもいいかもしれません。
ちなみに結局PreparedStatementを使うように書き直しました。
調査はとりあえずここまで。

ad

関連記事

wannabenote

[Java, Oracle]NetBeansでojdbc6.jarに参照設定をし、JavaでOracleに接続する。

NetBeansでJavaでOracleに接続する そんなプログラムを作りたい。 というわけで作

記事を読む

NetBeans

[Java, NetBeans]NetBeansをインストールしてHelloWorldまで。

JavaのIDEは? よく挙げられるのがEclipseとNetBeans。 前はExclipse

記事を読む

wannabenote

[jt400, java]AS400用のJavaをPCで実行したとき、終了しない理由

終了しない JavaでAS400をいじってると、たまに、終了しないんです。 プロセスが残ったまま

記事を読む

wannabenote

[Oracle, NetBeans]NetBeansからOracleのテーブルを参照できるように設定するまで

IDEとデータベース プログラムとデータベースというのは切っても切れない関係が多く、多くのIDEで

記事を読む

wannabenote

[Oracle, SQLDeveloper]Oracleの構築とSQLDeveloperを設定、GUIでテーブルを表示するまで

Oracleを使い込む必要が出来たので、その備忘録です。 とりあえずはインストールから環境構築して

記事を読む

logo

[jt400, Java]レコードレベルアクセスの実現

到着順 AS400のファイルシステムですと、レコードを読み込んで、処理して、出力して、次のレコード

記事を読む

logo

[Oracle].dmpファイルからデータをインポートする

データをもらったぞ さぁインポートだ。 .dmp だめぽファイルですって。もうだめぽ。

記事を読む

logo

[Java, DBUtils]ApacheのDBUtilsを利用して、データベースにアクセスする。

手抜きがしたい オブジェクト指向をする上で、o/r mapperが欲しくなります。 かなーり昔に

記事を読む

logo

[jt400, Java]AS400のファイルを更新するためにREADした時にRecord Lockをかける

RPG3なんかだと更新用のファイルはREADの瞬間に自動でレコードロックがかかります。 で、それを

記事を読む

logo

[Java, jt400]AS400のCLからJavaをCallする方法。

久しぶりにAS400ネタ。 CLからJavaを呼び出したい!! JavaをCLから実行したい

記事を読む

ad

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑