MS에서 제공하는 JDBC Type 4 드라이버인 sqljdbc4.jar를 통해서 DB에 연결하기 위한 내용입니다.
아래는 mssql 2008의 db에 접근하기 위한 connection url string 입니다..
MS의 jdbc사용에 대한 내용은 http://msdn.microsoft.com/en-us/library/ms378526.aspx 에서 참고하시면 됩니다. 그리고, 아래의 4147포트는 SqlServer Configuration Manager를 통해서 TCP/IP 프로토콜에 할당된
포드입니다.
아융..
DB 연결하기 위해서 Connection Url 세팅하는게 은근히 짜증나네요.. ^^;;
아래는 mssql 2008의 db에 접근하기 위한 connection url string 입니다..
그리고, 아래의 4147포트는 SqlServer Configuration Manager를 통해서 TCP/IP 프로토콜에 할당된 포드입니다.
This driver converts JDBC calls to ODBC calls through JDBC-ODBC Bridge driver which in turn converts to database calls. Client requires ODBC libraries.
2
Two
Native API - Partly -
Java driver
This driver converts JDBC calls to database specific native calls. Client requires database specific libraries.
3
Three
JDBC - Net -All Java
driver
This driver passes calls to proxy server through network protocol which in turn converts to database calls and passes through database specific protocol. Client doesn't require any driver.
4
Two
Native protocol - All -
Java driver
This driver directly calls database. Client doesn't require any driver.
위의 내용을 통해서, 프로젝트의 의존성 있는 바이너리들을 쉽게 관리(?) 할 수 있을듯 합니다.
개발팀에서 적용하기에는 좀 귀찮은 작업일듯 하나, 개발팀의 모임인 개발실 급의 규모에서는 적용할 만한 기술인거 같네요..
참고로, Ivy 프로젝트의 설치는 아래와 같습니다.
1. 다운로드
2. ivy-2.1.0.jar를 ${ant.home}/lib에 카피를 합니다.
3. eclipse에서 window --> preference --> ant --> runtime --> classpath의 ant home entries에서 add external jars 버튼을 통해서 ivy-2.1.0.jar를 잡아주면 됩니다.
외부 API들이 JDK에 많이 포함이 되어 있습니다. http://java.sun.com/javase/6/docs/api/ 문서의 package들을 보시면, javax나 org로 시작하는 외부(?) API들을 보실 수가 있는데요.. JDK에서는 rt.jar에 포함되어 잇지만, 아래의 내용처럼, http://aploit.egloos.com/4806304 님의 블로그에 포스팅된 내용을 보시면, 최신의 외부 API를 사용하기 위해서 java.endorsed.dirs 옵션을 사용해서 해결하는 내용을 보실 수가 있습니다.
java로 작업을 하다보면 가끔씩 endorsed라는 디렉토리 명이 보였다. 사전을 찾아보면 배서하다, 추천하다, 양도하다 정도의
뜻이고, 사전적 의미가 아닌 java쪽에서는 어떤 의미로 사용되는지 몰랐다.
그냥 몰라도 별 문제는 없었고 해서
그냥 넘어갔었다.
그런데 의미를 확실히 알게 되었다.
jdk1.4에는 JAXP1.2의 라이브러리들이
포함되어 있다. 대표적으로 org.w3c.dom의 패키지와 javax.xml의 패키지가 그것이다.
그런데
JAXP1.3, 1.4가 나왔고, jdk1.4의 환경에서 이들을 사용하고자 할 경우에 문제가 된다.
(참고로 JAXP1.3은
JDK5.0에 JAXP1.4는 JDK6.0에 포함되었다. 따라서 JDK5.0에서는 JAXP1.3 라이브러리를 따로 설치할 필요가
없다.) jdk는 1.4이고 어플리케이션에서 JAXP1.3을 설치했다고 하면(구체적인 jar 파일은 jaxp-api.jar와
jaxp-ri.jar이다) 같은 패키지 이름까지 같은 클래스가 2개 존재하게된다. 예를 들면
org.w3c.dom.Document이다. 하나는 rt.jar에 있는 것이고(버전은 JAXP1.2) 하나는
jaxp-api.jar에 있는 것이다(요 버전은 JAXP1.3). 원했던 것은 rt.jar의 것이 아닌 jaxp-api.jar의
것이 로딩되는것이였는데, 그렇게 동작하지 않는다. 설치한 라이브러리들 간의 로딩 순서는 classpath에 설정한 순서로 조절할 수
있지만, rt.jar는 설정 순서로 조절할 수 없다.
JDK 자체에 포함된 것이 아닌 설치한 라이브러리의 것을
로딩할때 사용하는 매커니즘이 바로 endorsed이다. "java.endorsed.dirs"라는 시스템 파라매터를 설정하면 된다.
다음과 같이 java를 실행할 때 jaxp-api.jar가 있는 디렉토리를 설정해 주면 된다.
java
-Djava.endorsed.dirs=/path/where/jar/is ......
여기서 /path/where/jar/is
디렉토리는 jaxp-api.jar가 있는 곳이다.
TOMCAT의 경우 endorsed 매카니즘을 사용하고 있다.
tomcat 4.1.39의 bin/setclasspath.bat에서 set
JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed 으로 endorsed 디렉토리를 설정하고
catalina.bat에서 다음과 같이 java 실행 시에 시스템 파라매터로 설정해 주고 있다.
%_EXECJAVA% ...
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"
TOMCAT_HOME/common
/endorsed에 가보면 xercesImpl.jar, xml-apis.jar가 있는데 이들은 JAXP 1.3의 것이다.
참
고로 클래스로딩의 매카니즘에서 "java." 로 시작하는 패키지의 클래스는 endorsed가 적용되지 않는다.
JAXP
에 대한 기타. JAXP1.4가 설치되어 있다면 apache xalan의 다음과 같은 라이브러리들을 따로
설치할 필요 없다. JAXP안에 포함되어 있기 때문이다. 설치할 필요가 없는 것 보다는 쫑나는 상황을 피하기 위하여 설치해서는
안된다.
serializer.jar
xalan.jar
xercesImpl.jar
xml-apis.jar
xsltc.jar
Cassandra.Client는 http://incubator.apache.org/thrift/ 를 이용해서 Cassandra에 데이타를 insert하고 select하는 inner 클래스 입니다. Cassandra.Client를 생성하고 사용하기 위해서 제가 사용하는 CassandraClientFactory 클래스는 아래와 같습니다.
Consistency : all nodes see the same data at the same time Availability : node failures do not prevent survivors from continuing to operate Partition Tolerance : the system continues to operate despite arbitrary message loss
Partition tolerance refers to the ability for a system to continue to
operate in the presence of a network partitions. For example, if I have
a database running on 80 nodes across 2 racks and the interconnect
between the racks is lost, my database is now partitioned. If the
system is tolerant of it, then the database will still be able to
perform read and write operations while partitioned. If not, often
times the cluster is completely unusable or is read-only.
모, 대충 이해하기로 네트웍의 문제로 인해서 정말로 서비스하는 노드가 분리(partition)되어서 잘 동작(tolerance)을 해야 된다는 얘기인듯..
그리고, 분산 시스템은 위의 CAP Theorem의 3가지 특성을 만족시킬 수 없기 때문에, 한가지 특성은 포기를 해야 한다고 하는 Brewer's CAP Theorem도 있네요..
위 내용은 분산시스템에 대한 기본적인 이론이라서, 꼭 알아둘 필요가 있을거 같습니다.
추후 NOSQL 관련 시스템 공부를 위해서.. ^^
유명한 Doug Lea 교수님의 멀티 쓰레드 프로그램의 평가기준에 대한 내용입니다. "Java 언어로 배우는 디자인 패턴
입문 멀티 쓰레드편, Yuki Hiroshi" 의 Introduction 2 챕터에 나오는 내용입니다. 아래 내용의 출처는 http://ethdemor.springnote.com/pages/4349969 입니다.
아래의 기준들은 Doug Lea 분류를 기준으로 한 것이며, 이런 류의 평가 기준은 대개 상반(trade-off)되는 경우가 있습니다.
필 수
안전성 (safety) - 객체를 망가트리지 않을 것
- "망가 진다"는 것은 비유적 표현으로 객체의 필드가 예상 외의 값을 취하는 것을 의미합니다.
- 복수의 스레드가 이용해도 안전성이 유지되는 클래스를 스레드 세이프(thread-safe)한 클래스라고 하며 자바 API에는 명시되어 있습니다.
생존성 (liveness) - 필요한 처리가 이뤄질 것
옵 션
재사용성 (resuability) - 클래스를 다시 사용할 수 있는 것
- 멀티 스레드 프로그램에서는 스레드 배타제어, 구조, 방침을 캡슐화 하는 것이 관건이며 Java SE 5.0의 java.util.concurrent 패키지에서 이를 잘 실현하고 있습니다.
- 수행 능력(performance) - 고속 / 대량으로 처리할 수 있을 것
- throughput - 단위 시간 당 처리 수
- 응답성 (responsiveness) - 요청을 한 뒤 반응이 나타날 때까지 걸리는 시간
- GUI 프로그램에서는 요청의 완료까지 걸리는 시간보다 처리 시작까지의 시간을 중요하게 생각하기도 합니다. 여기서 완료는 요청 -> 처리 -> 응답 까지의 시간이며 처 리 시작은 완료까지의 시간은 좀 더 걸리더라도 클라이언트에게 먼저 응답(~을 처리 중입니다 등)을 보내는 것을 말합니다.
- 응답성이 높은 프로그램은 대기 시간(latency)이 짧다고 표현합니다.
- 용량 (capacity) - 동시에 처리할 수 있는 수
- 그 밖에 효율(efficiency), 확장성(scalability), 저하(degradation) 등이 있습니다.
평가기준 정리
멀티 스레드 시스템에서 안전성과 생존성이 지켜지지 않으면 제대로된 프로그램이라고 할 수 없습니다.
따라서 이 필수 조건을 만족한 상태에서 재사용성과 수행 능력을 어떻게 높이느냐가 관건이 되겠습니다.