달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 5. 19. 15:49

Heapdump 파일 생성 이유 I.lib()/I.lib(Java)2010. 5. 19. 15:49

.. .. ..

웹서버 로그에 OutOfMemory에러가 떨어지며 루트 상에 core파일과 heapdump파일을 떨군다.
이게 지속되면 쌓이기 때문에 부하가 생겨 서버에 문제를 준다.
일단 원인은 메모리 부족 현상으로
과다한 데이터 양 조회, 무리하거나 비정상적인 화면 운용, 무거운 쿼리, 무거운 어플리케이션 화면,
동적 쿼리가 잘못 생성되는 것, 세션끊김현상
이 있다.

세션끊김 현상 : 세션이 끊길 경우에 대비한 우회 비즈니스 로직 구현

과다한 데이터 양 : fatch size의 조절로 무리하지 않는 선에서 진행하거나 메모리를 늘린다. money is 진리.
 
무리하거나 비정상적인 화면 , 쿼리, 화면 등의 이유 : 성능 튜닝이 길.

.
:
Posted by .07274.
.. .. ..
BasicDataSource 초기 값

public class BasicDataSource
    implements DataSource
{

    public BasicDataSource()
    {
        defaultAutoCommit = true;
        defaultReadOnly = null;
        defaultTransactionIsolation = -1;
        defaultCatalog = null;
        driverClassName = null;
       maxActive = 8;
       maxIdle = 8;

        minIdle = 0;
        initialSize = 0;
        maxWait = -1L;
        poolPreparedStatements = false;
        maxOpenPreparedStatements = -1;
        testOnBorrow = true;
        testOnReturn = false;
        timeBetweenEvictionRunsMillis = -1L;
        numTestsPerEvictionRun = 3;
        minEvictableIdleTimeMillis = 0x1b7740L;
        testWhileIdle = false;
        password = null;
        url = null;
        username = null;
        validationQuery = null;
        accessToUnderlyingConnectionAllowed = false;
        restartNeeded = false;
        connectionPool = null;
        connectionProperties = new Properties();
        dataSource = null;
        logWriter = new PrintWriter(System.out);
    }


설정

initialSize
초기에 생성되는 커넥션의 갯수

maxActive
커넥션 풀이 제공할 최대 커넥션의 개수

maxIdle
사용되지 않고 풀에 저장될수 있는 최대 커넥션 갯수, 음수일 경우 제한이 없다.

maxWait
풀에 커넥션에 존재하지 않을 때, 커넥션이 다시 풀에 리턴될 때까지 대기시간, 1/1000초 단위, -1일 경우 무한대기

minEvictableIdelTimeMillis
사용되지 않은 커넥션을 추출할 때 이 속성에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출한다. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거 안됨, 1/1000초 단위

timeBetweenEvictionRunMillis
사용되지 않은 커넥션을 추출하는 쓰레드의 실행 주기를 지정한다. 양수가 아닌경우 실행 되지 않는다.

numTestsPerEvictionRund
사용되지 않는 커넥션을 몇 개 검사할지 지정

testOnBorrow
true 일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부 검사

testOnReturn
true 일 경우 커넥션 풀에서 커넥션을 반환할 때 커넥션이 유효한지의 여부 검사

testWhileIdel
true 일 경우 비활성화 커넥션을 추출할때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거

poolPreparedStatements
PreparedStatements를 풀링 할것인지 결정한다.

PreparedStatement란 이처럼 바인드 변수의 사용을 가능케 하기 위해 사용됩니다. 따라서 동일한 문장(위처럼 값만 바뀐다거나 할때)이 여러번 연속적으로 실행되거나 비교적연속적(라이브러리 캐쉬에 있는 실행계획이 LRU에 의해 메모리에서 삭제되기 직전에 다시 실행되기만 한다면)으로 실행된다면 월등한 성능향상을 얻을 수 있습니다.
그러므로 꼭 사용하도록 설정한다 ( true로 설정해준다.)
 - 사견으로 이 설정을 해주고 해주지 않은 차이는 약 2.2배의 성능 향상의 차이가 있었다.)

'I.lib() > I.lib(iBatis)' 카테고리의 다른 글

Mybatis 설정  (0) 2013.04.01
DBCP 와 iBatis 를 이용한 connection pool  (0) 2013.03.19
Ibatis settings 요소  (1) 2010.04.12
[IBatis] 결과가 NULL 일때 대처방법.  (0) 2010.03.23
iBatis 강의 자료.  (0) 2010.02.24
.
:
Posted by .07274.
2010. 4. 27. 13:46

Axis2 설치 / 설정 I.lib()/I.lib(Axis2)2010. 4. 27. 13:46

.. .. ..
설명
  • tomcat6
  • Apache2
  • Ant

가 설치 되어 있는 상황에서

  • Axis설치
  • Axis 웹 어플리케이션 설치
  • Axis로 웹서비스하기

에 대한 내용입니다.

 

서버

우분투 9.04 서버

 

Axis2설치

http://ws.apache.org/axis2/download.cgi 에 가서 다운로드 받는다.

지금 설치하고자 하는것은 1.5 버젼입니다.

  • Binary
  • Source
  • WAR
  • Document

의 4가지 파일이 있습니다.

WAR를 다운로드 합니다.

압축풀면 나오는 확장자가 war파일을 Tomcat에 deploy합니다.

방법은.. Tomcat webapps디렉토리에 넣으시면 됩니다.

ROOT라는 디렉토리와 같은 레벨이 될 것입니다.

 

확인

http://localhost:8080/axis2

로 들어갔을때 오류화면이 아니라면 성공입니다 ^^

(tomcat6이나 5.5에서 security문제가 있으니 tomcat6설치 나 tomcat5설치의 문서를 확인하세요)

 

참고자료


'I.lib() > I.lib(Axis2)' 카테고리의 다른 글

CXF 를 이용해 Web Service 이용하기 (axis2비슷)  (0) 2013.08.08
AXIS2 정리 및 요약  (0) 2010.09.06
Axis + eclipse 이용 client 설정  (0) 2010.05.20
axis2 + eclipse Server 올리는 설정  (1) 2010.05.20
AXIS2 관련 ERROR  (2) 2010.05.19
.
:
Posted by .07274.
2010. 4. 19. 15:02

SqlMapClient 와 SqlMapClientTemplate I.lib()/I.lib(S.Batch)2010. 4. 19. 15:02

.. .. ..
* iBATIS API의 핵심은 com.ibatis.sqlmap.client.SqlMapClient 인터페이스이다. 

* SqlMapClientTemplate은 SqlMapClient를 감싸서 애플리케이션 대신 물 밑에서 세션을 열고 닫아주며, 발생하는     모든 SQLException을 잡아서 스프링의 비검사형 예외 중 하나로 변환해 다시 던지는 역할을 한다. 


1. SqlMapClientTemplate 구성
   
  - SqlMapClientTemplate 애플리케이션 컨텍스트 설정 ( SqlMapClient를 Template에 와이어링 )
  <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient" />
  </bean>

  - SqlMapClient 빈 생성
  <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="sql-map-config.xml" />
  </bean>


2. iBATIS SQL 맵 정의

  - configLocation 프로퍼티에는 반드시 iBATIS SQL 매핑 파일들의 위치가 나열된 XML 파일 경로가 설정되야 함
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE ....>
  <sqlMapConfig>
<sqlMap resource="ssboard/dao/User-sql.xml" />    <- 이런식으로
  </sqlMapConfig>

  - xml 파일은 결과매핑정의와 질의문 선언으로 되어있다. 


3. DAO에서 템플릿 사용하기

  - sqlMapClientDaoSupport 클래스는 iBATIS용 DAO 지원 클래스다. 

  - SqlMapClientDaoSupport에 SqlMapClient 객체가 주입되면 iBATIS의 단순 반복적인 코드를 숨기기 위해                SqlMapClient 를 감싼 SqlMapClientTemplate 이 생성된다. 

  - SqlMapClientTemplate을 DAO에 직접 와이어링 하는 것과 SqlMapClientDaoSupport 클래스를 상속 받는 것의        가장 큰 차이점은, 스프링 설정 파일에서 빈 하나를 덜 설정해도 된다는 데 있다. 

  - DAO가 SqlMapClientDaoSupport 클래스를 상속하게 되면, SqlMapClientTemplate 빈은 건너뛰고 SqlMapClient     ( 또는 SqlMapClient를 생성하는 SqlMapClientFactoryBean )을 DAO에 직접 와이어링 할 수 있게 된다. 

  
<bean id="rantDao" class="com.roadrantz.dao.ibatis.IbatisRantDao">
<property name="sqlMapClient" ref="sqlMapClient" />
   </bean>

  * "IbatisRantDao"는 SqlMapClientDaoSupport 클래스를 상속한 클래스



참고자료 : 
Spring In Action - 5.6 스프링과 iBATIS

'I.lib() > I.lib(S.Batch)' 카테고리의 다른 글

Spring Batch sample source [일부]  (2) 2010.04.07
Spring_Batch_v1.1.2  (2) 2010.03.16
Spring Batch Operator 사용법에 관한 글  (3) 2010.03.04
.
:
Posted by .07274.
.. .. ..
저장프로시저
- 저장 프로시저는 하나 이상으로 구성된 Transact-SQL 문을 데이터베이스에 저장한 개체입니다.

저장프로시저 특징
  • 모듈 프로그래밍
    자주 반복해서 사용하는 T-SQL문을 DB에 저장해 필요한 시점에만 사용함.
    매번 같은 구문을 다시 작성할 필요가 없음
  • 유연한 보완관리
    데이터 조회하는 저장프로시저. 접근권한이 없어도 저장프로시저를 실행할 권한이 있다면 조회가능
  • 네트워크 트래픽 감소
    쿼리전체를 서버로 전송해서 작업하는 것이 아닌 저장 프로시저와 매개변수값만을 전달함으로 데이터량이 작음
  • 빠른실행
    저장프로시저는 실행후 쿼리 실행계획을 메모리에 저장 > 저장된 실행계획 사용 > 구문분석이나 최적화 과정 거치지 않아서 더 빠른 실행을 할수 있고 캐시에 없더라도 구문분석, 표준화등의 작업을 하지 않기에 성능이 빠름

저장프로저의 구성요소
저장 프로시저명, 매개변수들, SQL문, 결과값 반환의 반환값

저장프로시저의 종류
  • 확장프로시저 : C와 같은 언어를 이용해서 구현한 프로시저, master DB에만 추가가능
  • 사용자 정의 저장 프로시저 : T-SQL문을 이용해 저장 프로시저로 구현
  • 시스템 저장 프로시저 : SQL서버관리를 위해 시스템에서 제공해주는 저장 프로시저
    sys의 스키마로 나타남, 데이터베이스 명 필요없이 시스템 저장 프로시저명을 통해서 실행가능

    Sp_who, sp_who2 : 사용자 정보
    Sp_lock : lock 정보
    Sp_help : 지정한 개체 정보
    Sp_helpdb : 지정한 DB정보
    Sp_configure : SQL 서버 설정변경
  • 임시 저장프로시저
    T-SQL 문 또는 일괄처리의 실행계획을 재 사용하지 않던 이전 버전의 방식
    사용자 정의 프로시저와 동일하게 작성하지만, 저장프로시저 명을 #으로 하면 임시저장프로시저가 됨
    SQL Server 2005에서는 T-SQL문과 일괄처리의 실행계획을 재 사용할수 있음으로 임시저장프로시저 사용이 거의없음
  • CLR 저장 프로시저
    T-SQL에서 부족한 프로그래밍 부분을 CLR 저장 프로시저를 통해 T-SQL 저장 프로시저보다는 더 강력한 구조적 프로그래밍이 가능

저장 프로시저의 생성

CREATE PROCEDURE usp_withANumber <- 소문자 : 스키마. 저장 프로시저명
@ EmployeeID INT <- 매개변수, 데이터 형식
AS
SELECT ANumber, AContent, ManagerID
FROM HumanResource.analysisDate
WHERE ManagerID = @ EmployeeID
GO

EXECUTE usp_withANumber

GO
* 임시 저장프로시저의 생성은
CREATE PROCEDURE #usp_withANumber <- 소문자 : 스키마. 저장 프로시저명앞에 샾
* 저장프로시저 생성시, SP_ 접두사는 시스템저장프로시저와 혼란을 줄수 있음으로 사용금지
* 그룹화면 저장프로시저 삭제시 개별적으로 하나씩 삭제할수 없음으로 가급적 사용하지말것
- 그룹화하기 : 같은 저장 프로시저명에 ; 하고 숫자를 매김

CREATE PROCEDURE usp_withANumber;1
AS
[ T-SQL구문 ]
GO

CREATE PROCEDURE usp_withANumber;2
AS
[ T-SQL구문 ]
GO

* 다른 사용자의 접근막기위해서는 CREATE아래쪽에 WITH ENCRYPTION을 사용함
시스템뷰에서 저장프로시저의 텍스트가 나타나지 않음. 암호화된 저장프로시저의 내용은 다시 확인할수 있는 방법이 없음으로 암호화되기전의 저장프로시저를 잘 보관해야함



저장 프로시저의 수정

ALTER PROCEDURE 스키마. 저장프로시저명.
@ 매개변수 데이터 형식
AS
[ 변경된 SQL문 ]



저장 프로시저의 삭제

DROP PROCEDURE 스키마.저장프로시저명;



기본값을 지니는 매개변수의 사용과 output사용

CREATE PROCEDURE usp_withANumber
@EmployeeID INT = 10 <- EmployeeID에 기본값을 지정한 것
@outvalue int output <- outvalue에 output 변수를 쓰겠다는것
@currency_cursor CURSOR VARYING OUTPUT <- output 매개변수로 커서를 사용할때
AS
SELECT @outvalue = ManagerID <- 관리자 ID를 output 매개변수에 설정
FROM HumanResource.analysisDate
WHERE ManagerID = @ EmployeeID
GO

DECLARE @ManagerID INT; <- 저장프로시저 output 매개변수에 반환하는 값저장을 위한 지역변수선언

EXECUTE usp_withANumber 20, @ManagerID output <-반환되는값 조회

GO

.
:
Posted by .07274.
2010. 4. 12. 16:00

IOT(INDEX ORGANIZED TABLE) I.lib()/I.lib(Altibase)2010. 4. 12. 16:00

.. .. ..
IOT(INDEX ORGANIZED TABLE) 란?


일반 테이블에서 인덱스를 통해서 레코드를 액세스 할 때에는 키 값을 가지고 인덱스를 탐색해서 ROWID를 얻은 다음에  다시 ROWID를 이용해서 테이블을 읽는 두 번의 과정을 거쳐야 합니다.

또한 키 컬럼이 인덱스와 테이블 양 쪽에 중복해서 저장되므로 키 값이 큰 경우에는 디스크의 낭비 또한 무시할 수 없습니다.

이러한 문제점을 해결하고자 고안된 것이 IOT(Index Organized Table) 입니다.


 - IOT는 인덱스 안에 테이블을 넣어 버린 구조로 되어 있기 때문에 인덱스를 읽는 것으로 모든 작업이  완료 됩니다.

 - 키 값에 해당되는 레코드를 테이블에서 읽을 필요도 없고, 데이터의 중복 문제도 자연스럽게 해결할 수 있습니다.

 - IOT는 겉보기에는 테이블이지만 실제로는 기본 키(primary key)를 근간으로 한 인덱스이기 때문에 전제 조건으로 Primary Key를 필요로 합니다.

 - IOT를 생성하면 인덱스와 테이블이 같은 저장 구조에 생성되어 SQL 문이 실행되면, 무조건 IOT 인덱스를 통해 데이터를 검색하여 빠른 데이터 검색이 가능하고 저장 공간이 적게 사용 합니다.


특징

- IOT는 table data를 primary key에 대한 B*Tree index에 적재하는 구조를 갖습니다.

- IOT의 index row들은 인덱스 키 값과 non-key 값을 포한 합니다.

- IOT의 index에는 ROWID 정보가 없습니다.


장점

- range search, exact match를 수행하는 경우 일반적인 table보다 빠른   key-based access가 가능 합니다.

- full table scan 시 primary key에 대한 full index scan이 이루어지므로  자동적인 ordering이 이루어 집니다.

- index key column과 rowid에 대한 storage 중복을 피할 수 있어 storage가 절약 됩니다.

일반 테이블과 IOT테이블의 차이점


 - 일반테이블은 ROWID로 행을 구별하지만 IOT는 PK로 행을 구별합니다.

 - 일반 테이블의 FULL SCAN은 행이 Return되는 순서를 예측할 수 없지만, IOT는 PK값의 순서에 따랄 출력됩니다.

 - IOT는 Unique 제약조건을 설정 할 수 없습니다.

 - IOT는 클러스트를 사용할 수 없습니다.

 - IOT는 일반테이블보다 저장공간이 감소합니다.

 - IOT는 Primary Key를 꼭 생성해야 합니다.  

 - IOT의 Secondary 인덱스는 Primary Key값과 그것을 기반으로 하는 ’Universal Rowid’ 즉, Urowid를 가지고 인덱스가 만들어집니다.

 - IOT는 일반 인덱스와 달리 물리적인 ROWID 정보를 가지고 있지 않고 논리적인 유니버설 ROWID(UROWID)를 가지고 있어 빠르게 검색할 수 있습니다.


 ※ UROWID(Universal Rowid) : 인덱스 구성 테이블(IOT, Index-Organized Table)행의 논리적인 위치

IOT(INDEX ORGANIZED TABLE) 생성


[Syntax]



-- IOT 생성 예제
SQL> CREATE TABLE iot_test (
         id NUMBER CONSTRAINT   iot_test_pk_id   PRIMARY KEY,
         name VARCHAR2(30),
         contents VARCHAR2(2000))
         
ORGANIZATION INDEX TABLESPACE indx
         
PCTTHRESHOLD 40 INCLUDING name
         
OVERFLOW TABLESPACE users;
 
테이블이 생성되었습니다.


아래는 위에서 생성한 문법의 설명 입니다.

 ORGANIZATION INDEX TABLESPACE : IOT Data 저장되는 Tablespace
 
 
PCTTHRESHOLD

  - IOT
위해서 예약된 공간의 백분율, 1블럭의 N% 비율보다 데이터가 입력되면 열이 아닌 데이터는 OVERFLOW TABLESPACE절에 정의된 테이블스페이스에 저장 됩니다.

  - 0~50
사이값으로만 지정가능, 디폴트는 50

  -
만약 PCTTHRESHOLD 40 으로 지정했을 경우,  하나의 행자체가 위에 값보다 크게 되면 INCLUDING
뒤에 있는 컬럼만 제외하고는 모두 OVERFLOW 세그먼트로 이동됩니다.
 
 
INCLUDING

  - IOT
행을 인덱스와 오버플로우 구역으로 나눌 열을 구분합니다.  

  - INCLUDING
지정되지 않았는데 크기가 PCTTHRESHOLD 초과하면 기본 열을 제외한 모든 오버플로우 세그먼트에 저장이 됩니다.

  - INCLUDING
뒤에 있는 컬럼만 제외하고 모두 오버플로우 세그먼트에 저장이 됩니다.

  - INCLUDING
절에 오는 열은 기본 키의 마지막 열의 이름 이거나 기본 키가 아닌 입니다.
 
 
OVERFLOW TABLESPACE
 
  -
PCTTHRESHOLD 초과하는 Data 행이 저장됩니다.

  -
만일 Overflow Tablespace Option 주지 않고 생성된 IOT 대하여 (PCTTHRESHOLD / 100) *DB_BLOCK_SIZE보다 row 발생한다면 ORA-1429 같은 오류를 만나게 됩니다



 

IOT 생성시 만들어지는 세그먼트


위에서 설명한거와 같이 IOT 생성할  기본적으로 인덱스 세그먼트와 OVERFLOW 세그먼트를 지정합니다.


인덱스 : PK 지정시 생성되는 인덱스로 CREATE TABLE 문에 지정된 테이블스페이스에 생성되며 이때 지정된 스토리지와 공간활용 파라미터를 가진다.

OVERFLOW 행조각을 수용할 테이블 : PCTTHRESHOLD 초과한 경우 나머지 컬럼들이 저장되는 테이블로 이름이 SYS_IOT_OVER_n으로 지정되며 n DBS_OBJECTS에서 있는 IOT OBJECT_ID입니다.





-
위에 그림과 같이 인덱스 세그먼트이름은 PK 이름이 되고, 세그먼트유형은 INDEX 됩니다.

-
OverFlow 세그먼트는 세그먼트이름은  SYS_IOT_OVER_n 지정되고, 세그먼트유형은 TABLE 됩니다.



-- 위에서 생성한 IOT 인덱스 세그먼트를 조회 예제 입니다.
SQL> SELECT segment_name FROM user_segments WHERE segment_type=’INDEX’;
SEGMENT_NAME
----------------------
PK_DEPT
PK_EMP
IOT_TEST_PK_ID    --> IOT Data 저장되는 세그먼트



-- 위에서 생성한 IOT OverFlow 세그먼트 조회 예제 입니다.
SQL> SELECT segment_name FROM user_segments WHERE segment_type=’TABLE’;
 
SEGMENT_NAME
------------------------------------------------------------------------
DEPT
EMP
SYS_IOT_OVER_30957 --> OVERFLOW 해당하는 Data 저장되는 세그먼트


 

IOT 실습

똑같은 테이블과 똑같은 데이터를 가지고 일반테이블과 IOT 실습을 해보겠습니다.
 
 
1) 먼저 일반테이블을 생성해서 데이터를 INSERT합니다.


-- 테이블을 생성합니다.
 CREATE TABLE TEST(
 NO NUMBER  CONSTRAINT TEST_NO_PK Primary Key,
 TITLE VARCHAR2(50),
 CONTNETS VARCHAR2(500))
 TABLESPACE USERS;


 -- Data INSERT합니다.
 INSERT INTO TEST
VALUES(3,’CCCCCCCCCC’,’CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC’);
 INSERT INTO TEST
VALUES(1,’AAAAAAAAAA’,’AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’);
 INSERT INTO TEST
VALUES(5,’EEEEEEEEEE’,’EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE’);
 INSERT INTO TEST
VALUES(2,’BBBBBBBBBB’,’BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB’);
 INSERT INTO TEST
VALUES(4,’DDDDDDDDDD’,’DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD’);
 COMMIT;


-- 데이타를 조회 합니다.
SQL> SELECT no, title FROM test;
 
  NO TITLE
---- ------------ 
   3 CCCCCCCCCC
   1 AAAAAAAAAA
   5 EEEEEEEEEE
   2 BBBBBBBBBB
   4 DDDDDDDDDD




 
2) 위와 똑같이 IOT 생성해서 똑같은 데이터를 INSERT합니다.
 
 
-- IOTTEST 테이블을 생성합니다.
CREATE TABLE IOTTEST (
NO NUMBER CONSTRAINT   IOTTEST_PK_NO   PRIMARY KEY,
TITLE VARCHAR2(50),
CONTENTS VARCHAR2(500))
ORGANIZATION INDEX TABLESPACE INDX
PCTTHRESHOLD 40 INCLUDING TITLE
OVERFLOW TABLESPACE USERS;
 
 
-- DATA INSERT합니다.
 INSERT INTO IOTTEST
VALUES(3,’CCCCCCCCCC’,’CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC’);
 INSERT INTO IOTTEST
VALUES(1,’AAAAAAAAAA’,’AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’);
 INSERT INTO IOTTEST
VALUES(5,’EEEEEEEEEE’,’EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE’);
 INSERT INTO IOTTEST
VALUES(2,’BBBBBBBBBB’,’BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB’);
 INSERT INTO IOTTEST
VALUES(4,’DDDDDDDDDD’,’DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD’);
 COMMIT;
 
 
-- 데이타를 조회 합니다.
SQL>COL title FORMAT A30;
SQL> SELECT no, title FROM iottest;
 
  NO TITLE
---- ----------
   1 AAAAAAAAAA
   2 BBBBBBBBBB
   3 CCCCCCCCCC
   4 DDDDDDDDDD
   5 EEEEEEEEEE

 
입력한 순서에 상관없이 오름차순으로 정렬되어 있는 것을 확인 있습니다


 

IOT 9i 향상기능


오라클 9i에서 확장된 IOT 대한 온라인 기능 보겠습니다.
 
 
 -- IOT 세컨더리 인덱스에 대해 온라인 생성과 재구성을 있습니다.  
SQL>CREATE INDEX iottest_title_idx ON iottest (title) ONLINE;  
인덱스가 생성되었습니다.
 
 
-- IOT 프라이머리 인덱스에 대해 온라인 COALESCE 있습니다.  
SQL>ALTER TABLE iottest COALESCE;  
 
 
 
IOT 로지컬 ROWID 온라인 갱신
 
IOT 세컨더리 인덱스는 성능향상을 위해 엔트리에 대한 로지컬 ROWID 저장합니다.
로지컬 ROWID 변경될 있기 때문에 인덱스에 저장된 값은 최대 추측가능 값이 됩니다.

따라서, 로지컬 ROWID 내내 변질 상태가 있고, 변질된 로지컬 ROWID 온라인으로 갱신이 가능합니다.

아래 명령어로 로지컬 ROWID 온라인 갱신을 있습니다.
 
 
 
-- IOT 세컨더리 인덱스에 대한 로지컬 ROWID 온라인 갱신을 있습니다.  
SQL>ALTER INDEX iottest_title_idx UPDATE BLOCK REFERENCES;  
 
 
 
IOT 온라인 MOVE

IOT
단편화(fragmentation) 방지하기 위해 재생성 있습니다.
ALTER
명령의 MOVE옵션을 사용하여 재생성 작업을 온라인으로 있습니다.
오버플로우 데이터 세그먼트도 온라인으로 옮겨질 있습니다.


 -- IOT
오버플로우 세그먼트와 함께 온라인으로 옮길 있습니다.
 -- iottest
테이블의 테이블스페이스와 OVERFLOW 테이블스페이스 변경  
SQL>ALTER TABLE iottest MOVE ONLINE TABLESPACE tbs1
      OVERFLOW TABLESPACE
tbs2;


 

IOT 정보조회


-- PAGE,문자열 포맷설정
SET LINESIZE 120;
COL IOT FORMAT A10;
COL OVERFLOW FORMAT A25;
COL INDEX FORMAT A20;
COL OVERFLOWTS FORMAT A10;
COL INDEXTS FORMAT A10;


-- IOT 정보 조회
SELECT t.table_name AS "IOT", o.table_name AS "Overflow",
       i.index_name AS "Index", o.tablespace_name AS "OverflowTS",
       i.tablespace_name AS "IndexTS", I.pct_threshold
FROM dba_tables t, dba_tables o, dba_indexes I
WHERE t.owner = o.owner
  AND t.table_name = o.iot_name
  AND t.owner = I.owner
  AND t.table_name = I.table_name
  AND t.owner = ’SCOTT’;


-- 조회 결과
IOT        Overflow                  Index                OverflowTS IndexTS    PCT_THRESHOLD
---------- ------------------------- -------------------- ---------- ---------- -------------
IOTTEST    SYS_IOT_OVER_30979        IOTTEST_PK_NO        USERS      INDX                  40
IOTTEST    SYS_IOT_OVER_30979        IOTTEST_TITLE_IDX    USERS      SYSTEM
IOT_TEST   SYS_IOT_OVER_30966        IOT_TEST_PK_ID       USERS      INDX                  40



<< 참고문헌 >>
- Oracle Technical Bulletins  No.11615 ORACLE 8.0의 IOT(INDEX ORGANIZED TABLE)
- Oracle 9i Performance Tuning Student Guide Volumn 1

  ================================================
    * 데이터베이스 정보공유 커뮤니티 oracleclub.com
    * 강좌 작성자 : 김정식 (oramaster _at_ naver.com)

.
:
Posted by .07274.
2010. 4. 12. 14:59

Ibatis settings 요소 I.lib()/I.lib(iBatis)2010. 4. 12. 14:59

.. .. ..
<setting> 요소는 약간의 잡동사니 설정 옵션이다. <settings> 요소에 속성을 추가함으로써 값을 지정할 수 있다. 여러가지 설정들이 있으며 각각은 SQL Maps 인스턴스에 전체적으로 적용된다.

lazyLoadingEnabled
적재 지연 (Lazy Loading)은 정보를 필요할 때만 읽어들이고 다른 데이터는 명시적인 요청이 있을때까지 적재를 미루는 기술이다. 다른 말로 하면 절대적인 요청이 들어올 때까지 애플리케이션이 가능한 한 일을 적게 하는 것이다.

1000명의 고객 계좌가 각각 1000개의 주문을 가지고 있고 각 주문은 25개의 항목을 가졌다. 이 모든 데이터를 읽어 들이려면 25,000,000개의 객체를 생성하고 그것들을 메모리에서 유지해야 할 필요가 생긴다. 적재 지연을 사용하면 요구 사항을 거의 2500개로 줄일수 있으며 이는 원래 개수의 일만분의 1이다.
이 설정은 연관된 쿼리 구문이 있을때 적재 지연을 사용할지 여부를 지정하는 데 쓰인다. 사용 가능한 값은 'True' 혹은 'False'이며 디폴트 값은 'True'이다.

cacheModelsEnabled
캐싱은 성능을 향상시키는 기법으로 최근 사용된 데이터가 미래에 다시 사용될 것이라 가정하고 메모리에 계속 저장해 두는 것이다. 이 설정은 iBatis가 캐싱을 사용할지 여부를 지정하는데 사용한다.
디폴트 값은 'True'이며 캐싱의 이점을 누리려면 매핑 구문에 캐시 모델도 설정해야만 한다.

enhancementEnabled
이 설정은 CGLIB에 최적화된 클래스를 통해 적재 지연 성능을 향상시킬지 여부를 지정하는 데 사용한다. 마찬가지로 사용 가능한 값은 'True' 와 'False' 이고 디폴드 값은 'True' 이다.
[참고]
CGLIB는 실행 시간에 코드를 생성하는 라이브러리이다. 이는 iBatis의 자바빈즈 속성 설정과 같은 특정 기능을 최적화시켜준다. 또한 구상 클래스의 적재 지연도 지원하여 적재 지연이 필요한 형에 대해 인터페이스를 생성해야만 하는 현상을 피하게 해준다. CGLIB는 http://cglib.sourceforge.net에서 구할수 있다. 다른 형성 향상 기법들처럼 꼭 필요하다고 생각되지 않으면 사용하지 않는 것이 좋다.
위의 예제에서는 enhancement 를 활성화 하였다. 하지만 cglib가 클래스 패스상에 없으면 이 기능은 조용히 비활성화 될 것이다.


useStatementNamespace
이 설정은 매핑 구문이 적절한 이름을 가지고 있어야 iBatis가 실행될수 있도록 하는 옵션이다. 사용가능한 값은 'true' 혹은 'false'이며 디폴트 값은 'false'이다.
다시 말해 SQL Map을 정의할 때 적절한 맵 이름을 가진 매핑 구문을 선택하는 데 사용된다는 것이다. 예를 들어 'Account'라는 이름을 가진 SQL mAP 이 있고 이 맵은 'insert', 'update' ,'delete', 'getAll' 이라는 이림의 매핑 구문을 포함하고 있다고 가정하자. 계좌(Account) 하나를 추가하고자 한다면, 'Account.insert'라는 매핑 구문을 호출하면 되는 것이다. 이로써 서로 다른 맵에 원하는 대로 여러 'insert' 라는 매핑 구문을 작성해도 이름이 충돌하지 않게 된다.
비록 'insertAccount'와 같은 이름을 이용해서 동일한 결과를 얻을 수도 있지만 명명공간(name space)를 사용하면 대규모 시스템에서 작업하는 데 도움이 많이 된다. 이는 쿼리 구문들이 논리적으로 조직화되어 있지 않은 경우, 구문을 찾는데 도움을 주기 때문이다.

maxRequest (비권장)
요청이란 입력,수정,삭제 그리고 저장 프로시저 호출과 같은 모든 SQL 작업을 의미한다. 디폴트 값인 512 대신에 최대 32개의 요청만이 한 번에 수행될 수 있도록 최대 요청 개수를 축소하였다.

maxSessions (비권장)
세션이란 스레드 차원의 메커니즘으로, 관련되어 있는 트랜잭션과 요청의 묶음에 대한 정보를 추적하는 데 사용한다. 위 예에서는 한 번에 10 개의 세션만이 가능하도록 하였으며, 디폴트 값은 128개이다.


maxTransactions (비권장)
트랜잭션이란 말 그대로 데이터베이스 트랜잭션을 의미한다. maxRequest(위에 나옴)와 같이 디폴트 값인 32 대신 활성 트랜잭션 개수를 5로 줄인다.
[참고]
이 설정들은 이해하기 어려운 편인데 다행이도 이것들의 사용을 권장하지 않는 것들이다. 앞으로 출시 될 iBatis 에서는 이들의 수동으로 설정할 필요가 없어질 것이다. 그러므로 대부분의 경우 이를 수정하지 말고 그냥 놔두면 된다. 기본 설정은 적젉한 규모의 대부분의 시스템에서 잘 작동한다. 만약 이를 꼭 수정해야 한다면 항상 maxRequest 값이 maxSession 값보다 크고, maxSession 값이 maxTransactions 값도다 커야 함을 명심하라. 일반적으로 단순히 이 값들을 동일하게 유지하는 것이 좋다고들 한다. 또 이 설정들 중 어느 것도 직접적으로 커넥션 풀의 커넥션 개수나 혹은 애플리케이션 서버가 관리를 책임지고 있는 자원에 대해 영향을 미치지 않는다.
.
:
Posted by .07274.
2010. 4. 8. 18:10

JNDI 란? I.lib()/I.lib(Java)2010. 4. 8. 18:10

.. .. ..

1. 사전전 의미

JNDI (Java Naming and Directory Interface)

JNDI는 자바 프로그램들을 DNS, LDAP 및 NDS 등과 같은 네이밍/디렉토리 서비스에 연결하기 위한 썬의 API이다.
애플리케이션은 JNDI API에 작성되어 있으며, 디렉토리 드라이버는 JNDI SPI (Service Provider Interface)에 작성되어 있다.
JNDI는 썬의 J2EE 플랫폼의 일부이다.

2. JNDI 서비스의 종류

   - LDAP(Lightweight Directory Access Protocol) : 네트워크 디렉토리 서비스의 표준인 x.500을 위한 경량화 프로토콜
   - DNS(Domain Name System) : 인터넷 네이밍 시스템, 컴퓨터 이름(도메인)을 IP주소로 변환
   - NIS(Network Information System) : SUN에서 개발된 네트워크 네이밍 서비스
   - RMIRemote Method Invocation)  : 분산 객체 응용 프로그램
   - CosNaming(Common Object Services) : 코바응용프로그램을 위한 네이밍 서비스 지원 
   => JNDI SPI(Service Provider Interface) 제공

3.JNDI의 구조

 Java Application

 JNDI API

Naming Manager

JNDI SPI

  LDAP, NIS, DNS, RMI,CORBA


.
:
Posted by .07274.
2010. 4. 8. 14:21

CronTrigger (잡 스케쥴링) I.lib()/I.lib(Spring)2010. 4. 8. 14:21

.. .. ..

public void crontrigger() throws Exception{
  Scheduler scheduler;

  scheduler = new StdSchedulerFactory().getScheduler();
  scheduler.start();
  //스케쥴러 스타트
  JobDetail jobdetail = new JobDetail("messageJob",Scheduler.DEFAULT_GROUP,crontrigger_job.class);
  // 절대 org.quartz.Job 을 implements 한 class를 두어야 한다.
  ClassPathXmlApplicationContext context =
                      new ClassPathXmlApplicationContext("/Application/resources/job/NeossJob_7_2.xml");
  Trigger trigger = (Trigger) context.getBean("cronTrigger");
  // Bean의 트리거를 받아온다.
  
  //String cronExpression = "0/5 * * * * ?";
  //Trigger trigger = new CronTrigger("cronTrigger",Scheduler.DEFAULT_GROUP,cronExpression);
  // Bean에서 트리거를 받아오지 않을시 이같은 방식으로 설정해준다.

  scheduler.scheduleJob(jobdetail,trigger);
 }


 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                                          http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

 <bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
       <property name="jobClass" value="Infrastructure.com.crontrigger_job"/>
       <property name="jobDataAsMap">
             <map>
                  <entry key="message" value="[SM]this is a message from the Spring config file!"/>
             </map>
       </property>
 </bean>
 
 <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
         <property name="jobDetail" ref="job"/>
  <!-- <property name="startDelay" value="1000"/>  시작 지연 1초
         <property name="repeatInterval" value="3000"/> 반복 간격 3초-->
         <property name="jobDataAsMap">
                <map>
                        <entry key="triggerMessage" value="[SM] Trigger message from the Spring config file!"/>
               </map>
        </property>
 </bean>

//아래는 cronTriggerBean이다. 자주 쓰이는 것이다.
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="job"/>
        <property name="cronExpression" value="0/1 * * * * ?"/>
 </bean>
 
 <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
         <property name="triggers">
          <list>
               <ref local="trigger"/>
         </list>
         </property>
 </bean>

</beans>


두가지 방식의 스케쥴러를 확인할수 있다.
두번째방식의 스케쥴러를 실행시킬때는 main 에서
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/Application/resources/quartz-sample.xml")
만 실행시켜주면 자동으로 cron이 돌게 된다.
.
:
Posted by .07274.
2010. 4. 7. 15:35

Spring Batch sample source [일부] I.lib()/I.lib(S.Batch)2010. 4. 7. 15:35

.. .. ..

Sample Name

분석 여부

필요 기간

기타

skip

O

-

 

retry

O

-

 

restart

O

-

 

automatic-mapping

O

-

 

asynch launch

X

2 day

 

validation

O

-

 

delegation

O

-

 

write behind

X

1/2 day

 

non-sequential

X

1/2 day

loof Flow와 동일.

asynch process

X

2 day

 

filtering

O

-

 

delimited input

O

-

 

fixed-length input

O

-

 

xml input

O

-

 

db paging input

X

1/2 day

 

db cursor input

X

1/2 day

 iBatis는 포함안됨

delimited output

O

-

 

fixed-length output

O

-

 

xml output

O

-

 

db output

O

-

 

multiple files

X

1/2 day

 

multi-line

X

1/2 day

 

multi-record

X

1 day

 



 

Multi-thread Step (asynch process)

<job id="basic_Sample" xmlns="http://www.springframework.org/schema/batch">

          <split id="split1" task-executor="taskExecutor" next="addr">

                      <flow>

                           <step id="wbras_bsid_1-1" next="dong_1-2"/>

                           <step id="dong_1-2"/>

                </flow>

                      <flow>

                           <step id="wbras_bsid_2-1" next="dong_2-2"/>                                                  <step id="dong_2-2"/>

                </flow>

     </split>

     <step  id=”addr”>

     </step>

</job>

 

위의 예제같이 흐름이 그려진다면  wbras_bsid_1-1 wbras_Bsid_2-1이 같이실행되며 스레드 구조로 다음 스텝들을 서로의 플로어(flow) 안에서 실행이 된다.
각각의 플로어가 종료되면 split1에서 설정한 next=”addr” 로 인해 step addr로 이동하며 실행하게 된다.
기타사항으로는 플로어중 exception이 있는 플로어는 실행도중 종료되며 다른 플로어는 계속 실행을 하게된다. 하지만 split안의 플로어중 exception이 일어났을경우는 다음 스텝으로 가지 못하고 fail이 된다. (skip , retry 설정으로 극복

 


 

Multi-record

n  Read된 값들의 종류에 따라 record되는 값이 달라진다.

if (item instanceof Trade) {

        return this.tradeLineAggregator.aggregate((Trade) item);

}

else if (item instanceof CustomerCredit) {

        return this.customerLineAggregator.aggregate((CustomerCredit) item);

}

else {

        throw new RuntimeException();

}                 

라인 어그리에이터의 소스 부분의 모습이다. 받아온 item의 타입에 따라 사용되는 어그리에이터가 달라지는 것이다
 




Multi-line

public Trade read() throws Exception {

Trade t = null;

           for (FieldSet line = null; (line = this.delegate.read()) != null;) {

                      String prefix = line.readString(0);

                     if (prefix.equals("BEGIN")) {

                                t = new Trade(); // Record must start with 'BEGIN'

                     }

                     else if (prefix.equals("INFO")) {

                                Assert.notNull(t, "No 'BEGIN' was found.");

                                t.setIsin(line.readString(1));

                                t.setCustomer(line.readString(2));

                     }

                     else if (prefix.equals("AMNT")) {

                                Assert.notNull(t, "No 'BEGIN' was found.");

                                t.setQuantity(line.readInt(1));

                                t.setPrice(line.readBigDecimal(2));

                     }

                     else if (prefix.equals("END")) {

                                return t; // Record must end with 'END'

                     }

           }

           Assert.isNull(t, "No 'END' was found.");

           return null;

}

ItemReader 부분이다. Read 해서 FieldSet으로 나눠서 나오는 첫번째 값에따라 반환값이 달라진다.

begin일땐 새로 생성하고 info 일땐 값을 입력하고 amnt일땐 다른 값을 입력한다. 이들은 다 리턴을 널값으로 보내준다. 오직 end 값일때만 만들어진 Trade를 리턴해준다. 

요약하면 여러라인 받아놓고 반환 라인 타이밍을 조절하는 것이 Multi-line이다.

 

Multi-file

<bean id="itemReaderForTest" parent="itemReaderParent">

     <property name="resources" value="classpath:data/ /input/delimited*.csv" />

</bean>


이런 식의 빈설정으로 resources는 여러 개의 리소스 값들을 받아온다. 이를 setresources할 때 값은

private Resource[] resources;
이런식으로 배열로 들어가게 된다. 이후 안에 있는값들은 JAVA로 만든 핸들러를 통해 사용된다.


 

Paging query

<bean id="addr_paging_query " class="Infrastructure.read.IbatisPagingItemReader">

<property name="sqlMapClient" ref="sqlMapClient"/>

           <property name="queryId" value="getselect_addr"/>

           <property name="pageSize" value="10000"/>

</bean>


ibatisPagingItemReader
라는 클레스는 원하는 pagesize만큼 read 해서 처리하는 구조이다. Ibatis fetchsize와 비슷한 개념이지만 bean 상태에서 configuration 할수 있다는 장점이 있다. 참고로 batch에서 제공하는 소스상에는 limit 0부터 시작하는데 이것은 Mysql의 구조이기 때문에 limit 1부터 시작하는 altibase와는 맞지 않다. 해서 소스의 변경이 필요하다.

 



 

      synch launch

     <bean id="jobLauncher"
        class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
       <property name="jobRepository" ref="jobRepository" />
       <property name="taskExecutor">
           <bean             
                 class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
       </property>
</bean> 


이와 같이 레퍼런스에 나와있다. http 의 요청으로 launch의 실행시간이 길어지면 다른 작업을 할수 없기때문에 taskExecutor를 사용한다고 나와있다.
ExitStatus 값은 종료되지 않고 thread 상태가 되기때문에 UNKNOWN 상태가 되며 작업은 백그라운드로 실행되게 된다.


 

 

'I.lib() > I.lib(S.Batch)' 카테고리의 다른 글

SqlMapClient 와 SqlMapClientTemplate  (0) 2010.04.19
Spring_Batch_v1.1.2  (2) 2010.03.16
Spring Batch Operator 사용법에 관한 글  (3) 2010.03.04
.
:
Posted by .07274.