2013-08-26 5 views
1

어딘가에 캐시해야하는 커다란 문자열이 있습니다. 파일로 쓸 수 없기 때문에이 유일한 옵션은 텍스트로 데이터베이스에 저장하는 것입니다. 특히, clob에서 JSON 파일의 특정 키 아래에 압축 된 문자열을 배치 할 JSON 파일을 저장하고 있습니다.문자열 압축 및 나중에 압축 해제를위한 문자열로 데이터베이스에 저장

저는 문자열을 압축하고 있습니다. 그러나 문자열 조작을 통해 데이터가 압축 해제되지 않는 상황이 발생합니다. 따라서 데이터를 64로 인코딩해야하는지는 압니까 압도적으로 줄어들 것입니다.

압축 된 문자열을 데이터베이스에 저장하여 나중에 가져올 수 있도록하려면 어떻게해야합니까?

나는 데이터베이스를 변경할 수 없습니다, 그래서 나는 그 CLOB 필드와 붙어있어

이 내 압축 기능은 다음과 같습니다

public static String compress(String text) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     OutputStream out = new DeflaterOutputStream(baos); 
     out.write(text.getBytes("UTF-8")); 
     out.close(); 
    } catch (IOException e) { 
     //ooops 
    } 
    return baos.toString(); 
} 

public static String decompress(String bytes) { 
    InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes.getBytes())); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     byte[] buffer = new byte[8192]; 
     int len; 
     while ((len = in.read(buffer)) > 0) 
      baos.write(buffer, 0, len); 
     return new String(baos.toByteArray(), "UTF-8"); 
    } catch (IOException e) { 
     //ooops 
    } 
} 
+0

성능을 향상시키기 위해 데이터를 검색하는 데 필요한 작업량을 제한하기 위해 * cache *가 사용됩니다. 그것을 압축하고 CLOB에 저장하는 것은 그 목적과는 거리가 멀다. 적어도 그것은 나에게 그렇게 보인다. –

답변

1

당신은 그것을 파괴하지 않고 문자열로 임의의 이진 데이터를 변환 할 수 없습니다 . 앞에서 설명한 것처럼 데이터를 clob에 저장하려면 데이터를 base64로 인코딩하거나 다른 유효한 2 진법을 텍스트 인코딩으로 사용해야합니다.

1

알다시피, 손상없이 CLOB에 2 진 데이터를 저장할 수 없으므로 텍스트로 인코딩해야합니다.

Base 64는 평균적으로 이진 데이터의 크기에 33 %를 추가합니다. 따라서 약간의 압축은 없지만 압축 비율이 25 %보다 크면 (특정 유형의 텍스트 문자열에서는 압축률이 높은 경우가 많습니다) 압축을 한 다음 64 비트 인코딩을 사용하면 실제 저장 용량을 얻을 수 있습니다. CPU 많이 사용 .....

+0

데이비드에게 감사드립니다. 맞습니다 - 25 %의 압축률로 인해 원본 크기의 75 %의 문자열이 생기고 1/3에 추가하면 100 %로 되돌아옵니다. 따라서 25 % 이상을 필요로합니다. 내 대답을 업데이트했습니다. – lreeder

0

memcached 또는 다른 캐싱 시스템 사용과 같은 다른 솔루션을 생각해 봤습니까? 아니면 압축을 정말하고 싶습니까?

관련 문제