0

こんにちは私はデータベース値をチェックするためのさまざまなメソッドを含むクラスを持っています。各メソッドは特定のテーブル用であるため、メソッドが呼び出されるたびにselect sqlは同じままであり、チェックされるwhere句の値のみが変更されるため、プリペアドステートメントを使用しています。

お気に入り

public boolean checkVal(Session session,String b,String c,String d)
    {
        String sql="select a from tbl_name where b=? and c=? " +
                "and d=? ";
        Query query=session.createSQLQuery(sql).addScalar("a",Hibernate.STRING);
        query.setParameter(0,b);
        query.setParameter(1,c);
        query.setParameter(2,d);

    if(){
some check and return
}
}

このメソッドは100000回のように呼び出されるため、SQLが再生成され、ここでプリペアドステートメントを使用することは役に立たないと思います。パフォーマンスを向上させるにはどうすればよいですか?これを行うための正しいアプローチは何ですか?

4

3 に答える 3

1

SQL文字列は静的で最終的なものにすることができます。毎回再作成する理由はありません。

しかし、それはあなたの最大の問題ではありません。

PreparedStatement拘束力と繰り返し実行のために生まれました。これ以上良いものはありません。JDBCドライバーは、解析および検証されると、PreparedStatementをキャッシュできるため、その作業は1回だけ行います。

パフォーマンスを測定し、この方法でパフォーマンスの問題を見つけましたか?そうでない場合は、データが得られるまで問題があるとは思わないでください。

なぜメソッドを繰り返し呼び出さなければならないのかと尋ねます。10万人のユーザーに1回ずつですか?はいの場合、聴衆を減らすか、電話の必要性をなくす以外にできることは何もありません。(キャッシングを考えてください。)シングルユーザーの場合は100,000?1回の呼び出しを行う方法、またはそれらをバッチ処理する方法を理解します。あなたはその取り決めで潜在的な死を遂げるでしょう。あなたの側の誇張?深呼吸をして、リラックスして、データを取得してください。

于 2012-06-21T11:34:07.507 に答える
1

いいえ、sql変数は単なる定数文字列式であるため、毎回作成されるわけではありません。String呼び出されるたびに使用される単一のオブジェクトがあります。

これが毎回新しい文字列を作成したとしても、これがパフォーマンスのボトルネックになる可能性は非常に低いでしょう。パフォーマンスを測定しましたか?問題ありますか?問題が(たとえば)データベース自体のボトルネックではなく、このコードが原因であると信じる理由はありますか?

Hibernateがこれにキャッシュを使用することを望みPreparedStatementますが、それを調べる必要があります。

于 2012-06-21T11:36:51.483 に答える
1

Hibernateという名前のクエリを使用できます。これにより、呼び出しごとにHibernateによるHQLまたはSQLの解析が回避されます(ここでHQLクエリの代わりにSQLクエリを使用するのはなぜですか?)。

最後に、HibernateはJDBC接続にプリペアドステートメントを作成するように要求します。また、接続プールまたはドライバーがプリペアドステートメントをキャッシュしている場合、このメソッドが頻繁に使用されると、プリペアドステートメントを取得する可能性が高くなります。

于 2012-06-21T11:41:49.577 に答える