03.02.2013 20:27
Pblcb
 
Доброго времени суток, коллеги.
Попытался использовать пример из FAQ на sql ru, добавил в него методы:
Код:
public static oracle.sql.BLOB smBlobChunk2blob(oracle.sql.BLOB src) throws SQLException, IOException {
        InputStream in = null;
        OutputStream out = null;
        BLOB outputBLOB = null;
        try {
            outputBLOB = BLOB.createTemporary(getConnection(),true, BLOB.DURATION_SESSION);
            float f = 1/0;
            in = src.getBinaryStream();
            out = outputBLOB.getBinaryOutputStream();
            int length;
            byte[] rbuf = new byte[src.getChunkSize()];
            byte[] wbuf;
            boolean firstChunk = true;
            while( (length = in.read(rbuf)) != -1 ) {
                if( firstChunk ) {
                    firstChunk = false;
                    // конвертим 4 последовательных байта в int
                    int name_size = ((rbuf[0x0C + 3] & 0xFF) << 24) + ((rbuf[0x0C + 2] & 0xFF) << 16) + ((rbuf[0x0C + 1] & 0xFF) << 8) + (rbuf[0x0C] & 0xFF);
                    int offset = 0x0C + name_size + 7;
                    wbuf = ShiftBuffer(rbuf, offset);
                    length -= offset;
                } else {
                    wbuf = rbuf;
                }
                out.write(wbuf, 0, length);
            }
        } finally {
            if( out != null )
                out.close();
            if( in != null )
                in.close();
        }
        return outputBLOB;
    }
    private static byte[] ShiftBuffer(byte[] src, int shift) {
        if( shift > src.length )
            return new byte[0];

        byte[] trg = new byte[src.length - shift];
        for( int i = 0; i < src.length - shift; i++ ) {
            trg[i] = src[i + shift];
        }
        return trg;
    }
соответственно добавил описание этого дела в package lob_utils:
Код:
function smBlobChunk2blob(src blob) return blob as
  language java name 'LobUtils.smBlobChunk2blob(oracle.sql.BLOB) return oracle.sql.BLOB';
В результате при каждом вызове любого из описанных методов получаю ORA-03113, но в alert.log никаких следов этого события не остается. При трассировке сессии тоже ничего странного не записывается.
Подскажите откуда ноги у проблемы могут расти?

P.S. Сервер БД Oracle 9.2.0.8, крутится все это дело на win2003r2.
03.02.2013 21:04
OlegON
 
При всей моей бывшей любви, в 9ке много всяческих багов было. Это первая нога. Извини, вникать в текст и догадываться, что ты хочешь сделать, лень. Но, как мне кажется, проблема в том, что ты долбишься через thin и это еще и на винде. Посмотри, что у тебя с shared-серверами. Зачем тебе внутренняя Java? Вытащи наружу, будешь хоть как-то контролировать процесс и лучше видеть ошибки, не говоря уж о том, что внешнюю жабу ты сможешь нормально профилировать и обновить без обновления 9i. Думаю, что косяк в коннекторе, поэтому и предлагаю внешний job. Потом переставишь на 10ку и без лишнего головняка проапгрейдишься.
03.02.2013 21:13
Pblcb
 
Спасибо, Олег, за советы. Но как мне кажется без внутренней явы никак, потому что кто-то в сервис-плюсе захотел хранить картинку вместе с названием этой картинки. А мне в голову другого решения для извлечения картинки в голову не приходит.
03.02.2013 21:38
OlegON
 
Я так и подумал, что несчастные фотки товара :) На самом деле пошукай по форуму, Белый лев уже что-то выкладывал на тему выдергивания картинок. И должен тебя опечалить, что, судя по Ораклу 9, ты еще и на старой версии СМ. А это значит, что все твои старания пойдут под нож, поскольку в новых версиях опять что-то поменялось, я плюнул и не вникал, поскольку чисто по логике веб-сервера предпочел бы статику на диске, а не в базе, если что.
Что касается "решения для извлечения", то куда извлекать-то? На Delphi с полпинка я эти картинки доставал, как помню.
04.02.2013 00:19
Pblcb
 
Цитата:
куда извлекать-то?
в 1C как это не прискорбно... там для работы с картинками только ХранилищеЗначения существует.
04.02.2013 08:15
OlegON
 
Так я и пытаюсь выяснить, оперативная работа? Или задание по ночам? Может, можно жабу воткнуть снаружи? В любом случае интересно к чему придешь.
04.02.2013 13:22
vdm
 
Как-то не пойму, зачем тут обязательно java нужна.
Через DBMS_LOB не получится сделать тоже самое?

И ошибка действительно сразу при вызове или где-то дальше при выборке в 1С?
Проверил на аналогичной конфигурации (2003+9.2.0.8) вызов без возврата результата наружу
Код:
declare
  src blob;
  bb blob;
begin
  SELECT theimage
    into src
    FROM supermag.smcardimage
   where article='016651';
  bb :=  supermag.usrLob_Utils.smBlobChunk2blob(src);
end;
не падает (деление на 0 убрал :) ).
04.02.2013 22:17
Pblcb
 
Цитата:
vdm Как-то не пойму, зачем тут обязательно java нужна.
Через DBMS_LOB не получится сделать тоже самое?
(деление на 0 убрал :) ).
Прошу прощения за деление на ноль.
Я с его помощью место падения поймать пытался. У меня если деление на ноль до создания временного ЛОБа; выскакивает ексепшн оделении на ноль. если после, то возникает EOF(и никаких следов в алертах).
А DBMS_LOB позволяет кусок LOBa выделить?

vdm, выполнил твой сценарий, получил тот же результат. можешь показать найстройки оракла дабы сравнить?
05.02.2013 11:17
vdm
 
Компоненты и spfile:

Oracle9i Catalog Views 9.2.0.8.0
Oracle9i Packages and Types 9.2.0.8.0
Oracle Workspace Manager 9.2.0.1.0
JServer JAVA Virtual Machine 9.2.0.8.0
Oracle XDK for Java 9.2.0.10.0
Oracle9i Java Packages 9.2.0.8.0

compatible='9.2.0.0.0'
db_block_size=8192
db_cache_size=629145600
db_domain=''
db_file_multiblock_read_count=16
fast_start_mttr_target=300
hash_join_enabled=TRUE
java_pool_size=16777216
job_queue_processes=2
large_pool_size=8388608
log_archive_start=TRUE
log_buffer=2097152
O7_DICTIONARY_ACCESSIBILITY=TRUE
open_cursors=300
optimizer_features_enable='9.2.0.1'
optimizer_index_caching=90
optimizer_index_cost_adj=20
pga_aggregate_target=209715200
processes=150
query_rewrite_enabled='FALSE'
remote_login_passwordfile='EXCLUSIVE'
sessions=50
sga_max_size=832569344
shared_pool_size=159383552
sort_area_size=4194304
star_transformation_enabled='TRUE'
timed_statistics=TRUE
transactions=50
undo_management='AUTO'
undo_retention=10800
undo_tablespace='UNDOTBS1'

Есть в dbms_lob read, createtemporary, copy.
06.02.2013 05:06
Pblcb
 
Из параметров отличается только star_transformation_enabled и память по мелочам.
а в остальном вроде одинаково.
а и java_* все установлены в 32мегабайта
Подскажи пожалуйста а как узнать какие установлены компоненты?
Часовой пояс GMT +3, время: 18:27.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.