2017-01-17 10 views
0

우리는 웹 사이트 2008 +의 SQLServer 2008 + 루비 +시나 + 속편/푸마속편 + ADO + 푸마 스레딩되지 않은 쿼리는

우리는 우리의 웹 사이트에 대한 API를 개발 한 윈도우 서버에서 실행이있다. 많은 클라이언트가 액세스 지점을 요청하면 동시에 클라이언트는 RequestTimeout 예외를 받기 시작합니다.

나는 조금 연구했고, 푸마는 멀티 스레딩을 잘 관리하고 있다고 언급했다. 그러나 Sequel (또는 Sequel 아래의 모든 계층)은 서로 다른 클라이언트에서 온 쿼리 인 경우에도 한 번에 하나의 쿼리를 처리합니다.

많은 웹 서버를 시작하고 각각 하나의 다른 포트를 수신하면 각 클라이언트에 하나의 다른 포트를 할당하면 RequestTimeout 예외가 발생하지 않습니다.

문제가 Sequel, ADO, ODBC, Windows, SQLServer 또는 무엇인지 아직 알 수 없습니다. 진실은 내가 (TinyTDS 같은) 다른 기술로 전환 할 수 있다는 것입니다

우는 소리는 당신이 버그를 복제하는 데 사용할 수있는 스크린 샷과 코드의 작은 조각이다 :

require 'sinatra' 
require 'sequel' 
CONNECTION_STRING = 
"Driver={SQL Server};Server=.\\SQLEXPRESS;" + 
"Trusted_Connection=no;" + 
"Database=pulqui;Uid=;Pwd=;" 

DB = Sequel.ado(:conn_string=>CONNECTION_STRING) 
enable :sessions 
configure { set :server, :puma } 
set :public_folder, './public/' 
set :bind, '0.0.0.0' 
get '/delaybyquery.json' do 
tid = params[:tid].to_s 
begin 
puts "(track-id=#{tid}).starting access point" 
q = "select p1.* from liprofile p1, liprofile p2, liprofile p3, liprofile p4, liprofile p5" 
DB[q].each { |row| # this query should takes a lot of time 
puts row[:id] 
} 
puts "(track-id=#{tid}).done!" 
rescue=>e 
puts "(track-id=#{tid}).error:#{e.to_s}" 
end 
end 
get '/delaybycode.json' do 
tid = params[:tid].to_s 
begin 
puts "(track-id=#{tid}).starting access point" 
sleep(30) 
puts "(track-id=#{tid}).done!" 
rescue=>e 
puts "(track-id=#{tid}).error:#{e.to_s}" 
end 
end 

2있다을 위의 코드에서 액세스 포인트 :

  1. delaybyquery.json, 즉 동일한 표 5가입하여 지연을 발생번. 쿼리가 실제로 느리게 작동하려면 테이블이 약 1000 행에 있어야합니다.

  2. l 지연된 코드 .json, 이는 단지 루비 슬리 프 함수를 호출하여 지연을 생성합니다.

모두 액세스 포인트

는 TID (추적-ID) 매개 변수를 수신하고 모두 같은 창에 모두 프로세스의 활동을 따라 확인할 수 있도록 요점은 액세스하는의 CMD의 outout 쓰기 다른 브라우저에서 들어오는 요청을 차단하고 있습니다.

테스트를 위해 동일한 크롬 브라우저에서 2 개의 탭을 열고 있습니다. 다음은 내가 수행중인 2 가지 테스트입니다.

단계 # 1 : 웹 서버를 실행

C : \ 소스 \ pulqui> 루비 example.app.rb -p 81 I 얻을

의 2 단계 아래의 출력 : 테스트 지연 코드

에 의해 나는이 URL에 부름 : 127.0.0.1:81/delaybycode.json?tid=123 5 초 후에 나는이 다른 URL 127.0.0.1:81/delaybycode.json라고?TID = 456 다음은 두 통화가 병렬

click here to see the screenshot

3 단계에서 작업하는 것을 볼 수 있습니다 출력입니다 :이 URL로 불리는

의 요청에 의한 테스트 지연 : 127.0.0.1:81/delaybyquery.json?tid=123 및 5 초 후이 다른 URL을 호출했습니다. 127.0.0.1:81/delaybyquery.json?tid=456 다음은 출력을 볼 수 있습니다. 시간에 일하는. 액세스 포인트에 대한 각 호출이 쿼리 시간 초과 예외로 종료됩니다.

click here to see the screenshot

+0

스크린 샷을 보려면 링크를 클릭하십시오. 죄송하지만 StackOverflow는 아직 이미지를 게시 할 수 없습니다. –

답변

0

이는 win32ole (속편의 ADO 어댑터가 사용하는 드라이버)에 거의 확실하다. 쿼리 중에 GVL이 릴리스되지 않아서보고있는 문제가 발생할 수 있습니다.

TinyTDS로 전환하거나 JRuby로 전환 할 수없는 경우 동시 쿼리를 수행하려면 별도의 웹 서버 프로세스를 실행하고 역방향 프록시 서버에서 요청을 처리하도록하는 것이 유일한 옵션입니다.

+0

고맙습니다 제레미. –