Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 сжатие CLOB  [new]
Alexei Zaycev
Member

Откуда: Петрозаводск
Сообщений: 58
есть таблица, есть пара полей CLOB содержащие большие объемы "повторяющейся" информации в каждой записи. есть желание при отдаче "наружу" на клиент через сеть гнать CLOB в сжатом виде и на клиенте разжимать - экономия трафика _очень_ существенная чтоб ради нее заморачиваться.

может у кого есть наработка хранимой функции на жабе которая на входе принимает CLOB а на выходе выдает сжатый BLOB?

Если жизнь так коротка, какой смысл куда-то спешить?!
7 июн 08, 23:40    [5777963]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Сжатие/разжатие это ресурсоемкая операция, и применение в этом случае ява-хранимых может привести к излишнему потреблению мощностей.
ИМХО лучше это реализовывать как External-функцию ну скажем на чистом C.

Есть еще вариант, сделать SSL-туннель, т.к. в SSL есть алгоритмы для сжатия передаваемого потока данных. И это не потребует модификации прикладного ПО. Сжатием/расжатием будет заниматься транспорт.
В DB2 есть собственная реализация работы по SSL, но пока не проверял поддерживается ли там сжатие, по идее должно.
Сделать SSL-туннель несложно, методика достаточно хорошо описана в интернет-ресурсах.
9 июн 08, 10:25    [5780255]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Alexei Zaycev
Member

Откуда: Петрозаводск
Сообщений: 58
сжатие конечно ресурсоемко, но затраты по времени в сумме меньше чем толкать эти "тучные" CLOB вголую через узкий канал.

просто после замеров под высокой нагрузкой когда происходят лаги узкое место именно ширина канала - часть клиентов висит на 32-64 кбит средней паршивости. проца хватает с запасом поэтому скорость сжатия не особо волнует (на данном этапе по крайне мере)

ЗЫ. туннель пробовал - проблемы лезли из-за местных инфраструктурных тараканов на которую повлиять я не могу

Если жизнь так коротка, какой смысл куда-то спешить?!
9 июн 08, 12:26    [5781118]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Alexei Zaycev
Member

Откуда: Петрозаводск
Сообщений: 58
ЗЫ2: сейчас клиенты с узким каналом сидят через VJDBC - но здесь тоже есть свои минусы

Если жизнь так коротка, какой смысл куда-то спешить?!
9 июн 08, 12:28    [5781139]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
В таком случае делай функцию. Можешь для начала и на Java.
Сами методики компрессии/декомпрессии встроены в JDK. Смотри классы в пакете java.util.zip.
Если производительность/нагрузка на сервер будет устраивать, можно конечно так и оставить. Но помнить, что это может оказаться узким местом.

А с туннелем какие проблемы возникли? Не хотят пропускать через брандмаузер?
9 июн 08, 12:53    [5781366]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Alexei Zaycev
Member

Откуда: Петрозаводск
Сообщений: 58
сам код сжатия я накатаю - не проблема. меня в основном интересовало как правильно внутрь передать CLOB и наружу отдать BLOB - то бишь как параметры корректно объявить у функции.

у нас каналы не свои - у прова свое железо и софт стоит хз какой. плюс у нас свое железо. и все опутано vipnet (спущен сверху). плюс большая территориальная разнесенность и как следствие разнощерстность железа. в сумме - тошнотворный коктейль.

Если жизнь так коротка, какой смысл куда-то спешить?!
9 июн 08, 13:15    [5781562]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
gals
Member

Откуда: Санкт-Петербург
Сообщений: 195
По моему, тут задача чуточку неправильно поставлена...
Вы хотите, чтобы сервер при отдаче данных сжимал CLOB в BLOB меньшего объема.
Может быть, имеет смысл хранить в БД как CLOB так и готовый BLOB?
Дело в том, что операций вставки идет значительно меньше, чем операций чтения записей... Или я ошибаюсь?
9 июн 08, 13:46    [5781847]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Alexei Zaycev
Member

Откуда: Петрозаводск
Сообщений: 58
есть сторонний софт который работает в том числе и с этой базой, заточен на CLOB и который переписывать никто не собирается. для себя я просто сделаю второй вариант хранимок (6 штук) которые отдают наружу вместо CLOB сжатые BLOB и все. и можно будет выбирать прямо на клиенте со сжатыми или нет данными работать "на ходу".

по идее можно бы было хранить данные в сжатом виде и если нужны не сжатые CLOB то разжимать перед отдачей. но тут не факт что быстрее получится - содержимое CLOB обновляется (перегенерируется на сервере) в среднем раз в сутки практически по всем записям. а на клиент за те же сутки отдается от силы 2-3% из них.

Если жизнь так коротка, какой смысл куда-то спешить?!
9 июн 08, 14:01    [5781970]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Попробуйте:
// Zip.java
import java.io.*;
import java.util.zip.*;
import COM.ibm.db2.app.*;

public class Zip extends UDF {
   static final int BUFFER = 2048;
   
   public void zip(Clob clob, Blob b) throws Exception {
     b = Lob.newBlob();
     ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(b.getOutputStream()));
     char ca[] = new char[BUFFER];
     byte ba[] = new byte[2*BUFFER];
     BufferedReader in = new BufferedReader(clob.getReader(), BUFFER);
     ZipEntry entry = new ZipEntry(".");
     zos.putNextEntry(entry);
     int count;
     while((count = in.read(ca, 0, BUFFER)) != -1) {
       for (int i=0; i<count; i++) {
       	  ba[2*i]   = (byte)(ca[i] & 0xff);
         ba[2*i+1] = (byte)(ca[i] >> 8 & 0xff);
       }
       zos.write(ba, 0, 2*count);
     }
     in.close();
     zos.close();
     set(2, b);
   }
   
   public void unzip(Blob b, Clob clob) throws Exception {
     clob = Lob.newClob(); 
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(b.getInputStream()));
     Writer out = clob.getWriter();
     if(zis.getNextEntry() != null) {
     	 char ca[] = new char[BUFFER];
    	 byte ba[] = new byte[2*BUFFER];
       int count;
       while((count = zis.read(ba, 0, 2*BUFFER)) != -1) {
      	 for (int i=0; i<count/2; i++) {
      		 ca[i] = (char)(((ba[2*i+1] & 0xff) << 8) | (ba[2*i] & 0xff));
      	 }
         out.write(ca, 0, count/2);
       }
     }  
     zis.close();
     out.close();
     set(2, clob);
  }
}   
Класс положить в %DB2PATH%/FUNCTION
create function zip(c clob(2m))
RETURNS blob(1m)
LANGUAGE java
EXTERNAL NAME 'Zip.zip'
FENCED THREADSAFE
NO SQL
NOT NULL CALL
NO EXTERNAL ACTION
DISALLOW PARALLEL
PARAMETER STYLE db2general;

create function unzip(c blob(1m))
RETURNS clob(2m)
LANGUAGE java
EXTERNAL NAME 'Zip.unzip'
FENCED THREADSAFE
NO SQL
NOT NULL CALL
NO EXTERNAL ACTION
DISALLOW PARALLEL
PARAMETER STYLE db2general;
9 июн 08, 19:11    [5784380]     Ответить | Цитировать Сообщить модератору
 Re: сжатие CLOB  [new]
Alexei Zaycev
Member

Откуда: Петрозаводск
Сообщений: 58
пасиб, попробую

Если жизнь так коротка, какой смысл куда-то спешить?!
10 июн 08, 11:03    [5785928]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить