jython script에서 db connection을 끊지 않고 계속 SQL 요청하는 방법이 궁금합니다.

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

jython script에서 db connection을 끊지 않고 계속 SQL 요청하는 방법이 궁금합니다.

kevin yun
안녕하세요.

현재 jython 스크립트를 이용해서 Oracle DB에 직접 세션을 맺어서 SQL 부하를 주는 부하테스트를 진행중입니다.
현재 사용하고 있는 스크립트는 아래와 같습니다.

python에 대해 이해가 부족한 상황이라 script example의 connection 부분만 수정해서 테스트 하고 있습니다.

궁금한 점은 다음과 같습니다.
아래 스크립트에서 select query를 수행하기 전에 db connection을 맺고 sql 수행이 완료되면 connection을 닫는 걸로 보입니다.
부하테스트 수행을 하였을 때, 아래 두가지 수행 중 어떤 식으로 수행이 이뤄지는지 아니면, 다른 방법으로 수행되는지 궁금합니다.
그리고, 만약 1의 방법대로 수행된다면, 2의 방법으로 수행하고자 하려면 script를 어떻게 수정해야 하는지 궁금합니다.

1. 할당된 Vuser 만큼 세션을 맺어서
    1) db connection
    2) sql 1회 수행
    3) connection close
이 순서로 정해진 시간동안 계속 반복

2. 할당된 Vuser 만큼 세션을 맺어서
    1) db connection
    2) sql 정해진 시간동안 수행
    3) connection close

-- jython script
# -*- coding:utf-8 -*-
# Oracle Database test.
#
from java.sql import DriverManager
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from oracle.jdbc import OracleDriver
from java.util import Random
from java.lang import System
 
test1 = Test(1, "Database select")
random = Random(long(System.nanoTime()))
 
# Load the JDBC driver.
DriverManager.registerDriver(OracleDriver())

 
def getConnection():
    return DriverManager.getConnection("jdbc:oracle:thin:@192.168.56.2:1521:o2m", "scott", "tiger")
 
def ensureClosed(object):
    try: object.close()
    except: pass
     
class TestRunner:
    def __init__(self):
        test1.record(TestRunner.__call__)
        grinder.statistics.delayReports=True
        pass

    def __call__(self):
        connection = None
        selectStatement = None
        try:
            # in this test, we will create connection and statement in every test transaction.
            connection = getConnection()
            selectStatement = connection.createStatement()
            selectStatement.execute("select * from temp where dept_code like 'CA%'")
           
        finally:
            ensureClosed(selectStatement)

Reply | Threaded
Open this post in threaded view
|

Re: jython script에서 db connection을 끊지 않고 계속 SQL 요청하는 방법이 궁금합니다.

songeunwoo
안녕하세요.

문의 주신 부분의 답변을 드리자면,
nGrinder는 vuser수만큼의 세션을 맺은 후 테스트를 수행 하는 방식이 아니라.
지정되어 있는 프로세스 숫자 만큼 띄어 준 후, 사용자가 작성하신 해당 스크립트 로딩을 합니다.

따라서 TestRunner 클래스 밖에 존재하는 코드들은 프로세스당 단 1회만 실행 되기 때문에,
각종 리소스 로딩이나, 환경 변수 셋팅 하기에 적당한 부분입니다.
그 다음에 TestRunner 객체를 쓰레드당 1개씩 생성합니다.
__init__(self) 메소드는 자바로 치면 생성자 같은 건데요. 쓰레드당 단 1회 실행합니다.
보통 이 구간에서는 쓰레드당 약간의 sleep타임을 주거나 로그인처리 같은 작업을 수행해 주기에 적절한 부분 입니다.

이후 __call__ 메소드를 반복해서 실행합니다. record를 __call__메서드로 지정해 주셨기에 __call__메서드가 호출되어서
종료할 때까지의 하나의 TPS로 인식이 됩니다.

질문자분께서는 __call__메서드 부분에서 getConnection 을 호출하고 쿼리를 실행해 주기 때문에
원하시는 결과가 안나오는듯 합니다.

스크립트를 수정 하시면 될듯하네요.
감사합니다.