[解決済み] 同期化された静的メソッドはJavaでどのように動作し、Hibernateエンティティの読み込みに使用できますか?
質問
基本的なデータアクセスを行うためにHibernateの関数を呼び出す静的メソッドを持つutilクラスがある場合。私は、メソッドを
synchronized
は、スレッドセーフを確保するための正しいアプローチです。
同じDBインスタンスに複数の情報がアクセスできないようにしたい。しかし、以下のようなコードで防ぐことができるのか、今一つ自信がありません。
getObjectById
は、特定のクラスから呼び出されたときに、すべてのクラスに対して呼び出されます。
public class Utils {
public static synchronized Object getObjectById (Class objclass, Long id) {
// call hibernate class
Session session = new Configuration().configure().buildSessionFactory().openSession();
Object obj = session.load(objclass, id);
session.close();
return obj;
}
// other static methods
}
解決方法は?
静的メソッドロックにsynchronizedを使用することで、以下のことが可能になります。 クラスメソッドと属性の同期化 ( インスタンスのメソッドや属性とは対照的に )
ということは、あなたの仮定は正しいのですね。
スレッドセーフを確保するために、このメソッドをsynchronizedにすることが正しいアプローチなのかどうか悩んでいます。
そうでもないですよ。その作業は、代わりにRDBMSに任せるべきです。RDBMSはこの種のことに長けています。
データベースへのアクセスを同期させることで得られるのは、アプリケーションが恐ろしく遅くなることだけです。 さらに、あなたが投稿したコードでは、毎回セッションファクトリーを構築しているので、あなたのアプリケーションは実際の仕事を実行するよりもDBにアクセスすることに多くの時間を費やすことになるのです。
次のようなシナリオを想像してください。
クライアントAとBは、テーブルTのレコードXに異なる情報を挿入しようとする。
あなたのアプローチでは、RDBMSがAからとBから同時に半分の情報を挿入することを防ぐので、DBではいずれそうなるのに、一方が他方の後に呼び出されることを確認することだけを得ています。結果は同じですが、5倍(またはそれ以上)遅くなるだけです。
おそらく、このような場合は トランザクションと同時並行性 の章をご覧ください。 ほとんどの場合、あなたが解決しようとしている問題は、すでに解決されており、より良い方法です。
関連
-
プロジェクトの依存関係を解決できなかった 解決
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] 静的メソッドを使用する場合
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
-
[解決済み】サーブレットはどのように動作するのですか?インスタンス化、セッション、共有変数とマルチスレッド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
SpringBootApplication を型解決できない。
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
[解決済み] Java の同期化された静的メソッド:オブジェクトまたはクラスへのロック