2012-09-19 2 views
1

데이터베이스에 예외를 기록해야합니다. 데이터베이스 API 상태 값을 ByteBuffer 또는 byte [] 배열로 전달할 수 있습니다. 그래서 어느 것이 더 효율적입니까?예외의 스택 추적을 byte [] 배열 또는 ByteBuffer (Java)로 변환하는 것이 더 효율적입니까?

private final static ByteBuffer getThrowableStackTraceByteBuffer(Throwable throwable) { 
    ByteArrayOutputStream throwableStackTraceByteArrayOutputStream = new ByteArrayOutputStream(); 
    throwable.printStackTrace(new PrintStream(throwableStackTraceByteArrayOutputStream)); 
    ByteBuffer throwableByteBuffer = ByteBuffer.wrap(throwableStackTraceByteArrayOutputStream.toByteArray()); 
    return throwableByteBuffer; 
} 

private final static byte[] getThrowableStackTraceBytes(Throwable throwable) { 
    StringWriter throwableStackTraceStringWriter = new StringWriter(); 
    throwable.printStackTrace(new PrintWriter(throwableStackTraceStringWriter)); 
    return throwableStackTraceStringWriter.toString().getBytes(); 
} 

대는 나는 데이터베이스 방법으로 전달되는 후 처리하는 특히, 내가의 ByteBuffer를 사용한다면 전체 작업을보다 효율적으로 할 것이라 생각합니다. 내가 맞습니까?

는 (특히, 나는 Hypertable에 예외를 로그인해야하고는 드리프트 자바 API를 사용합니다.)

+0

차이점을 벤치마킹 해 보았습니까? 애플리케이션에서 병목 현상이 있습니까? –

+3

왜 바이트를 사용하려고합니까? 스택 추적을 자연스럽게 문자열로 저장하지 않겠습니까? 또한 효율성이 중요한 이유는 무엇입니까? 효율성에 대한 예외가 충분 해지면 문제가 커집니다. 그것들을 대신 해결하십시오. –

+0

아직 병목 현상이나 효율성 문제가 없습니다. 나는 이제 server-app을 작성하기 시작했다. 모든 예외를 올바르게 기록하는 것은 좋은 습관 일뿐입니다. – ikevin8me

답변

7

가장 효율적인 옵션은 두 가지의 조합으로 같은 것입니다.

private final static byte[] getThrowableStackTraceBytes(Throwable throwable) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    throwable.printStackTrace(new PrintStream(baos)); 
    return baos.toByteArray(); 
} 

비록 데이터베이스에 쓰는 것이 여러 번 더 비쌉니다.

+0

"return baos.toByteArray();" - 반환 형식이 ByteBuffer이기 때문에 byte []를 반환합니다 - 작동하지 않습니다. – ikevin8me

+0

@ikevinjp 고쳐 주셔서 감사합니다. –

+0

이 작품, 감사합니다 !!! – ikevin8me