흐르는 시간의 블로그...

내 업무는 아니지만 회사 업무에서 Java / iBatis를 사용하는 케이스가 있다.


처음에는 설정 파일을 보고 Pool이란 단어를 지나쳐서 Pool을 사용하지 않는지 알았다.

특히 DB에 일련의 특별한 connection pool을 사용하고 있는 것 처럼 보이지 않아서 였다.


<transactionManager type="JDBC" > 

<dataSource type="SIMPLE">

                   ..............................

<property name="Pool.MaximumActiveConnections" value="10"/>

<property name="Pool.MaximumIdleConnections" value="5"/>

<property name="Pool.MaximumCheckoutTime" value="20000"/>

<property name="Pool.TimeToWait" value="10000"/>

</dataSource>

</transactionManager>


다음의 링크에 가면 자세한 설명이 있다.

결국 iBatis에서 관리하는 connection pool을 사용하다는 얘기다.


IBATIS MaximumIdleConnections / Connection pooling logic (SimpleDataSource)

'프로그래밍???' 카테고리의 다른 글

Too Slow JDBC Connection  (0) 2016.10.10
GO Lang 시작  (0) 2016.09.22
Redis 시작...  (0) 2015.12.11
DNS의 타입에 대해...  (0) 2015.04.21
엑셀에서 랜덤 문자열 생성하는 VBA 스크립트  (0) 2015.03.04

Redis 시작...

프로그래밍???2015. 12. 11. 12:10

뭐... 항상 그렇지만...

Redis 관련 서적도 보곤 하지만 운영에 대한 부분은 역시나 부족하다.

당분관 개괄로 모두 보기를 시전한다. (작성 진행중)


1. In memory dictionary Redis 소개 - 조대협의 블로그

2. Redis 설치 정리 - 블로그 threadbuilder

3. RUNNING MULTIPLE REDIS INSTANCES ON THE SAME SERVER - CHRIS LASKEY BLOG 

4. run multiple redis instances on the same server for centos

5. Debian 계열에서 redis-server를 여러 개 띄우기 - Perpetual beta

6. Multiple Redis Instances - Stack Overflow

7. Redis configuration - Redis homepage

8. 레디스 시작하기 

9. Redis latency problems troubleshooting - Redis Homepage

테이블 생성을 하는데 인덱스를 사용하여 PK 설정을 하는 과정에서 해당 에러가 발생 했다.

별 내용 없으니 전체 쿼리를 올린다.

CREATE TABLE UBIKHANS.TBL_ECO_FMUINFO
(
    CARNO                NUMBER(8) NOT NULL ,
    REPOTIME             NUMBER(8) NOT NULL ,
    FMU_VERSION          NUMBER(8) NULL 
)
NOLOGGING
NOCOMPRESS 
NOPARALLEL
NOMONITORING;

COMMENT ON TABLE UBIKHANS.TBL_ECO_FMUINFO IS 'FMU2의 버전 정보와 관련 정보를 저장하는 테이블이다';
COMMENT ON COLUMN UBIKHANS.TBL_ECO_FMUINFO.CARNO IS '차량 번호';
COMMENT ON COLUMN UBIKHANS.TBL_ECO_FMUINFO.FMU_VERSION IS 'FMU2의 버전 값';
COMMENT ON COLUMN UBIKHANS.TBL_ECO_FMUINFO.REPOTIME IS '보고 시각';

CREATE UNIQUE INDEX UBIKHANS.ECO_FMUINFO_IDX01 ON UBIKHANS.TBL_ECO_FMUINFO (CARNO ASC, REPOTIME ASC) NOLOGGING;
ALTER TABLE UBIKHANS.TBL_ECO_FMUINFO ADD CONSTRAINT ECO_FMUINFO_PK PRIMARY KEY (CARNO, REPOTIME) USING INDEX UBIKHANS.ECO_FMUINFO_IDX01;
ALTER TABLE UBIKHANS.TBL_ECO_FMUINFO ADD (CONSTRAINT ECO_FMUINFO_FK01 FOREIGN KEY (CARNO) REFERENCES UBIKHANS.TBL_ECO_SERVICE (CARNO) ON DELETE CASCADE);

위에서 강조한 코드에서 (CARNO ASC, REPOTIME ASC)를 사용하지 않고 (CARNO ASC, REPOTIME DESC)를 사용하면 해당 에러를 발생 시킨다.

자세한 것은 좀 더 조사해서 붙여보도록 한다.

원래는 CPPJSON 라이브러리를 쓰다가...

어차피 POCO의 Logger를 사용하는 중이기 때문에 하나라도 줄이자라는 생각에...

Poco::JSON을 사용하기로 하였다.


그러나... 간단한 문제가 어려운 상황에 봉착하였다.

영문으로는 아래에다 질문을 올렸고 잘 아는 어떤분(?)이 좋은 댓글을 달아 줬다.

나도 알아낸바가 있지만 짧은 영어로 길게 설명하기 어려워... 여기다가 좀 더 달아본다.


Bad cast exception on poco-library when I tried to cast Int64


원래 소스코드는 저기가서 보시고...

수정한 소스코드는 아래에 있다.


stack overflow에서 지적된 부분의


첫번째는...

_object == NULL 로 비교하면 안된다는 부분이다.


두번째는

각 이름에 해당하는 부분들에 null 값이 올 수 있다는 점이다.

따라서 그 부분을 체크하지 않으면 exception이 발생한다.


세번째는

extract 대신 convert를 사용해야 한다는 점이다.

위의 링크에 가서 테스트에 사용한 bcodew값을 보면 서울 지역은 int 안쪽에 들어오고 다른 지역은 Int64를 사용해야 한다

"BCodeW"를 통해 가져온 값의 타입을 보면 Int 범위는 "i", Int64범위는 "l"을 보여준다.

extract는 해당하는 값의 레퍼런스를 가져오기 때문에 정확한 타입이 맞지 않으면 Bad Cast Exception을 발생시킨다.

Int64가 더 큰 범위임에서 자동 캐스팅이 발생하지 않는다.

큰 범위로 캐스팅해서 값을 가져오고자 한다면 convert를 사용하자.

// POCO JSON 사용
bool CUBIUtils::ParseAddressResult( llong& _BCodeW, char* _szPOI, char* _szJibun, char* _szAPIResult )
{
	JSON::Parser parser;
	try
	{
		formatlog( LOG_DEBUG, "CUBIUtils::%s(%d) AddrSrc: %s", __func__, __LINE__, _szAPIResult);

		JSON::Object::Ptr _object = parser.parse(_szAPIResult).extract();

		_BCodeW = 0;
		if ( _object->isNull("BCodeW"))
			formatlog( LOG_WARN, "CUBIUtils::%s(%d) BCodeW is NULL", __func__, __LINE__);
		else
			_BCodeW = _object->get("BCodeW").convert();

		if ( _object->isNull("poi"))
			formatlog( LOG_WARN, "CUBIUtils::%s(%d) poi is NULL", __func__, __LINE__);
		else
			strcpy( _szPOI, _object->get("poi").extract().c_str());

		if ( _object->isNull("jibun"))
			formatlog( LOG_WARN, "CUBIUtils::%s(%d) jibun is NULL", __func__, __LINE__);
		else
			strcpy( _szJibun, _object->get("jibun").extract().c_str());
	}
	catch(exception &e)
	{
		formatlog( LOG_ERROR, "CUBIUtils::%s(%d) JSON parsing Exception. %s", __func__, __LINE__, e.what());
		return false;
	}

	return true;
}