2009-12-17 3 views
5

저는 최근에 많은 다른 클라이언트에 의해 일관된 연결을 제공하기 위해 Tornado 웹 프레임 워크를 탐색 해 왔습니다.Tornado Web Framework Mysql 연결 처리

기본적으로 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 연결을 선언하고 새 커서를 만들어 요청 처리기에서 액세스 할 수 있습니까? 아니면 토네이도의 비동기 설계로 인해 동시성 문제가 발생합니까?

기본적으로 모든 HTTP 요청에 대해 MySQL 서버에 새로 연결할 필요가 없으므로 구현하는 데 몇 초가 걸리지 않습니다. 또한

는 SQL 서버는 그냥 아래에서, 프로파일 러를 통해 동일한 코드를 간단한 MySQL의 쿼리를 실행

토네이도 웹 서버 인스턴스

업데이트와 동일한 물리적 시스템에 실제로주의하시기 바랍니다.

'connections.py'init 함수 호출은 4.944 초가 걸렸습니다. 그게 옳은 것 같지 않니?

업데이트 2

나는 하나 개의 연결 (또는 아주 간단한 DB의 CONN 풀 심지어 몇)와 함께 실행하는 것은 내가 토네이도 웹 서버 인스턴스에 기대하고있어 처리량을 처리 할 수있을만큼 빠르게 될 것이라고 생각합니다.

1000 명의 클라이언트가 쿼리에 액세스해야하는 경우 일반적인 쿼리 시간은 수천 초입니다. 불충분 한 클라이언트는 데이터를 검색하기 위해 1 초를 기다려야합니다.

+0

5 초는 실제 쿼리가 아닌 데이터베이스 연결과 관련 될 수 있습니다. 토네이도를 사용하는 경우 db와의 연결을 전체적으로 수행 한 다음 요청과 함께 db 매개 변수를 전달할 수 있습니다. – chuseuiti

답변

1

과도 연결을 제공합니다 풀링 등.

은 (또한, 당신은 비동기 요청 처리기에서 데이터베이스 호출을 차단하고 아니에요?) (당신은 SQL-툴킷을 행복의 ORM을 무시하고 바로 사용할 수 있습니다)

+0

위의 코드에서 Blocking 호출을 수행하지 않는다는 것을 알고 있습니다. 만약 당신이 묻는 것이라면, 예제에 포함되지 않았습니다. 결국,있을 것이지만 연결 시간은 나를 얻는 것입니다. 나는 SQLAlchemy를 시험해 볼 것이라고 믿고있다. 그래서 대답 해 주셔서 감사합니다! –

1

SQL 연결에 5 초가 걸리지 않아야합니다. 쿼리를 발행하지 않고 성능 향상 여부를 확인하십시오.

Mysqldb 모듈의 스레드 안전성은 "1"입니다. 즉, 모듈은 스레드 안전성을 의미하지만 연결은 스레드간에 공유 될 수 없습니다. 대안으로 연결 풀을 구현할 수 있습니다.

마지막으로는 DBAPI 매개 변수 쿼리을 연결하고 탈출 수동으로 필요하지 않습니다 쿼리에 대한 매개 변수의 대체 양식이 있습니다 DBAPI을 통해 더 멋진 추상화를 제공 SQLAlchemy을 고려

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

글쎄, 나는 자동 매개 변수화에 대해 몰랐다. 정말 도움이 될 것이다. 내일 검색어를 삭제하고 그 곳에서 나를 버리는 곳을 살펴 보겠습니다. DB에 대한 호출이 다른 스레드를 차단할 가능성이 있기 때문에 연결 풀을 작성해야 할 것 같습니다. 내가 그 일을하기로 결정했는지 여부는 테스트 중입니다. –

0

은 기본 핸들러를 선언, 그것은 것 응용 프로그램 당 한 번 호출됩니다.