質問

私は最近、さまざまなクライアントによる多数の一貫した接続を提供するために、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 サーバーへの新しい接続を発生させる必要がなく、実装に数秒ではなく数分の 1 しかかからないのはどうすればよいでしょうか。

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

アップデート

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

「connections.py」への呼び出し 初期化 この関数を単独で実行するには 4.944 秒かかりました。それは正しくないと思いますね?

アップデート 2

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

1,000 のクライアントがクエリにアクセスする必要がある場合、通常のクエリ時間は数千秒ですが、最も運が悪いクライアントはデータを取得するまでに 1 秒しか待つ必要がありません。

役に立ちましたか?

解決

考慮する SQLアルケミー, 、DBAPI より優れた抽象化を提供し、接続プーリングなども提供します。(ORM を無視して SQL ツールキットを使用することもできます)

(また、非同期リクエスト ハンドラーでデータベース呼び出しをブロックしていませんか?)

他のヒント

SQL 接続には 5 秒もかかりません。クエリを発行しないようにして、それによりパフォーマンスが向上するかどうかを確認してください (実際には改善されるはずです)。

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

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

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y))

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top