0

テクノロジーよりもロジックに関連する問題があります。これがシナリオです(Spring + Hibernateを使用しています)

getリクエストごとにページに戻るには、データベースからデータを読み取る必要がありますが、スクリプトを使用して誰かがページを頻繁にリロードすると、サーバーへの呼び出しが多くなると思いました。データを読み取り、グローバル変数またはクラス変数に入れます。そうすることで、非常に奇妙なコードを多くのグローバル変数と愚かな方法で記述して、変数userのように初期値を与えることになります-私が与えたバイト型変数であるステータス- 2を初期値として使用して、内部ロジックがデータベースからこの変数に値が設定されていないことを理解できるようにします。以下は私のコードです

    @Controller
    /* @Secured("hasRole('ROLE_USERS')") */
    @RequestMapping("member")
    public class ApplyRoles {

        @Autowired
        private UserInformationForAccessApplication checkUserStatus;

        // we will initialize variables to avoid auto-initialize by constructor
        private byte userStatus = Constant.IntializationOfGlobalVariable.GLOBALINIT,
                requesttype = Constant.IntializationOfGlobalVariable.GLOBALINIT,
                access = Constant.IntializationOfGlobalVariable.GLOBALINIT;

        Map<String, Object> accessnrole;
        Map<String, String> country;
        Map<String, String> roleArray;

        @Autowired
        StudentEnrollmentApplication enrollmentApplication;

        @Autowired
        SystemProperties systemProperties;

        @Autowired
        EmployeeEnrollmentApplicationResume employeeEnrollmentApplicationResume;

        @Autowired
        AccessEnrollmentProcessing accessEnrollmentProcessing;

        private String role = Constant.IntializationOfGlobalVariable.ROLENOTSET,
                fname, lname;

        @RequestMapping(value = "/user", method = RequestMethod.GET)
        public String checkingUserStatus(Model model, HttpSession session,
                Authentication authentication) {

            String sessionemail = "yashprit@gmail.com";// (String) session
            // .getAttribute(Constant.SessionAttributes.LOGGEDINUSER);

            // first check global value, if found set than don't fetch from database
            if (userStatus == Constant.IntializationOfGlobalVariable.GLOBALINIT) {
                // get user status from MySQL Database
                userStatus = checkUserStatus.checkStatus(sessionemail).get(0);
                if (!(userStatus == Constant.UserRoleApplicationStatus.NOTAPPLIED)) {
                    access = checkUserStatus.checkStatus(sessionemail).get(1);
                    model.addAttribute(Constant.SystemName.ACCESS, access);
                }
            }

            if (!(userStatus >= Constant.UserRoleApplicationStatus.NOTAPPLIED || userStatus <= Constant.UserRoleApplicationStatus.REJECTED)) {
                model.addAttribute("error", "User status is not avaible");
                return "redirect:error/pagenotfound";
            } else if (userStatus == Constant.UserRoleApplicationStatus.NOTAPPLIED) {
                if (requesttype == Constant.IntializationOfGlobalVariable.GLOBALINIT) {
                    // get request type from MongoDB database
                    requesttype = checkUserStatus.getRequestType(sessionemail);
                }

                if (!(requesttype == Constant.RequestType.NORMALEBIT || requesttype == Constant.RequestType.INVITEBIT)) {
                    model.addAttribute("error",
                            "Facing Technichal Issue, Please try again");
                    return "redirect:error/pagenotfound";
                }

                if (requesttype == Constant.RequestType.INVITEBIT) {
                    if (!(Byte.parseByte((String) accessnrole
                            .get(Constant.SystemName.ACCESS)) == Constant.Access.USERBIT)) {
                        accessnrole = checkUserStatus
                                .getAccessAndRole(sessionemail);
                    }

                    if (accessnrole.get(Constant.SystemName.ACCESS).equals(
                            Constant.Database.ERRORMESSAGE)
                            || accessnrole.get(Constant.SystemName.ROLE).equals(
                                    Constant.Database.ERRORMESSAGE)) {

                        model.addAttribute("error",
                                "Facing Technichal Issue, Please try again");
                        return "redirect:error/pagenotfound";
                    }

                    model.addAttribute(Constant.SystemName.ACCESSNROLE, accessnrole);
                    model.addAttribute(Constant.SystemName.REQUESTTYPE, requesttype);
                }
            }

            model.addAttribute(Constant.SystemName.USERSTATUS, userStatus);


            return "member/user";

        }
}

グローバル変数を回避するために、Cookieを使用することを考えました。これは、データベースを呼び出す必要がない場合よりも、セッションでロードされた後、同じセッションでページがリロードされるたびにデータベースを呼び出したくないためです。

コードの上記の部分を再設計するのに役立つものは何でも大歓迎です

ありがとう

4

2 に答える 2

1

あなたが考えていることは本当に2つあります。私が間違っていれば正しく私ですが、

  1. サーバー上 (Java アプリケーション内) にキャッシュして、同じデータに対してデータベース検索を複数回実行することを回避します。
  2. クライアント (ブラウザー) が複数の要求をサーバーに送信しないようにします。

最初のものは、春に利用可能なキャッシングを使用して解決でき、特定のメソッドで注釈を使用します。ドキュメントはこちらから入手できます。

2 つ目はもう少しトリッキーなので、パフォーマンスの問題が見つからない限り、このままにしておきます。これは Spring でも可能であり、HTTP プロトコルと、HTTP ヘッダーで使用可能なキャッシング コントロールを利用して、応答をキャッシュする期間をブラウザーに通知します。

于 2013-03-06T20:54:58.567 に答える
0

あなたが考えているのは「キャッシュ」と呼ばれるものです。これはコンピュータ サイエンスの標準的な方法であり、コンピュータが存在する限り、キャッシュの使用方法について研究を行ってきました。

このテーマについて読みに行きたいと思うかもしれません。グーグルで「キャッシュチュートリアルJava」を見つけましたhttp://javalandscape.blogspot.com/2009/01/cachingcaching-algorithms-and-caching.html

最も簡単に言えば (1 項目のキャッシュ)、最近時間をかけて考え出したデータ オブジェクトを格納する必要があります。ただし、次のリクエストが同じデータを要求しているかどうかを判断できるように、何らかの識別子も必要です。そうでない場合は、すべての作業をやり直す必要があります。同じデータの場合は、再度返すだけです。

したがって、この単純なケースでは、アルゴリズムは次のように機能します。

if (storedData != null && storedRequestInfo == userRequest.requestInfo) {
    return storedData;
}

storedData = youCalculateTheRequestedData();
storedRequestInfo = userRequest.requestInfo;

return storedData;

それは実際のプログラミング言語ではなく、それがどのように機能するかを示すためのものです。

requestInfo は、データベースの検索に使用するリクエストに含まれるものです。計算後にそれを storedRequestInfo に保存します。

これは、ユーザーに何らかのデータを返すことを示しています。これは、storedData にあるものです。

これは単純な 1 要素のキャッシュです。

(これを拡張するには、storedRequestInfo と storedData をセッションに格納すると、ユーザーごとに格納されたこれらのいずれかになります。Java マップを使用して、storedData の束を格納することもできます。問題は、どのように保存するかを決定することです。メモリの使用を制限します. 各ユーザーにこれらを保存しすぎると, メモリを使いすぎます. したがって, 各ユーザーが持つことができる数をサイズまたはカウントで制限します. 次に, 削除するときにどれを削除するかを決定する必要があります.単純なケースでは、保存されているものを常に削除し、新しいものを保存します。

あなたのコメントに気づきました。ECache は、私が上で使用した用語で言えば、ただの大きな手の込んだ Map です。それが自然にセッションに依存しているかどうかはわかりませんが、セッション ID をキャッシュ キーに追加することでそのようにすることができます。)

于 2013-03-06T20:54:45.963 に答える