2008年3月19日水曜日

Seasar2でDBコネクションを"Read Only"に

スズキです。

MySQL(slave)用のjdbcManagerを作ろうとしています。
(複数のjdbcManagerの作成はこちらに詳しく書かれています)
http://s2container.seasar.org/2.4/ja/s2jdbc_other.html#%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9

MySQL(slave)用のjdbcManagerに期待することは、
"Read Only"で、複数台用意されているMySQL(slave)に
クエリーを分散することです。

クエリーの分散はどっちかというとJDBCドライバの話になるので、
これはこれで、後でしっかり調査・実験することとします。

"Read Only"に関してですが、Javadocを眺めていると、
org.seasar.extension.dbcp.impl.ConnectionPoolImplに
setReadOnlyというメソッドがあります。
http://s2container.seasar.org/2.4/s2-extension/ja/apidocs/index.html

なので、jdbc.dicon(本当は複数データソースなんでjdbc-slave.dicon)に

<component name="connectionPool"
    class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
  <property name="timeout">600</property>
  <property name="maxPoolSize">10</property>
  <property name="allowLocalTx">false</property>
  <property name="readOnly">true</property>
  <destroyMethod name="close"/>
</component>

と記述することで実現することができました。

実際、このコネクションで作成したjdbcManagerで
INSERT文を発行したところ、
ちゃんと下記のようなメッセージの例外が発生しました。

Connection is read-only. Queries leading to data modification are not allowed

本当は、MySQL(slave)の前に、Teedaの調整やらないといけないんだけど...

--

http://suz-lab.blogspot.com/

0 コメント: