ここから本文です

データベースアクセスへの排他制御と検索速度

アバター

ID非公開さん

2012/6/720:27:28

データベースアクセスへの排他制御と検索速度

データベースのレコードの値の重複で悩んでいます。

クラス1とクラス2があります。(Java)
またデータベース内のテーブルは一つとします。(MySQL)
例としてテーブル内の各フィールドは

postId, postName, postTitle, postText, postDate, postType

とします。(postIdは主キー + オートインクリメント )

このデータベースは提示版・情報登録1 or 2 or 3のデータを格納します。
(フィールドの「postType」に提示版か情報登録1~3を挿入し判別します)


両クラスともにユーザが入力した内容をデータベースに保存する
メソッドAを持ちます。 (修飾子:public static synchronized)

その両クラスのメソッドA内ではデータベースのフィールドの「postId」を作成する際
オートインクリメントなのでレコード追加の度に重複しない値が設定されます。

しかし、例えばクラス1のメソッドAに複数のスレッドが同時にアクセスした場合
の排他制御として「synchronized」で排他制御は出来、データベースの
「postId」の重複による例外の発生は避けれますが、
スレッド1がクラス1のAメソッド、スレッド2がクラス2のAメソッドを同時にアクセス
した場合、「synchronized」で排他制御していてもクラスもメソッドも別なので
「postId」が重複する可能性が出てくると思うのですが、どうでしょうか?


対策としてテーブルを複数に分けて(提示版テーブル、情報登録1テーブル等)
データベース内のテーブルに保存出来るクラス(メソッド)を1つにするか。。。
※データベースのレコード選択は問題にならない。あくまで「postId」の重複を避けたい

しかしデータベースを分けると今度は一括検索の速度に悪影響があるのでは
無いかと考えてしまいます。
(検索の際、提示版テーブル 情報登録1テーブル~等複数テーブルにアクセス
する必要があるので)


検索速度についてはあまり気にする必要はないでしょうか?

この様な場合の良い対策を教えて下さい。

閲覧数:
583
回答数:
1

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nora1962jpさん

2012/6/722:13:21

大前提としてMySQLのオートインクリメント機能があるのでJava側がマルチスレッドでアクセスしてもPostIDは重複することはないと思います。
問題は同一のPostIDの行に対して同時にアクセスする際の実行制御ではないでしょうか。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる