우리는 웹 사이트 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있다을 위의 코드에서 액세스 포인트 :
delaybyquery.json, 즉 동일한 표 5가입하여 지연을 발생번. 쿼리가 실제로 느리게 작동하려면 테이블이 약 1000 행에 있어야합니다.
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
스크린 샷을 보려면 링크를 클릭하십시오. 죄송하지만 StackOverflow는 아직 이미지를 게시 할 수 없습니다. –