티스토리 뷰




보통 Spring + Mybatis 프레임웍에서 resultMap은 1개의 Object에 맵핑된다.

이런건 프로시저나 SELECT쿼리에서 1개의 결과셋을 받아 처리한다는 의미가 된다.

mapper가 아래와 비슷하게 코딩되어있을것이다.

<select id="test" resultMap="resultmap">

EXECUTE [dbo].[TEST]

</select>

하지만, 프로시저나 또는 SELECT쿼리에서 두개이상의 Multiple Recordsets 을 보내준다면 어떨까?

결과적으로 1번의 요청, 1번의 네트웍을 통해서, 여러개의 결과를 받을 수있다면, 엄청난 이득일것이다.

네트웍이라는게 CPU연산,메모리엑세스,보조메모리엑세스에 비해 상당히 소모적인 동작이기때문이다.


예로, DDR3 1600MHz 짜리 RAM은 1초에 16억번데이터 전송이 가능하고, 한번에 64Bit까지 전달가능한데.

이는 액세스 한번에 약1나노초(0.000000000625초) 소요 . 이것을 전송용량으로 계산하면 

8Byte x 1,600,000,000 = 12,800,000,000 = 12800MB/s x 2(양방향) = 25.6GB/s

1초에 25기가바이트가 된다.

흔히쓰는 100M광랜같은경우 (요즘 기가랜도있지만..) 전송용량으로 계산하면

100Mbps = 12.5MB/s = 0.01GB/s

1초에 0.01기가 이지만...

여기에 OSI7Layer에 따라서 데이터흐름제어나 순서제어(TCP)를 하고,

원격지에 데이터를 전송하기때문에이론상 속도보다 더욱이 느려진다.


여튼.....

네트웍은 호출횟수, 전송데이터가 적을수록 좋다.

전송데이터를 줄이기어렵다면, 호출횟수만이라도 반드시 줄이는게 좋고. 이로인해 눈에띄는 성능향상을 꾀할 수있다.


기본 Spring+Mybatis Framework의 구조에서 아래코드처럼 수정하자.

물론.... 모두 다하면 구찮으니 네트웍호출이 많은부분을 추려서하자.


*Recordset : DB쿼리의 결과로 SELECT되는 결과셋.

*Multiple Recordsets : DB쿼리의 결과로 2개이상의 Recordset(결과셋)을 반환하는것.



-------------------------------------------------------------------------------------------

**Controller

//앞리스트 : recordsets list, 중간리스트 : 결과배열, Object : 결과Object

List<List<Object>> datas = myService.test();  //Object가 아닌 Map으로도 가능.


List<MyCustomClassA> dataset1 =  getDataset( datas , 0 ); // SelectList 1

List<MyCustomClassB> dataset2 =  getDataset( datas , 1 ); // SelectList 2

String dataset3 = getDataset( datas , 2 ).get(0);// SelectOne 1

Integer dataset4 = getDataset( datas , 3 ).get(0);// SelectOne 2


//캐스팅 method

private <T> List<T> getDataset(List<List<Object>> datasets, int index){

return (List<T>) datasets.get(datasetIndex);

}


**Service interface

List<List<Object>> test();


**Service

public List<List<Object>> test() {

return myMapper().test();

}


**Mapper java

List<List<Object>> test();


**Mapper xml

<resultMap id="myId1" type="MyCustomClassA"></resultMap>

<resultMap id="myId2" type="MyCustomClassB"></resultMap>

<resultMap id="myId3" type="String"></resultMap>

<resultMap id="myId4" type="Integer"></resultMap>


<!-- 여러개 resultMap을 콤마(,)로 구분하여 붙여쓴다. 쿼리결과와 resultMap의 순서가 같아야한다.-->

<select id="test" resultMap="myId1,myId2,myId3,myId4"> 

EXECUTE [dbo].[TEST]

</select>


**DB Procedure (mssql기준)

CREATE PROCEDURE [dbo].[TEST]

AS

BEGIN


    SELECT * FROM TB_CUSTUM_A

    SELECT * FROM TB_CUSTUM_B

    SELECT 'mydata' AS [MYDATA]

    SELECT 12345 AS [MYNUMBER]

END

-------------------------------------------------------------------------------------------


[작성자] devbible.tistory.com

'Development' 카테고리의 다른 글

[Cpp] dos command  (0) 2015.04.01
[IOS] 유니티 IOS 빌드 후 용량 대폭증가 이슈  (0) 2015.03.18
[Java] String 의 특정 index의 문자열 교체  (0) 2015.01.07
[Java] int to char  (0) 2015.01.07
[Spring] logger 의 additivity  (0) 2014.12.22
댓글