mutable vs immutable

JAVA 2015. 11. 27. 00:33

StringBuffer, StringBuilder vs String

스트링버퍼와 스트링빌더와 스트링 객체와의 가장 큰 차이는 

mutable 인지, immutable인지입니다. 


다음과 같은 코드의 결과값은 어떻게 될까요?

public class Test{
    
    public static void changeMutable(StringBuilder target){
        target.append('d');
    }
    
    public static void changeImmutable(String target){
        target += "d";
    }
    
    public static void main(String[] args) {
        StringBuilder test1 = new StringBuilder("abc");
        String test2 = "abc";
        
        System.out.println(test1);
        System.out.println(test2);
        
        changeMutable(test1);
        changeImmutable(test2);
        
        System.out.println(test1);
        System.out.println(test2);
    }
}
cs

<출력화면>

abc

abc

abcd

abc


와 같이 출력됩니다. 

우선 String클래스는 append와 같이 객체를 변화시킬 메서드를 제공하지 않습니다. 

반면에 StringBuildler와 StringBuffer는 append와 같은 set메서드를 제공합니다. 



그렇다면 immutable, 즉 변할 수 없는 불변의 객체를 제공하는 이유는 무엇이며 어떻한 경우에 필요한 걸까요?

멀티 스레드 환경에서 객체가 변화되는 상황에서는 immutable한 데이터를 통해 정보가 보여져야 합니다. 

그렇지 않은 경우 의도치 않은 데이터가 발생하게 됩니다. 

자바의 문제였던 시간 API가 자바 8에서 개선된 점에도 Date객체를 immutable한 속성으로 fix시켜 놓은 것과 

마찬가지 이유입니다. 




'JAVA' 카테고리의 다른 글

자바 스레드 프로그래밍  (0) 2015.11.23
자바 예외 처리  (0) 2015.11.21
GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
Posted by slender ankles
,

참조 : http://blog.eairship.kr/126(금지된 엑시노아의 비공정 블로그)

스레드란 무엇인가?

"프로그램의 실행 흐름, 프로그램을 구성하고 있는 실행 단위"라 말할 수 있다. 보통 메인 문에서 순차적으로 실행되는 루틴을 많이 다뤄왔는데 이 것은 싱글 스레드이다. 만약에 하나의 프로그램에서 여러 개의 작업을 동시에 수행하고 싶을 경우에는 멀티 쓰레드(Multi Thread)를 사용하면 된다.


스레드를 어떻게 사용하는지?, 어떻게 동작하는지?

(1) Thread 클래스 상속하는 방법

public class ThreadTest {
    
    public static class MultiThread extends Thread{
        private String name;
        
        public MultiThread(String name){
            System.out.println(getName() + "스레드가 생성되었습니다.");
            this.name = name;
        }
 
        @Override
        public void run() {
            for(int i = 0;i<10;i++){
                System.out.println(getName() + "(" + this.name + ")");
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void main(String[] args) {
        MultiThread mt1 = new MultiThread("Thread1");
        MultiThread mt2 = new MultiThread("Thread2");
        MultiThread mt3 = new MultiThread("Thread3");
        
        mt1.start();
        mt2.start();
        mt3.start();
    }
}
cs
위의 코드는 Thread 클래스를 extends(상속)한 클래스에서 run()메소드를 정의하고 실행하는 코드입니다.

보통의 싱글 스레드에서 mt1.start(); 코드가 끝나고 mt2.start()코드가 실행되고, 그 다음 mt3.start()가 실행되지만 멀티 스레드에서는 위의 코드들이 동시에 수행됩니다. 그래서 아래의 결과 값처럼 순서에 상관없이 동시에 수행되는 것입니다.

Thread-0스레드가 생성되었습니다.
Thread-1스레드가 생성되었습니다.
Thread-2스레드가 생성되었습니다.
Thread-1(Thread2)
Thread-2(Thread3)
Thread-0(Thread1)
Thread-0(Thread1)
Thread-2(Thread3)
Thread-1(Thread2)
Thread-2(Thread3)
Thread-1(Thread2)
Thread-0(Thread1)
Thread-0(Thread1)
Thread-1(Thread2)
Thread-2(Thread3)
Thread-1(Thread2)
Thread-2(Thread3)
Thread-0(Thread1)
Thread-1(Thread2)
Thread-2(Thread3)
Thread-0(Thread1)
Thread-1(Thread2)
Thread-0(Thread1)
Thread-2(Thread3)
Thread-2(Thread3)
Thread-0(Thread1)
Thread-1(Thread2)
Thread-2(Thread3)
Thread-1(Thread2)
Thread-0(Thread1)
Thread-0(Thread1)
Thread-2(Thread3)
Thread-1(Thread2)
cs


Thread State

스레드의 상태는 다음의 형태로 변화됩니다.

Thread.State 값 

  설명 

NEW

 시작되지 않은 상태

RUNNABLE

 실행 가능 상태

WAITING 

 대기 상태

TIMED_WAITING

 스레드가 특정 시간동안 대기 상태

BLOCKED 

 스레드가 잠겨 있어 풀리기를 기다리는 상태

TERMINATED 

 스레드가 종료된 상태


(2) Runnable Interface를 이용하는 방법

public class ThreadTest {
    
    public static class MultiThread implements Runnable{
        private String name;
        
        public MultiThread(String name){
            System.out.println(name + "스레드가 생성되었습니다.");
            this.name = name;
        }
 
        @Override
        public void run() {
            for(int i = 0;i<10;i++){
                System.out.println(Thread.currentThread().getName() + "(" + this.name + ")");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void main(String[] args) {
        MultiThread mt1 = new MultiThread("Thread1");
        MultiThread mt2 = new MultiThread("Thread2");
        MultiThread mt3 = new MultiThread("Thread3");
        Thread tr1 = new Thread(mt1);
        Thread tr2 = new Thread(mt2);
        Thread tr3 = new Thread(mt3);
        
        tr1.start();
        tr2.start();
        tr3.start();
    }
}
cs

결과값은 동일!!
Runnable Interface를 사용하여 스레드를 구현하는 이유는 무엇일까? 
Java라는 언어의 특성 상 다중 상속이 되지 않는다. 하지만 인터페이스는 다중 상속이 된다. Thread클래스를 상속 받으면 다른 클래스를 상속받지 못하게 된다.
그래서 실제로 쓰레드를 사용할 때는 Runnable Interface를 주로 사용한다.


Thread의 우선순위

public class ThreadTest {
    
    public static class MultiThread implements Runnable{
        private String name;
        
        public MultiThread(String name){
            System.out.println(name + "스레드가 생성되었습니다.");
            this.name = name;
        }
 
        @Override
        public void run() {
            for(int i = 0;i<10;i++){
                System.out.println(Thread.currentThread().getName() + "(우선순위 : " + Thread.currentThread().getPriority() + ")");
            }
        }
    }
    
    public static void main(String[] args) {
        MultiThread mt1 = new MultiThread("Thread1");
        MultiThread mt2 = new MultiThread("Thread2");
        MultiThread mt3 = new MultiThread("Thread3");
        Thread tr1 = new Thread(mt1);
        Thread tr2 = new Thread(mt2);
        Thread tr3 = new Thread(mt3);
        
        tr1.setPriority(Thread.MIN_PRIORITY);
        tr2.setPriority(Thread.NORM_PRIORITY);
        tr3.setPriority(Thread.MAX_PRIORITY);
        
        tr1.start();
        tr2.start();
        tr3.start();
    }
}
cs

쓰레드는 우선 순위에 따라 실행을 우선시 합니다. 물론 출력해보면 꼭 예상되로 되지는 않더라구요.

즉, 우선 순위가 높은 스레드는 우선 순위가 자기보다 낮은 스레드보다 더 많이 실행되는 것입니다.

만약 동일한 우선순위의 스레드가 둘 이상 존재할 경우 CPU의 할당시간을 분배후 실행합니다. 가장 높은 우선 순위는 10, 

기본 우선 순위는 5, 가장 낮은 우선 순위는 1로 , 보통 스레드의 우선 순위는 5입니다. 스레드의 우선 순위를 변경하고 싶다면

setPriority()메소드를 사용하면 됩니다. 위의 코드가 그 예제입니다. 


Thread의 동기화

public class ThreadTest {
    
    public static class clsNumber{
        int num = 0;
        public void addNum(){
            num++;
        }
        public int getNum(){
            return num;
        }
    }
    
    public static class MultiThread implements Runnable{
        clsNumber number;
        
        public MultiThread(clsNumber cn){
            number = cn;
        }
 
        @Override
        public void run() {
            for(int i = 0;i<10000;i++){
                number.addNum();
            }
        }
    }
    
    public static void main(String[] args) {
        
        clsNumber number = new clsNumber();
        
        MultiThread mt1 = new MultiThread(number);
        MultiThread mt2 = new MultiThread(number);
        MultiThread mt3 = new MultiThread(number);
        Thread tr1 = new Thread(mt1);
        Thread tr2 = new Thread(mt2);
        Thread tr3 = new Thread(mt3);
        
        tr1.start();
        tr2.start();
        tr3.start();
        
        try {
            // join()메소드는 스레드가 끝날 때까지 기다린다.
            tr1.join();
            tr2.join();
            tr3.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println(number.getNum());
    }
}
cs

결과는??

15380


결과는 30000이 나와야 되는데 15380이 나옵니다. 물론 매번 값도 다르고요. 이유는 무엇일까요?

동기화가 되지 않기 때문에 수행 도중 실행 권한이 다른 스레드로 넘어가서 제대로 된 결과값을 도출해 낼 수 없게 되는 것입니다. 동기화를 해주어야 합니다. 자바에서는 synchronized키워드를 통해 동기화를 가능하게 해줍니다.


동기화를 해준 코드

다음과 같이 synchronized 키워드를 addNum()메소드에 붙여주면 동기화를 지원해주게 됩니다.

public class ThreadTest {
    
    public static class clsNumber{
        int num = 0;
        public synchronized void addNum(){
            num++;
        }
        public int getNum(){
            return num;
        }
    }
    
    public static class MultiThread implements Runnable{
        clsNumber number;
        
        public MultiThread(clsNumber cn){
            number = cn;
        }
 
        @Override
        public void run() {
            for(int i = 0;i<10000;i++){
                number.addNum();
            }
        }
    }
    
    public static void main(String[] args) {
        
        clsNumber number = new clsNumber();
        
        MultiThread mt1 = new MultiThread(number);
        MultiThread mt2 = new MultiThread(number);
        MultiThread mt3 = new MultiThread(number);
        Thread tr1 = new Thread(mt1);
        Thread tr2 = new Thread(mt2);
        Thread tr3 = new Thread(mt3);
        
        tr1.start();
        tr2.start();
        tr3.start();
        
        try {
            // join()메소드는 스레드가 끝날 때까지 기다린다.
            tr1.join();
            tr2.join();
            tr3.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println(number.getNum());
    }
}
cs
결과는??
30000




'JAVA' 카테고리의 다른 글

mutable vs immutable  (0) 2015.11.27
자바 예외 처리  (0) 2015.11.21
GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
Posted by slender ankles
,

자바 예외 처리

JAVA 2015. 11. 21. 19:40


자바 예외 처리하기



예외 처리가 필요한 이유?

예를 들어 4/0이라는 연산을 컴파일러에서 수행했을 때 ArithmeticException이 발생한다. 

예외 처리를 해주지 않았을 때는 에러가 발생하고 프로그램이 그대로 종료된다. 

우리는 예기치 못하게 예외가 발생하더라도(예를들어, JDBC를 사용한 코드는 정확하더라도, 실제 데이터베이스에 데이터가 없어서 에러를 만들어 낼 수도 있다.) 프로그램이 죽지 않고 이를 처리하게 하기 위해서 예외 처리가 필요한 것이다.

<예외처리가 필요한 이유>

// int c = 4 / 0;        => 예외처리 하지 않아 프로그램 죽음 
int c = 4;
try {
   c = c / 0;
catch (Exception e) {
   System.out.println(e);    // => 예외처리  catch문이 실행되고 프로그램은 죽지 않는다.
}
cs

예외를 고의로 발생시키는 방법?
예외를 고의로 발생시키는 것이 왜 필요한 것일까? 필요할 때가 있다. 
다소 억지스러운 상황이지만 다음과 같은 경우의 로직이 만들어 질 수 있다.

    public static class compareException extends RuntimeException{
    }
    public static void compareTest(String s1, String s2){
        try {
            if(!s1.equals(s2)){
                throw new compareException();
            }
            System.out.println(s1 + " - " + s2 + "는 같습니다.");
        } catch (Exception e) {
            System.out.println(s1 + " - " + s2 + "는 같지 않습니다.");
        }
    }
    
    public static void main(String[] args) {
        String a = "hello";
        String b = "hell";
        compareTest(a, b);
    }
cs
위의 예는 조금 더 쉬운 예로 교체해야 될 것 같다.

try - catch문에서 정상적으로 실행되기 위해 필요한 로직이 try블록 안에 위치할 것이다.

하지만, 예외가 발생한다면? try문 안의 다음 문장은 수행되지 않아야하며, catch문으로 넘어가줘야 합니다.

이럴 때를 위하여 Throw를 통해 고의적으로 예외를 발생시키는 것이 필요합니다. 





'JAVA' 카테고리의 다른 글

mutable vs immutable  (0) 2015.11.27
자바 스레드 프로그래밍  (0) 2015.11.23
GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
Posted by slender ankles
,

JVM은 가비지 컬렉션(GC)을 어떻게 처리하나?

(1) (heap) 내의 객체 중에서 가비지(garbage)를 찾아낸다.

(2) 찾아낸 가비지를 처리해서 힙의 메모리를 회수한다.

JVM은 무엇을 기준으로 가비지를 선별하나?

reachability에 의해 결정된다.

유효한 참조가 있으면 reachability, 유효한 참조가 없으면 unreachability라고 하는데,

힙의 객체가 참조 되는 경우의 수는

(1) 스택영역에서 참조되는 경우

(2) 메소드영역에서 참조되는 경우

(3) 네이티브 스택(JNI)에서 참조되는 경우

(4) 힙내에서 참조되는 경우

 이렇게 4가지가 있는데, (1) ~ (3)까지를 root set 이라 하여 reachability, 즉 유효한 참조가 있다고 하고,

힙 내에서 있는 경우에는 unreachability라고 하여 유효하지 않은 참조로서 가비지 컬렉션의 대상이 된다.

원래의 jvm은 사용자 코드와 무관하게 gc가 일어나게끔 하였지만, 자바 버전이 높아지면서 일부 사용자의 코드가 gc에 반영될 수 있게 했다. soft, weak, phantom reference를 클래스 형태로 제공하면서 gc에 일부 참여할 수 있게 했다.

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

자바 스레드 프로그래밍  (0) 2015.11.23
자바 예외 처리  (0) 2015.11.21
LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
Posted by slender ankles
,

Map인터페이스를 구현한 하위 클래스들 HashMap과 LinkedHashMap과 TreeMap은 분명한 몇 가지 차이가 있다.

Map 인터페이스를 구현하였으므로, Key - Value Store형태로 저장하여, 사용할 수 있다는 공통점이 있다.

다음과 같은 차이점이 있다.


<입력되는 순서로 저장 보장>

HashMap

들어 간 순서로 저장되지 않으며, 출력되는 순서가 일치하는 것을 보장하지 않는다.

HashTable

들어 간 순서로 저장되지 않으며, 출력되는 순서가 일치하는 것을 보장하지 않는다.

LinkedHashMap

들어 간 순서대로 저장되어 출력되는 순서가 일치하는 것을 보장한다.

TreeMap

들어 간 순서대로 저장되지 않으며, 정렬된 순서로 저장되어 출력된다.

    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
        Hashtable<Integer, String> hashTable = new Hashtable<Integer, String>();
        TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
        LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();
        
        // HashMap, TreeMap, LinkedHashMap에 각각 2 -> 3 -> 1 순서대로 입력함
        hashMap.put(2String.valueOf(2));
        hashTable.put(2String.valueOf(2));
        treeMap.put(2String.valueOf(2));
        linkedHashMap.put(2String.valueOf(2));
        
        hashMap.put(3String.valueOf(3));
        hashTable.put(3String.valueOf(3));
        treeMap.put(3String.valueOf(3));
        linkedHashMap.put(3String.valueOf(3));
        
        hashMap.put(1String.valueOf(1));
        hashTable.put(1String.valueOf(1));
        treeMap.put(1String.valueOf(1));
        linkedHashMap.put(1String.valueOf(1));
        
        // 출력
        System.out.println("--HashMap--");
        for(Entry<Integer, String> entry : hashMap.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
        
        System.out.println("--HashTable--");
        for(Entry<Integer, String> entry : hashTable.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
        
        System.out.println("--TreeMap--");
        for(Entry<Integer, String> entry : treeMap.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
        
        System.out.println("--LinkedHashMap--");
        for(Entry<Integer, String> entry : linkedHashMap.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
    }
cs


--HashMap--
1
2
3
--HashTable--
3
2
1
--TreeMap--
1
2
3
--LinkedHashMap--
2
3
1
cs


위의 결과로 봤을 때 HashMap과 HashTable 역시 정렬되는 것 같지만, 하나는 오름차순, 하나는 내림차순으로 정렬된다. 그냥 맘 편하게 안 된다고 생각하자.


<구조 및 성능>

HashMap

검색성능 O(1) 시간복잡도, 해시테이블과 비교하여 동기화(Synchronized) 지원하지 않지만 성능은 더 빠름

HashTable 

검색성능 O(1) 시간복잡도, 해시맵과 비교하여 동기화(Synchronized) 지원하지만 성능은 더 느림

LinkedHashMap

검색성능 O(1) 시간복잡도, 더블링크드리스트 자료구조로 이루어짐

TreeMap

검색성능 O(log(n)) 시간복잡도, Red Black Tree 자료구조로 이루어짐


<Null Keys and values>

HashMap

하나의 null Key와 여러 개의 null values를 허용한다.

HashTable

null Key 또는 null Value를 허용하지 않는다. => Null Pointer Exception 발생

LinkedHashMap

하나의 null Key와 여러 개의 null values를 허용한다.

TreeMap

null Key 또는 null Value를 허용하지 않는다. => Null Pointer Exception 발생




'JAVA' 카테고리의 다른 글

자바 예외 처리  (0) 2015.11.21
GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
Posted by slender ankles
,


'JAVA' 카테고리의 다른 글

GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
Posted by slender ankles
,

자바 성능 튜닝

성능에 영향을 미치는 요인은 크게 두 가지로 나눌 수 있다.

GC, HotSpot

 

* 2GB의 힙을 사용하는 JVM8GB의 힙을 사용하는 JVM의 차이는 어떻게 나타날까?

2GB의 힙을 사용하는 JVMGC를 처리하는 “STOP-THE-WORLD”가 짧을 것이므로 성능 상 유리할 수 있다.

반면에 8GB의 힙은 GC를 처리하는 시간은 길지 모르나 2GB의 힙에 비해 GC가 덜 빈번하게 일어나 성능 상 유리할 수도 있다.

 

32bit JVM vs 64bit JVM

동일 조건이라면 32bit JVM이 성능 상 더 유리하다.

?)

 

웹 서버의 가장 좋은 GC알고리즘은 무엇인가?

모든 경우는 아니지만 대부분 Concurrent Mark Sweep GC알고리즘이 성능이 가장 좋다. 이유는 낮은 딜레이가 중요하기 때문이다.

 

New 영역과 Old영역의 GC

New 영역의 GC보다 Old 영역에서 일어나는 Full GC가 일반적으로 시간이 오래 걸리기 때문에 New GC에서 충분한 크기를 잡아주는 것 역시 중요하다.

New영역이 너무 커져버려도 반응 속도가 느려 질 수 있다.

NEW영역에서의 GC의 메커니즘은 한 서바이버 영역에서 다른 서바이버 영역으로 복사가 일어나므로 이 또한 "STOP THE WORLD"가 발생한다.

'JAVA' 카테고리의 다른 글

LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
자바 classpath  (0) 2015.11.03
Posted by slender ankles
,

자바의 시간 API

JAVA 2015. 11. 7. 16:25

자바의 날짜와 시간 API의 문제점

자바에서는 날짜와 시간 API에 대한 악평이 자자했다. 그래서 JODA TIME이라는 외부 라이브러리를 이용하곤 했었는데, 자바 8에서는 이러한 날짜와 시간 API의 문제점을 개선한 API를 제공한다.

 

무엇이 문제였나?

1) 그레고리력으로 바뀌면서 발생한 율리우스력의 누적된 시간적 문제가 고려되지 않은 부분

2) 썸머타임이 적용되는 부분에 대한 고려되지 않은 부분

 ...

JDK의 기본 날짜 클래스의 문제점

1) 불변 객체가 아니다(Not Immutable)

날짜 클래스의 set메서드를 통해 날짜를 지정할 수 있게 되어있다. 이 것은 여러 가지 문제점을 만들어낸다.

예를 들어 어떤 스레드에서 set메서드를 통해 날짜를 바꾸고, 또 다른 스레드에서 set메서드를 통해 날짜를 바꾸게 되면 데이터의 무결성을 보장하기가 어렵게 된다.

이를 해결 하기 위해서는 각 객체를 복사해서 반환하는 방법으로 문제를 해결해야 한다.

2) 일관성 없는 요일 상수

Calendar.get(Calendar.DAY_OF_WEEK) 함수에서 반환한 요일은 int 값으로, 일요일이 1로 표현된다. 따라서 수요일은 4이고, 보통 Calendar.WEDNESDAY 상수와 비교해서 확인한다. 그런데 calendar.getTime() 메서드로 Date 객체를 얻어와서 Date.getDay() 메서드로 요일을 구하면 일요일은 0, 수요일은 3이 된다. 두 개의 클래스 사이에 요일 지정값에 일관성이 없는 것이다.

 

어떻게 개선되었는가?

1) 불변 객체가 되었다.

2) LocalDate, LocalTime 등으로 지역 시간과 시간대가 지정되었다.

3) 월의 int 값과 명칭이 일치한다. 1월은 int 1이다.

 

spring framework에서도 기본적으로 조다 타임을 제공한다.

새로운 자바 8에서의 시간 api는 조다 타임의 영향을 받아 제공되었다.

 

'JAVA' 카테고리의 다른 글

Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
자바 classpath  (0) 2015.11.03
Java finalize  (0) 2015.10.26
Posted by slender ankles
,

Commons DBCP

JAVA 2015. 11. 7. 16:20

Commons DBCP

 커넥션 풀의 BasicDataSource setter 메서드를 통해 세팅을 할 때 1.x버젼과 2.x버젼이 호환이 되는가?

 안 되는 부분 있음.

내부적으로 커넥션 풀이 어떻게 저장되어 있는지?



 

maxActive, initalSize, minIdle, maxIdle

 maxWait이란 무엇인가?

maxWait속성은 커넥션 풀에서 커넥션이 고갈 됐을 때 커넥션 반납을 대기하는 시간(밀리초)이며 기본 값은 무한정이다.

 

TPS(Transaction Per Seconds)

 

무조건 커넥션을 많이 사용하면 되는 것 아닌가?

커넥션을 많이 사용하게 되면 시스템이 사용할 수 있는 자원의 범위와 부딪힐 수 있게 된다.


'JAVA' 카테고리의 다른 글

자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
자바 classpath  (0) 2015.11.03
Java finalize  (0) 2015.10.26
Call By Value vs Call By Reference  (0) 2015.09.14
Posted by slender ankles
,

자바 classpath

JAVA 2015. 11. 3. 00:34


'JAVA' 카테고리의 다른 글

자바의 시간 API  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
Java finalize  (0) 2015.10.26
Call By Value vs Call By Reference  (0) 2015.09.14
List, Map, Set - Collection  (0) 2015.08.29
Posted by slender ankles
,