« 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のパーティショニングテーブル »

    Java」カテゴリの記事

    DB」カテゴリの記事

    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


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

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