1 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 12:31:17 ] 前スレ: Java⇔RDBのMapping-Frameworkを語るスレ Vol.4 ttp://pc11.2ch.net/test/read.cgi/tech/1134701684/ 過去スレ: Java⇔RDBのMapping-Frameworkを語るThre Vol.3 ttp://pc8.2ch.net/test/read.cgi/tech/1090653286/ Java⇔RDBのMapping-Frameworkを語るスレ Vol.2 ttp://pc5.2ch.net/test/read.cgi/tech/1086315004/ Java⇔RDBのMapping-Frameworkを語るスレ ttp://pc5.2ch.net/test/read.cgi/tech/1049030272/ ●まずは、基礎知識と技術選択指針など [The Fundamentals of Mapping Objects to Relational Databases] (RDBに対するオブジェクトマッピングの基礎(英語)) ttp://www.agiledata.org/essays/mappingObjects.html [O/R-Mappingツールの比較サイト(英語)] ttp://c2.com/cgi-bin/wiki?ObjectRelationalToolComparison [Catalog of Patterns of Enterprise Application Architecture (PoEAA)] ttp://www.martinfowler.com/eaaCatalog/ あとは>>2-5 ぐらい
114 名前:デフォルトの名無しさん [2008/12/05(金) 00:39:54 ] 質問です。 複数のスキーマがあり、プログラム起動時にアクセスするスキーマを動的に切り替えたい。 SCHEMA_01.TABLE_01 SCHEMA_02.TABLE_01 SCHEMA_03.TABLE_01 (TABLE_01のレイアウトは全て共通) iBatis2.3.4で試してみたところ <select id="getTABLE_01" parameterClass="java.util.Map" resultClass="examples.dto.TABLE_01"> SELECT * FROM $SCHEMA$.TABLE_01 WHERE ID = #ID# </select> HashMap map = new HashMap(); map.put("SCHEMA", "SCHEMA_01"); map.put("ID", "1"); TABLE_01 dto = (TABLE_01)sqlMap.queryForObject("getTABLE_01", map); とすることで一応、目的を果たせました。 ですが、この方法ですと毎回HashmapにSCHEMAパラメータを指定する必要があり、 またparameterClassに自前クラスを指定したい場合などに困ったことになります。 sqlMap側でデフォルトスキーマを指定するようなパラメータがないか調べたのですが、見つかりませんでした。 もう少しスマートに行う方法はありませんでしょうか? ちなみにHibernateでもアレコレやってみましたが、 こちらは動的に切り替える方法が全く分かりませんでした。
115 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 11:03:30 ] Hibernate EntityManager+Springで動的切り替えはやったことある EntityManagerの委譲クラスを作って、メソッド呼び出しのタイミングで スレッドローカルに保持しておいたユーザ情報を見て 利用するPersistenceContextを選択するというやり方をした
116 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 22:13:47 ] >>110 ハルヒとかシャナってないのな。 以外だ。
117 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 13:43:24 ] 以外だ?以上だ?
118 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 17:54:28 ] >>114 iBatis + Spring の環境だけど、DataSource のサブクラスを自分で作って、 Spring が getConnection するときに、スレッドローカルなりに格納されてきたユーザ名に応じて 接続先の JDBC DB ユーザ名というを変える、というようなことをやっているよ。 SQL レベルで、 select * from スキーマ名.テーブル名 にはしたくない。
119 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:26:20 ] >>118 Connection時にDataSourceのユーザを切り替るということはコネクションプーリングを 考えないということでしょうか? >>115 のやり方もちょこっと調べてみましたが同様の考え方のように見受けられました。 (なにやら難しそうで読んだだけでは理解が追いつかなかった・・・) でも確かに接続ユーザ自体を切り替えるほうが安全で SQLでスキーマ名.テーブル名ってやっちゃうと、何かの弾みで 別スキーマのデータにアクセスできてしまうという危険がありますからね。 そもそもこのような使い方する場合はコネクションプーリングを考えないほうがいいのかな。 よくDB接続時の負荷が高いというのを見ますが、その辺は大丈夫なんでしょうか?
120 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 21:07:11 ] >>119 切り替える分のデータソースを予め定義しておいて、 そのDataSourceを使うiBatisなりHibernateなりのアプリレベルで切り替えればいい 言ってることが理解できないのなら、もうちょっとJavaのDBアクセス関連を勉強した方がいい
121 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 21:41:17 ] >>119 Seasar2には標準でその機能が用意されてる ttp://s2container.seasar.org/2.4/ja/jdbc.html#DataSourceDynamicSwiching ttp://svn.seasar.org/browse/trunk/seasar2/s2-extension/src/main/java/org/seasar/extension/datasource/impl/SelectableDataSourceProxy.java?root=s2container&view=markup ttp://svn.seasar.org/browse/trunk/seasar2/s2-extension/src/main/java/org/seasar/extension/datasource/impl/DataSourceFactoryImpl.java?root=s2container&view=markup
122 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 03:18:28 ] >>120 スキーマは動的に増えていくので、その数分データソースを 用意しておくというのは現実的じゃないんですよ。 なんせゼロからjavaでやるの初めてなんで、 おっしゃる通り勉強し直してきます・・・。 >>121 で、試行錯誤の末なんとか実現できそうです。 sqlMapConfig側で <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="org.postgresql.Driver"/> <property name="JDBC.ConnectionURL" value="jdbc:postgresql://....."/> <property name="JDBC.Username" value="${username}"/> <property name="JDBC.Password" value="${password}"/> </dataSource> ソース側で Properties props = new Properties(); props.setProperty("username", "hoge"); props.setProperty("password", "1234"); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader, props); とやることで指定したユーザで接続できました。 これを開始時に行って取得したsqlMapを使いまわせば実現できそうです。 色々と情報ありがとうございました。
123 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:11:43 ] スキーマ動的に増えるとか何かの冗談?
124 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:23:07 ] インデックスが脇役になってた tv2ch.com/jlab-10s/s/10s96973.jpg dat.2chan.net:81/18/src/1228585436408.jpg
125 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:28:31 ] ORツールを導入するプロジェクトの規模ってどのくらいからが妥当ですか?
126 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:59:25 ] 1人で開発する場合から妥当
127 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 03:12:38 ] >>123 スキーマ動的に増える設計のシステム保守してるよ。 案外冗談でもないんだな。これが。
128 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 03:31:14 ] むしろひとりだとORMつかってうまーの規模だな。
129 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 09:43:37 ] プロジェクトで ORM 導入を考えるときは、 便利だけど使いこなすのが難しいので、メンバーに使いこなせるかどうか とか考えなければいけないけど、ひとりだと自分の好きなツールを使えるからいいね。
130 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 19:23:51 ] メンバーのスキルは期待できない。 SQLなら多少書ける。 っというのであれば、DBUtilsやiBatisあたりを使ってりゃいいんじゃね。
131 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 21:26:41 ] スキルが期待できない開発者はSQLもとんでもないのを書くことが多いw
132 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 21:28:09 ] ぶっちゃけオブジェクト指向よりSQLの方が簡単なので ORMの説明してもSQLじゃないと出来ないとか言われるのが落ち
133 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 21:57:54 ] オブジェクト指向よりSQLのほうが簡単?マジ? 使う側の話だよね? SQLとの比較ってことは、クラス設計ではなくて、誰かが作ったクラス使う場合だよね。
134 名前:デフォルトの名無しさん mailto:age [2008/12/09(火) 01:52:58 ] age
135 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 02:02:31 ] Entityクラスくらい誰でも作れるだろ
136 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 23:57:32 ] 禁書って2クールだったのか
137 名前:デフォルトの名無しさん [2008/12/11(木) 01:01:18 ] オレもDBからデータ引っ張るときはSQLで考える方が楽だと思う。 WHEREにORとかBETWEENとか必要で、 GROUP BYでMAXとらなきゃいけないケースが多いからかもしれないけど、 これをORMで、ってなったらゴメンナサイだわ。
138 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 21:53:12 ] group byって標準APIであるJPAにもあった気がするけど
139 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:04:15 ] GROUP BYでMAXはORMでも簡単じゃないか? テーブル結合とかがかなり面倒って感じかな
140 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 22:08:42 ] ORMの場合最初に設計時に関連かいてるからね FKつけないとかいうトンデモな場所だと使いにくい
141 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 07:59:47 ] 逆にORM意識して規約に従ったDB設計やっていたら 結合がアホのように簡単になる スキーマをいじれるときはORMで いじれないときはSQL重視でやるのがいいと思う