« S2DxoとJAXB2.0 その4 | Main | PostgreSQLのパーティショニングテーブル »

2007.07.21

S2DaoとPostgreSQLのパーティショニングテーブル

 PostgreSQLパーティショニングテーブルに対応しており、レコード件数が多くなる傾向のあるテーブルに対して適用すると効果があるといわれています。

 で、試しに「月単位」で別テーブルに切り替えるようなパーティショニングを作成し、S2Daoでデータを追加するような処理を書いたのですが・・・思わぬところではまってしまいました。

  • パーティショニングされたテーブルに対してInsertを行った場合、正しく書き込めても挿入件数の戻り値が"0"となってしまい、NotSingleRowUpdatedRuntimeException が発生する(従って、トランザクション制御を書けている場合はロールバックしてしまう)。
  • S2Daoを使用せず、普通にStatement等を使用してInsertをした場合も戻り値は0件なので、ドライバ側の問題?(パーティショニング後のテーブルに対して直接Insertをした場合の戻り値は1件となります)
  • 自動SQL生成機能を使用しない場合は、戻り値が0件でも例外は発生しないとのこと。
  • なので、.sqlファイルを生成し、Insert文を実行するように方針変更。
  • すると、今度は自動採番機能が機能せず、該当フィールドの値がnullとなってしまいDB側のドライバが例外をスローしてしまう。

  •  何も考えずに回避するのであれば、Insert文の呼び出し側のところで採番し、その値をセットしたEntityをInsertすればいいんでしょうが・・・なんか、それだとせっかくの採番処理の隠蔽(?)ができなくなってしまうので却下(まぁ、Insertを呼び出す箇所が1箇所ならそれでもいいんでしょうけど)。

     ってことで、たどり着いたのがinsert文に対してAOPを適用し、処理前に採番処理を行うようにするという方法。非常に汎用性のないAspectになってしまうのが微妙ではありますが(^^;

     ただ、パーティショニングを行うテーブルが複数になってくる(あるいはinsert処理を行う箇所が多数ある)と、このAspectもそれなりに効果を発揮してくる?

    #なお、採番処理はSerial型のフィールド(Sequence)で行っています。

    |

    « S2DxoとJAXB2.0 その4 | Main | PostgreSQLのパーティショニングテーブル »

    DB」カテゴリの記事

    Java」カテゴリの記事

    Comments

    Post a comment



    (Not displayed with comment.)


    Comments are moderated, and will not appear on this weblog until the author has approved them.



    TrackBack

    TrackBack URL for this entry:
    http://app.cocolog-nifty.com/t/trackback/3959/15836320

    Listed below are links to weblogs that reference S2DaoとPostgreSQLのパーティショニングテーブル:

    « S2DxoとJAXB2.0 その4 | Main | PostgreSQLのパーティショニングテーブル »