2012-02-15 27 views
0

シングルトン・クラス・オブジェクトの例で、データベースから取得したユーザーIDとパスワードを含むマップがあります。これは、ユーザーログイン中に毎回DBにヒットしないのに役立ちます。サーブレット・コンテキストとシングルトン・オブジェクト

私は考えている、これはServletContext属性を介して行うことはできません。

基本的には両方のケースでアプリケーションワイドオブジェクトを使用します。

この場合、ServletContext属性を使用できますか?

+0

はい、のServletContext属性を使用することができる:あなたにも、ユーザー名列とインデックスパスワード欄にUNIQUEインデックスを設定した場合、以下がはるかに効率的な方法です。 –

+0

シングルトンは非常に過度に評価され、誤解され、虐待されています。あなたが本当に必要な理由を本当に理解するまで、それについて考えないでください。 – BalusC

答えて

3

アプリケーション内のどこからでもMapにアクセスする必要がある場合は、実際には配置するのが最適です。

あなたが登録できServlet Context Listenerとその後の対応する属性

getServletContext().getAttribute("UsersMap");

を取得することにより、どこからでも、Webアプリケーション内で使用してアクセス contextInitializedにあなたはシングルトンを得ることができますし、 ServletContext

の属性として保存

1

DB内のデータが基本的に静的な場合は、はい、そうすることができます。 DB内のデータが動的であれば、いいえ、これはお勧めしません。そうでなければ、DBとservletcontext変数を同期させておくためにかなりのコードを書く必要があります。新しいユーザーがWebアプリケーションに登録すると、もちろんこのユーザーはログインできるようになります。

DBに100万人のユーザーがいる場合はどうなりますか?これをすべてサーバーのメモリにコピーしたいですか?どのような目的のために?これはDBの目的を完全に破ります。ログインを検証しますか?私は実際にログインの検証が高価なので、サーバーのメモリにDB全体のコピーが必要な理由を想像できません。これは少しまともなDBが1ミリ秒未満で行うことができる仕事です。問題の原因は間違いなく他のところで解決されなければならない。

SQL WHERE句を使用する代わりに、DB全体をJavaのメモリに不必要にコピーし、行単位でJavaで完全に検証することはおそらくありますか?このようなもの?

resultSet = statement.executeQuery("SELECT * FROM users"); 

while (resultSet.next()) { 
    if (username.equals(resultSet.getString("username")) && password.equals(resultSet.getString("password"))) { 
     valid = true; 
     break; 
    } 
} 

これは、データベースの初心者であり、SQLの能力を理解していない初心者の間で頻繁に考えられる間違いです。

statement = connection.prepareStatement("SELECT id FROM users WHERE username=? AND password=md5(?)"); 
statement.setString(1, username); 
statement.setString(2, password); 
resultSet = statement.executeQuery(); 
valid = resultSet.next(); 
+0

私はあなたのポイントを完全に得ているかどうか分からない。つまり、メモリのために多くのユーザー名を1 M持っているのだろうか?たとえばキャッシュメカニズムを使用すればどうなるだろう?キャッシュは悪い考えだと思いませんか? – Cratylus

+0

@ user384706:ポイントは、うまく設計されたDBがあなたのために1秒以内にマッチを選ぶことができるのであれば、なぜあなたはメモリ内にDBのコピーを持っていますか?キャッシュについては、JDBCではなくJPAを使用します。第2レベルのキャッシュ構成が可能です。 – BalusC

+0

まず、DB全体のコピーについて言及しているのはなぜですか?OPでは、ユーザー名がキャッシュされるだけです.MのユーザーがDBに存在するとしましょう。 'HashMap'には?さらに、DB全体のキャッシュメカニズムがあります。私はGuavaのキャッシュはそれを行うと思いますが、memcachedや他のライブラリがあります.DBが非常に速い場合、それらはなぜ存在しますか?私がこれらを尋ねる理由は、あなたが私よりも経験が豊富で、私はここであなたの要点を得ようとしています。 – Cratylus

関連する問題