2009-12-17 24 views
5

Gần đây tôi đã khám phá khung web Tornado để phục vụ nhiều kết nối nhất quán bởi nhiều khách hàng khác nhau.Khung Web Tornado Xử lý kết nối Mysql

Tôi có trình xử lý yêu cầu về cơ bản có chuỗi được mã hóa RSA và giải mã nó. Văn bản được giải mã là một chuỗi XML được phân tích bằng trình xử lý tài liệu SAX mà tôi đã viết. Tất cả mọi thứ hoạt động hoàn toàn tốt đẹp và thời gian thực hiện (theo yêu cầu HTTP) là khoảng 100 mili giây (với giải mã và phân tích cú pháp).

XML chứa băm Tên người dùng và Mật khẩu của người dùng. Tôi muốn kết nối với máy chủ MySQL để xác minh rằng tên người dùng khớp với mật khẩu băm do ứng dụng cung cấp.

Khi tôi thêm về cơ bản đoạn mã sau:

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() 

Thời gian cần thiết để thực hiện các yêu cầu HTTP bắn lên tới 4 - 5 giây! Tôi tin rằng điều này là phát sinh trong thời gian cần để kết nối với máy chủ cơ sở dữ liệu MySql chính nó.

Câu hỏi của tôi là làm cách nào để tăng tốc độ này? Tôi có thể khai báo kết nối MySQL trong phạm vi toàn cầu và truy cập nó trong trình xử lý yêu cầu bằng cách tạo một con trỏ mới, hay nó sẽ chạy vào các vấn đề đồng thời vì thiết kế không đồng bộ của Tornado?

Về cơ bản, làm cách nào tôi không phải chịu một kết nối mới tới máy chủ MySQL MỌI yêu cầu Http, vì vậy nó chỉ mất một phần nhỏ giây thay vì nhiều giây để triển khai.

Ngoài ra, xin lưu ý, máy chủ SQL là thực sự trên máy vật lý tương tự như trường hợp Tornado Web Server

Cập nhật

Tôi chỉ cần chạy một truy vấn MySQL đơn giản thông qua một hồ sơ, cùng mã dưới đây.

Cuộc gọi tới 'connections.py' init chức năng mất 4.944 giây để thực thi một mình. Điều đó có vẻ không đúng, phải không?

Cập nhật 2

Tôi nghĩ rằng chạy với một kết nối (hoặc thậm chí một vài với một hồ bơi conn DB rất đơn giản) sẽ đủ nhanh để xử lý các thông tôi hy vọng mỗi cơn lốc xoáy dụ máy chủ web.

Nếu 1.000 khách hàng cần truy cập truy vấn, thời gian truy vấn thông thường trong hàng nghìn giây, khách hàng không hài lòng nhất sẽ chỉ phải đợi một giây để truy xuất dữ liệu.

+0

5 giây có thể liên quan đến kết nối cơ sở dữ liệu chứ không phải truy vấn thực, nếu bạn đang sử dụng lốc xoáy, bạn có thể thực hiện kết nối với db trên toàn cầu và sau đó chuyển tham số db với yêu cầu. – chuseuiti

Trả lời

1

Cân nhắc SQLAlchemy, cung cấp một trừu tượng đẹp hơn trên DBAPI và cũng cung cấp kết nối tổng hợp, v.v.(Bạn có thể bỏ qua hạnh phúc ORM của nó và chỉ cần sử dụng SQL-toolkit)

(Ngoài ra, bạn không làm ngăn chặn các cuộc gọi cơ sở dữ liệu trong xử lý yêu cầu không đồng bộ?)

+0

Tôi biết tôi không thực hiện các cuộc gọi Chặn trong mã trên, nếu đó là những gì bạn đang yêu cầu, tôi không đưa vào bất kỳ ví dụ nào. Cuối cùng, sẽ có, nhưng thời gian kết nối là những gì nhận được tôi. Tôi tin rằng tôi sẽ cung cấp cho SQLAlchemy một thử, do đó, cảm ơn câu trả lời của bạn! –

1

Kết nối SQL sẽ không mất 5 giây. Cố gắng không đưa ra một truy vấn và xem điều đó có cải thiện hiệu suất của bạn hay không.

Mô-đun Mysqldb có chủ đề an toàn "1", có nghĩa là mô-đun là luồng an toàn, nhưng không thể chia sẻ kết nối giữa các chuỗi. Bạn có thể triển khai một nhóm kết nối thay thế.

Cuối cùng, DBAPI có một hình thức thay thế tham số cho các truy vấn mà sẽ không đòi hỏi tay concatenating một truy vấn và thoát thông số:

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

Vâng, tôi không biết về công cụ tự động tham số hóa, điều đó sẽ thực sự hữu ích. Tôi sẽ xem xét xóa truy vấn vào ngày mai và xem vị trí đó rời khỏi tôi. Tôi nghĩ rằng tôi sẽ phải kết thúc bằng văn bản một hồ bơi kết nối ... chỉ vì có khả năng các cuộc gọi đến DB sẽ chặn các chủ đề khác. Nó sẽ được thử nghiệm cho dù tôi quyết định làm điều đó hay không. –

0

Khai báo nó trong xử lý cơ sở, nó sẽ được gọi một lần cho mỗi ứng dụng.

Các vấn đề liên quan