기존 프로그래밍 언어에서는 프로그램에서 에러가 발생하면 에러를 적절히 처리하기가 상당히 어려웠다.
이는 언어 차원에서 에러를 처리할 수 있는 방법을 제공하지 않았기 때문이다.

에러는 여러 종류로 나눌 수 있다. 






여기서 문법적인 에러는 컴파일시 대부분 수정이 가능하다. 실행에러는 컴파일은 수행되었으나 실행시에 문제가 되는 경우로
논리적인 에러, 시스템에러, 예외 사항의 발생이다.
이중 논리적인 에러는 프로그래머가 코드를 잘못 작성해서 생기는 경우이며, 시스템적인 에러는 프로그래머의 의지와는
상관없이 발생하는 것이므로 프로그래머가 처리할 수 있는 방법은 없으며, 마지막으로 이제 다뤄볼 예외 사항이 발생하는 
경우이다.
예외사항은 정상적으로 프로그램이 동작중에 발생할 수 있는 여러가지 사항들이며 자바는 언어차원에서 이런 예외적인
사항의 처리를 지원하기 때문에 탄탄한 프로그램을 작성할 수 있다.


자바에서는 실행 시 발생할 수 있는 오류(Exception과 Error)를 클래스로 정의하였다. 
모든 클래스의 최상위 클래스는 Object클래스이므로 Exception과 Error클래스 역시 Object클래스의 하위클래스들이다. 

모든 예외의 최상위클래스는 Exception클래스이며, 상속계층도를 Exception클래스부터 도식화하면 다음과 같다. 





RuntimeException클래스들은 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들로서 자바의 프로그래밍 요소들과 관계가 깊다. 예를 들면, 배열의 범위를 벗어난다던가(IndexOutOfBoundsException), 값이 null인 참조변수의 멤버를 호출하려 했다던가(NullPointerException), 클래스간의 형변환을 잘못했다던가(ClassCastException), 정수를 0으로 나누려 했다던가(Arithmetic- Exception)하는 경우에 발생하는 예외들이다. 

RuntimeException클래스들 중의 하나인 ArithmeticException을 try-catch문으로 처리하는 경우도 있지만, 사실 try-catch문을 사용하기보다는 0으로 나누지 않도록 프로그램을 변경하는 것이 올바른 처리방법이다. 
이처럼 RuntimeException예외들이 발생할 가능성이 있는 코드들은 try-catch문을 사용하기 보다는 프로그래머들이 보다 주의 깊게 작성하여 예외가 발생하지 않도록 해야 할 것이다. 

그 외의 Exception클래스들은 주로 외부의 영향으로 발생할 수 있는 것들로서, 프로그램의 사용자들의 동작에 의해서 발생하는 경우가 많다. 예를 들면, 존재하지 않는 파일을 처리하려한다던지(FileNotFoundException), 실수로 클래스의 이름을 잘못 적었다던가(ClassNotFoundException), 입력한 데이터의 형식이 잘못되었다던가(DataFormatException) 하는 경우에 발생하는 예외들이다. 
이런 종류의 예외들은 반드시 처리를 해주어야 한다. 


RuntimeException클래스들 - 프로그래머의 실수로 발생하는 예외 
그 외의 클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 

RuntimeException클래스들 그룹에 속하는 예외가 발생할 가능성이 있는 코드에는 예외처리를 해주지 않아도 컴파일 시에 문제가 되지 않지만, 그 외의 Exception클래스들 그룹에 속하는 예외가 발생할 가능성이 있는 예외는 반드시 처리를 해주어야 하며, 그렇지 않으면 컴파일시에 에러가 발생한다. 


 
Posted by finewoo
,


[fedora core11 기준  센드메일 설치 및 pop3, smtpauth 설정]

설치할 패키지
- sendmail : sendmail-8.14.3-5.fc11.i586
- dovecot : dovecot-1.2.6-3.fc11.i586
- sasl :cyrus-sasl-2.1.22-22.fc11.i586


1. sendmail 설치 및 설정
- 먼저 sendmail 설치여부 확인 

#rpm -qa |grep sendmail


- 패키지 정보가 없으면 새로 설치한다.
- 설치할 패키지 : sendmail-8.14.3-5.fc11.i586 인경우

#yum install sendmail-8.14.3-5.fc11.i586


2. dovecot 설치 및 설정
- pop3 나 imap 을 사용하기 위해 dovecot 패키지를 설치한다.
- dovecot은 기본 imap에 비해 보안등이 향상

#yum install dovecot-1.2.6-3.fc11.i586


* /etc/dovecot.conf 설정 변경

20라인 protocal = pop3
42라인 listen = *, [::] 


# service dovecot start
Dovecot Imap (을)를 시작 중:                               [  OK  ]


- telnet 으로 110번 포트 pop3 접속 확인

# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Dovecot ready.



3. sendmail 설정

- /etc/mail/sendmail.mc 편집
- smtp인증기능 추가위해 아래 라인 주석제거

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

* smtp인증은 outlook 또는 eudora등과 같은 메일클라이언트 프로그램으로 메일서버를 통해 메일을 전송하고자 할때 /etc/mail/access 엑세스 허용파일에서 릴레이를 허용할 IP를 지정하는 방식보다 사용자 아이디와 암호 확인을 통해서 메일 전송을 허용함으로써 메일서버가 스펨경유지로 사용되는 것을 방지할 수 있다.


- 설정파일 변경 적용

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf


- /etc/mail/sendmail.cf 에서 아래와 같이 addr=127.0.0.1 부분을 제거

 (O DaemonPortOptions=Port=smtp, Name=MTA )


- /etc/mail/local-host-names : 메일을 수신할 호스트이름 추가

test.co.kr or mail.test.co.kr


4. SMTPAUTH 인증을 위한  SASL 라이브러리가 설치여부 확인 및 서비스 시작

cyrus-sasl-md5-2.1.22-22.fc11.i586
cyrus-sasl-plain-2.1.22-22.fc11.i586
cyrus-sasl-lib-2.1.22-22.fc11.i586
cyrus-sasl-2.1.22-22.fc11.i586
[root@test]# service saslauthd restart 


5. sendmail 데몬 시작

#service sendmail start


- telnet 25번 포트로 접속해서 아래와 같은 화면이 출력되는지 확인.

* SMTPAUTH 인증확인

[root@(none) ~]# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 (none) ESMTP Sendmail 8.14.3/8.14.3; Tue, 22 Dec 2009 00:44:24 +0900
ehlo localhost
250-(none) Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
250-DELIVERBY
250 HELP


ehlo localhost로 나타나는 메시지 중 위와 같이
250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
가 나타나면 정상적으로 인증기능이 구동중인 것이다.
이메일 클라이언트에서 보내는 메일서버 인증기능 체크후 아이디와 암호를 입력하면 메일서버를 통해 정상적으로 
이메일을 전송할 수 있다.





'Linux' 카테고리의 다른 글

[Linux] CentOS5.3 에 JAVA(JDK) 설치  (0) 2010.02.28
MySQL설치중 오류:error: No curses/termcap library found  (1) 2009.11.24
Posted by finewoo
,

request.getContextPath(); 
request.getRequestURI(); 
request.getHeader("REFERER"); 
request.getRealPath("/")


request.getContextPath()는 프로젝트의 Context path명을 반환한다.

요청 : http://localhost:8080/example/test.jsp 

리턴값 : /example




request.getRequestURI()는 웹전체 경로(프로젝트명+ 파일 경로)까지 반환한다.

요청 : http://localhost:8080/example/test.jsp

리턴값 : /example/test.jsp 




request.getHeader("REFERER")는 요청을 한 부모요청의 URL주소를 반환한다.

현재 페이지:  http://localhost:8080/example/test1.do

요청 페이지 :  http://localhost:8080/example/test.do

리턴값 : http://localhost:8080/example/test.do




request.getRealPath("/")는 서버 또는 로컬의 웹애플리케애션 서버의 docBase 설정값을 반환한다.

요청 : http://localhost:8080/example/test.jsp

리턴값 : D:\Project\webapps\example\





Posted by finewoo
,


기본적으로 자바는 디버깅을 위해 System.out.println()을 사용한다. 그리고 비교적 많이 사용되는 log4j를 이용해서 sql을 콘솔에 찍기도 한다.
log4sql는 단순히 쿼리를 화면에 출력해주는것 뿐만 아니라 sql이 실행된 시간과 실행된 메소드, sql이 실행되는데 소요된 시간, 실행된 sql을 자동으로 들여쓰기를 해서 보여준다.
쿼리가 실행되고 소요되는 시간은 실제 서비스 환경하에 시간과 거의 일치하므로 비효율적인 쿼리를 찾아내는데 도움이 된다.
설치하는 방법도 간단하며 서버성능에 영향을 주지도 않는다.

홈페이지
http://log4sql.sourceforge.net

다운로드
log4sql.jar

log4sql을 WAS lib에 추가하고 driver class name을 DB에 따라 아래와 같이 변경하는 것으로 사용할 준비는 끝난다.


oracle인 경우 

oracle.jdbc.drirver.OracleDriver     =>  core.log.jdbc.driver.OracleDriver



mysql인 경우

com.mysql.jdbc.Driver - or - org.gjt.mm.mysql.Driver
=>  core.log.jdbc.driver.MysqlDriver



참고로 log4sql은 쿼리가 실행된 메소드도 표시해 준다. 하지만 쿼리를 날리는 클래스를 별도로 두고 해당 클래스를 이용해서 쿼리를 날리게 되면 기대하는 결과를 얻을 수 없다.

다른 DB인 경우나 상세 설정 부문은 http://log4sql.sourceforge.net 에서 참고할 수 있다.




Posted by finewoo
,

iBatis로 데이터베이스 테이블의 int형 컬럼값을 가져올때
컬럼의 값이 NULL이거나 값이 없을 경우 예외가 발생하게 된다.
char형 컬럼은 상관이 없다.

이런 현상은 int가 객체가 아니기 때문에 매핑시 에러가 발생하게 된다고 한다.
이 오류를 해결하기 위해서 물론 쿼리에서 null일경우 0으로 치환할 수는 있다.
하지만, 개인적인 생각으로는 null과 0은 분명히 다른 값이므로 임의로 null을 쿼리에서 0으로 변환하는 것은 그닥 추천할 만한 방법은 아닌듯 싶다.

그래서, 테이블 생성할때 컬럼속성이 int형인 경우는 테이블 생성시 제약조건에서 디폴트 값을 0 또는 다른 값으로 미리 지정하는 방법이 나을 것 같다.




'Java > iBatis' 카테고리의 다른 글

[iBatis] NUMBER(INT) 타입 컬럼 처리 시 cast 오류 발생  (1) 2011.03.29
[iBatis] Dynamic SQL, iterate  (1) 2010.02.03
Posted by finewoo
,

아파치 톰켓 컴파일중 오류 메시지...



According to TLD or attribute directive in tag file, attribute items does not accept any expressions



이는 JSP파일의 JSTL 선언부와 설치한 라이브러리 jstl.jar와의 버전차이에 의한 에러 메시지다.

해결법은 문서내 선언부를 버전에 맞게 변경시켜주면 된다.

JSTL 1.0
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>


JSTL 1.1
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>



..
Posted by finewoo
,

탄생배경

1996년, SUN은 자바를 위한 소프트웨어 컴포넌트 모델을 정의한 자바빈즈(JavaBeans) 1.00-A 명세를 발표했다.
이는 재사용이 가능한 자바객체를 이용해 복잡한 어플리케이션을 쉽게 구성할 수 있게 하는 일련의 코딩정책을 정의한 것이다.
그리고 앤터프라이즈급 어플리케이션의 개발을 위해 1998년 자바빈즈(EJB: Enterprise JavaBeans) 명세 1.0을 발표했다.
하지만, EJB는 어플리케이션 개발을 쉽게 구성하겠다는 본래의 의도를 벗어나게 됐다.
엔터프라이즈급의 서비스 제공을 위해 코드 및 개발이 점점 복잡해지고 어려워졌다.

이러한 분위기속에서 애스팩트 지향 프로그래밍(AOP: aspect-oriented programming), 종속객체 주입(DI: dependency injection) 같은 새로운 프로그래밍 기법으로 이전 EJB로만 가능했던 부분이 평범한 자바 객체(POJO: plain-old Java objects)로도 구현이 가능하게 됐다.

스프링 프레임워크는 이러한 가벼운 POJO 기반 개발 진영의 선두에 있다고 볼 수 있다.



스프링이란?

스프링(Spring)은 로드 존슨(Rod Johnson)이 그의 책 『Expert One-on-One: J2EE Design and Development』을 통해 소개되었다.
스프링의 특징을 간단하게 요약하면

스프링은 가벼운 DI 및 AOP기반 컨테이너이자 프레임워크이다.


종속객체 주입(DI: dependency injection)
: 객체가 의존관계에 있는 다른 객체를 컨테이너에서 찾아오는 것이 아니라 인스턴스가 생성되면 컨테이너가 그 객체에 필요한 종속객체를 찾아주는 것이다. 따라서 낮은 결합도를 유지하게 해준다.


애스팩트 지향 프로그래밍(AOP: aspect-oriented programming)
: 애플리케이션 개발에 있어 비즈니스 로직과 트랜잭션관리, 로깅등 시스템 서비스 관련 작업을 분리해 응집도 높은 개발을 가능하게 한다. 


DI와 AOP를 근간으로 한 결합도가 낮은 애플리케이션이라 함은 개발시 테스트의 용이함 뿐만 아니라 관리시에도 상당한 편의성을 제공한다.




스프링 프레임워크는 코어 컨테이너 계층 위에 여러가지 계층으로 이루어져 있다. 이는 곧 애플리케이션 개발시 필요한 개별 모듈을 선택적으로 사용할 수 있다는 의미이다.

이 여러 계층 중 몇가지만 살펴보기로 한다.



The Core package is the most fundamental part of the framework and provides the IoC and Dependency Injection features.
The basic concept here is the BeanFactory, which provides a sophisticated implementation
of the factory pattern which removes the need for programmatic singletons and allows you to decouple the configuration and specification of dependencies from your actual program logic.

코어 컨테이너(core container)
- 코어 컨테이너는 IoC와 DI를 제공하는 스프링 프레임워크의 기본을 구성한다. 이 모듈에 있는 BeanFactory는 스프링을 컨테이너로서의 역할을 하게 한다.



The Context package build on the solid base provided by the Core package: it provides a way to access objects in a framework-style manner in a fashion somewhat reminiscent of a JNDI-registry.
The context package inherits its features from the beans package and adds support for internationalization (I18N) (using for example resource bundles), event-propagation, resource-loading, and the transparent creation of contexts by, for example, a servlet container.

컨텍스트 계층(웹 계층)
- Context package는 Core package위에 위치하며 BeanFactory 형태를 확장하여 국제화(I18N), 애플리케이션 생명주기 이벤트, 유효성 검증, 이메일, JNDI 액세스, 리모팅 등 여러 서비스를 제공한다.



The DAO package provides a JDBC-abstraction layer that removes the need to do tedious JDBC coding and parsing of database-vendor specific error codes. Also, the JDBC package provides a way to do programmatic as well as declarative transaction management, not only for classes implementing special interfaces, but for all your POJOs (plain old Java objects).

DAO 계층
- JDBC 추상화를 제공하는 DAO계층은 반복되는 데이터베이스 코드를 간단하고 깔끔하게 만들어 주며, AOP모듈을 이용해 트랜잭션 관리 서비스도 가능하며 데이터베이스 관련 각종 오류를 해결하는데 도움을 준다.



Spring's MVC package provides a Model-View-Controller (MVC) implementation for web-applications.
Spring's MVC framework is not just any old implementation; it provides a clean separation between domain model code and web forms, and allows you to use all the other features of the Spring Framework.

Spring's MVC 계층
- Spring's MVC 는 웹어플리케이션에 Model-View-Controller (MVC)를 적용할 수 있게 한며 애플리케이션의 결합도를 낮춰주는 역할을 한다.



스프링 프레임워크의 철학은 다른 프레임워크와 마찬가지로 개발자로 하여금 여타 불필요하거나 반복적인 작업으로 시간낭비하는 부분을 지양하게 한다. 그리고 스프링 자체의 가벼움은 기존API 및 JDBC, iBATIS, 하이버네이트, Struts, JSF등 기존 프레임워크와도 비교적 쉽게 통합하는 특징을 가진다.



Posted by finewoo
,

프로젝트의 버전관리 도구로 CVS 와 Subversion이 가장 많이 사용된다.
하지만 CVS의 단점을 개선한 Subversion이 점차 많이 사용되고 있다.


* subversion의 특징

- 파일명 변경이 히스토리에 남는다.(CVS는 기존 파일을 삭제한 것으로 간주해버린다)
- 원자적 커밋(모든 파일이 커밋되면 되는거고 아니면 모두 롤백)
- 커밋 단위별 버저닝.(CVS는 각 파일별로 버전을 메기지만 SVN은 커밋단위로 버전을 메기기 때문에, 직전 커밋상태로
  모든 파일을 되돌리는 것이 가능하다)


http://subversion.tigris.org/ (subversion 공식 홈페이지)

http://subclipse.tigris.org/ (subclipse 홈페이지)
http://tortoisesvn.sourceforge.net/


이클립스 플러그인 설치 방법

원문 : http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA

 
 
Eclipse 3.2/Callisto, 3.3/Europa, 3.4/Ganymede, 3.5/Galileo +
Subclipse 1.6.5 and 1.4.8 are now available for Eclipse 3.2+!

See the changelog for details. Existing Subclipse users should read the upgrade instructions for important information on changes you to need to make to your Eclipse preferences to see the new version in the update manager.

Subclipse 1.4.x includes and requires Subversion 1.5.x client features and working copy format.

Subclipse 1.6.x includes and requires Subversion 1.6.x client features and working copy format.


Links for 1.6.x Release:
Changelog: http://subclipse.tigris.org/subclipse_1.6.x/changes.html
Eclipse update site URL: http://subclipse.tigris.org/update_1.6.x
Zipped downloads: http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240


 
Install Subclipse in Eclipse 3.x

 

Step 1:

Begin the installation from the Eclipse Help menu item.

Step 2:

This screenshot show the screen as it initially comes up.

In this case you will need to change the radio button to indicate that this is a new install.

Step 3:

This screen will vary depending on the features you have installed already.

You want to click on the New Remote Site button.

If you are behind a proxy and the Eclipse install mechanism does not work, then you can download a zipped version of the update site and then click the New Local Site button instead.

Step 4:

This screen is showing the New Remote Site dialog, filled in with the correct information to install Subclipse

    Name: Subclipse 1.6.x (Eclipse 3.2+)
    URL:  http://subclipse.tigris.org/update_1.6.x
    Name: Subclipse 1.4.x (Eclipse 3.2+)
    URL:  http://subclipse.tigris.org/update_1.4.x
    Name: Subclipse 1.2.x (Eclipse 3.2+)
    URL:  http://subclipse.tigris.org/update_1.2.x
    Name: Subclipse 1.0.x (Eclipse 3.0/3.1)
    URL:  http://subclipse.tigris.org/update_1.0.x

Step 5:
When you first come back to this screen, the site you added will NOT be selected.
Be sure to select it before clicking Next.
Step 6: This next screen shows all of the features that are available to install.
Step 7: Click the button to accept the license agreement.
Step 8: Confirm the install location
Step 9:
There is an Eclipse preference to turn off this next dialog.
I have never seen a signed feature. Not even Eclipse.org nor IBM sign their features.
Step 10: Just a screenshot of the in-process installation.
Step 11: Eclipse needs to be restarted after installing Subclipse.
Step 12:
Finally, after restarting Eclipse,
the first thing you will typically want to do is open the Subclipse Repository perspective
where you can define your repositories.
Be sure to also check the online help
as well as the Subclipse preferences located under Team -> SVN.




..

Posted by finewoo
,
화소란 무엇인가?
사진이미지는 모니터 화면처럼 네모난 작은 점들의 집합이며 화소는 각각의 작은 점(pixel)을 의미합니다.
화소수는 사진을 구성하는 각각의 작은 점(pixel)의 총 개수입니다.

예를들어 500만화소인 카메라로 찍은 사진의 크기가 2592 × 1944 라면
가로 2592줄, 세로로 1944줄 즉, 직사각형 안에는 총 5038848개의 점이 있는 것입니다.
즉, 화소수는 얻을수 있는 사진이미지의 크기를 의미하는 것이며 디카의 화소수는 ccd에 의해 결정됩니다.


그럼 CCD에 대해 알아볼까요?
CCD는 필름카메라의 필름의 역할에 해당하는 장치로 렌즈를 통해 들어온 빛을 디지털 신호로 변환하는 역할을 합니다.
CCD는 고가이며 크기에 따라 가격차이가 비교적 많이 나는 장치입니다.

 



일반 보급형 디카들은 1/3.2인치에서 1/2인치정도의 크기를 가지며
하이엔드 디카는 1/1.8 ~ 2/3인치 정도입니다.
DSLR로 넘어가서 올림푸스 포서드는 필름보다 약 2배 작은 크기입니다.
캐논은 1.6X 정도이며 필름보다 약 1.6배 작은크기이고
니콘은 1.5X 정도이며 필름보다 약 1.5배 작습니다.
좀 비싸긴 하지만 1:1 즉, 필름사이즈와 동일한 크기의 ccd를 가진 디카도 있습니다.


그렇다면 화소수가 동일한 DSLR 카메라와 보급형 디카(일명 똑딱이)와의 차이는 무엇일까요?
위에서 보셨듯 ccd의 크기입니다.
일반적으로 ccd가 크다는 것은 받는 빛의 양이 더 많아 사진의 노이즈가 적게 발생합니다.
사진을 확대했을 경우에도 더 선명한 화질을 유지할수 있기도 합니다.
그래서 같은 화소수라도 DSLR이 좀더 선명하고 쨍한 사진을 얻을수 있는것입니다.


일반적으로 디지털 카메라 구매를 고려하실때 화소수로 카메라의 성능을 판단하시는 경우가 많습니다.
홈쇼핑등 마케팅에서 화소수를 가장 강조하는 경우가 대부분이기 때문입니다.
화소수가 높으면 이미지를 확대해서 보거나 고해상도의 이미지 출력이 가능하다는 장점이 있다는 의미가 큰것이지
실제 컴퓨터 모니터상이나 보통사이즈의 인화를 하는등
일반적인 용도로는 600만화소 정도면 충분하며 가격대비 다른 편의 기능을 고려해보는것이 더 나은선택일 수도 있습니다.
예를들어 흔드림 보정기능 유무나 광학줌 배율, 최소 초점거리, 수동기능 제공여부 등을 살펴보는것도 좋습니다.

요약하면 화소수는 디카성능에 절대적인 것은 아니며 단지 장점중의 하나일 뿐이라는 것입니다.

'일상다반사' 카테고리의 다른 글

[PEN] 첫 만남...  (0) 2010.02.23
[IXUS 870IS] 뭉크의 공간, 스케치...  (0) 2010.02.06
커피 이야기  (0) 2009.12.02
가을 삼청동길.. 그리고 인사동  (0) 2009.11.01
Posted by finewoo
,


출처 : http://okjsp.pe.kr/seq/9780



오라클 랜덤하게 row 가져오는 방법은?


특정 테이블에서 조건을 준 결과 값에서 특정 갯수로 램덤하게 로우를 가져오는 방법이 없을까요?
(예 :  "1002405 건에서 10건만 랜덤하게 가져오기" )

제가 해본 것들
(1) 오라클 sample() 함수 이용
   --> 문제점 : 위의 예와 같은 경우 리턴 갯수를 정확하게 맞출 수가 없습니다.


(2) dbms_random.value 을 이용하는 방법
   --> 문제점 : 속도가 느림


(3) 조건절에 IN 을 주고 (3,6,7) 는 자바에서 랜덤하게 숫자 만들어 스트링으로 바꿔서 쿼리를 만드는 방법
   SELECT rownum, id, name
   FROM A
   WHERE rownum IN (3,6,7)
   --> 문제점 : 수행속도가 (2)번 방법보다는 빠르나 sample()함수를 쓰는 것 보다는 속도가 현저히 느림


 

(1) 방법은 속도는 빠르나 리턴갯수를 정확하게 맞춰서 가져올 수 없는 문제가 생기고 (2) (3) 방법은 예시("1002405 건에서 10건만 랜덤하게 가져오기")와 같은 경우에서도 리턴갯수를 정확하게 맞춰서 가져올 수는 있으나 100만건 정도에서 값을 가져오게 되면 속도가 현저히 덜어집니다.

  "1002405 건에서 10건만 랜덤하게 가져오기"와 같이 100만건 이상의 테이블에서 일정갯수만 랜덤하게 그리고 빠르게 가져올 수 있는 방법이 없을까요??   

 

SELECT * FROM
(
    SELECT ROWNUM RN,A.* FROM TABLE_A A
)
WHERE RN IN (
    SELECT TRUNC((DBMS_RANDOM.VALUE)*1002405+1 ,0) RANDOM FROM DUAL
    CONNECT BY LEVEL < 10
)





'DATABASE' 카테고리의 다른 글

[MySQL] admin 잊어버렸을때..  (4) 2011.05.01
Posted by finewoo
,