5

私は最近、多くの異なるクライアントによる多くの一貫した接続を提供するために、Tornado Web フレームワークを調査しています。

基本的に RSA 暗号化文字列を取得して復号化するリクエスト ハンドラーがあります。復号化されたテキストは、私が作成した SAX ドキュメント ハンドラーによって解析される XML 文字列です。すべてが完全に正常に動作し、実行時間 (HTTP 要求ごと) は約 100 ミリ秒 (復号化と解析を含む) でした。

XML には、ユーザーのユーザー名とパスワードのハッシュが含まれています。ユーザー名がアプリケーションによって提供されたパスワード ハッシュと一致することを確認するために、MySQL サーバーに接続したいと考えています。

基本的に次のコードを追加すると:

conn = MySQLdb.connect (host = "192.168.1.12",
                user = "<useraccount>",
                passwd = "<Password>",
                db = "<dbname>")
    cursor = conn.cursor()

    safe_username = MySQLdb.escape_string(XMLLoginMessage.username)
    safe_pass_hash = MySQLdb.escape_string(XMLLoginMessage.pass_hash)

    sql = "SELECT * FROM `mrad`.`users` WHERE `username` = '" + safe_username + "' AND `password` = '" + safe_pass_hash + "' LIMIT 1;"

    cursor.execute(sql)

            cursor.close()
    conn.close()

HTTP リクエストの実行にかかる時間は、最大で 4 ~ 5 秒です。これは、MySql データベース サーバー自体への接続にかかる時間に起因すると考えられます。

私の質問は、どうすればこれをスピードアップできますか? グローバル スコープで MySQL 接続を宣言し、新しいカーソルを作成してリクエスト ハンドラでアクセスできますか? それとも、Tornado の非同期設計のために同時実行の問題が発生しますか?

基本的に、HTTP リクエストごとに MySQL サーバーへの新しい接続を発生させる必要がないようにするにはどうすればよいので、実装に数秒かかるのではなく、ほんの数秒しかかかりません。

また、SQL サーバーは実際には Tornado Web サーバー インスタンスと同じ物理マシン上にあることに注意してください。

アップデート

以下の同じコードで、プロファイラーを介して単純な MySQL クエリを実行しました。

「connections.py」init関数の呼び出しは、単独で実行するのに 4.944 秒かかりました。それは正しくないようですね。

更新 2

1 つの接続 (または非常に単純な DB 接続プールを使用したいくつかの接続) で実行すると、トルネード Web サーバー インスタンスごとに期待するスループットを処理するのに十分な速度になると思います。

1,000 のクライアントがクエリにアクセスする必要がある場合、通常のクエリ時間は数千秒ですが、最も不運なクライアントは、データを取得するために 1 秒待つだけで済みます。

4

3 に答える 3

1

SQL 接続に 5 秒かかることはありません。クエリを発行しないようにして、パフォーマンスが向上するかどうかを確認してください。

Mysqldb モジュールのスレッドセーフは「1」です。これは、モジュールがスレッドセーフであることを意味しますが、スレッド間で接続を共有することはできません。代わりに接続プールを実装できます。

最後に、DB-API には、手動でクエリを連結してパラメーターをエスケープする必要がない、クエリ用のパラメーター置換フォームがあります。

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))
于 2009-12-17T07:50:36.260 に答える
0

ベース ハンドラーで宣言すると、アプリケーションごとに 1 回呼び出されます。

于 2010-09-30T22:14:10.790 に答える