2014年10月14日火曜日

MyBatisで実行したInsertの戻り値が「-2147482646」を返す

掲題の問題発生から解消までの一部始終です。

今まで動いていたプログラムがある日突然、正常系処理が通らないようになり、
原因を調べてみたところ、MyBatisの処理を呼び出した後の返却値が
「-2147482646」となっていることがわかりました。

その原因および原因究明までの経緯をメモしておきます。

発生原因

applicationContext.xmlに変更を加えていたため。

【元】

  <beans
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

【変更後】

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:spring-dwr="http://www.directwebremoting.org/schema/spring-dwr"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <context:annotation-config />
 <context:component-scan base-package="~~~~~~" />
アノテーションによるComponentScanを利用しようとして、いくつかのスキーマ定義を
読み込ませたことが悪かったようです。

根源

調べてみてもわからず。

追加xmlスキーマを読んで挙動が変わったか、annotation-configの宣言で
ライブラリの読み込まれる順番、初期値などが変化したのかわかりませんが、
これ以上追う事はやめました。


発生経緯から、その他調べたこと

今回の件とは違うのですが、エラーコードで調べていくと幾つかの解決案が
ネット上に出ていたので、備忘録的にメモしておきます。

やったこと

機能追加でソースを修正し、その後発生。
現象が発生している箇所は全く修正していない。


エラーコードで調べてみると、英文サイトで以下が見つかりました。

http://www.just4e.com/mybatis-3.0.4/docs/reference/org/apache/ibatis/executor/BatchExecutor.html

public static final int BATCH_UPDATE_RETURN_VALUE
Constant Value: -2147482646 (0x800003ea)


要は、バッチ更新モードの戻り値が、「-2147482646」だという事。



バッチ更新モードに変えたつもりもないし、そのようなソース変更履歴もない。

しかも、他の人のパソコンで実行した結果を確認してもらうと「1」 = 登録結果行数
こっちが正しいはずなので、私の実行環境がおかしい。
※当然、同じプログラムを実行してます。



調べてみると、以下のような会話が。
https://groups.google.com/forum/#!searchin/mybatis-user/2147482646%7Csort:relevance/mybatis-user/ddRPVRzwvlc/n5I_1YgKqSsJ

SqlSession session = sqlMapper.openSession(ExecutorType.SIMPLE);


BatchModeで開くのではなく、Simpleモードで開く。ということなので、
ソースを探してみたところ、数か所でopenSession(); を発見。
初期値がどうなっているかは調べもしないでとりあえず (ExecutorType.SIMPLE) を指定して再ビルド:実行



結果、変わらず。

その後、mybatisのドキュメントより初期値を発見。初期値はSIMPLEでした。
http://mybatis.github.io/mybatis-3/ja/configuration.html

既定値の変更(defaultExecutorType)ができるようなので、設定名でソースを検索したが結果、該当なし。


別観点としてデータベースとのコネクション周りを疑い、他のデータベースへ接続しても現象同じ。


というところで調査をやめて、コミット単位のモジュールで調査して行ったところ
上記の原因へ至ったという次第でした。


まとめ

今回の発生起因は「annotationを使いたい」ために色々といじったことが原因でした。
実装の根幹を変えるような変更を行う際は十分注意しましょう。

0 件のコメント: