За последние 24 часа нас посетили 22874 программиста и 1223 робота. Сейчас ищут 748 программистов ...

проблемы при работе с blob полем в oracle через php

Тема в разделе "Oracle Database", создана пользователем JMax, 8 июн 2011.

  1. JMax

    JMax Активный пользователь

    С нами с:
    8 июн 2011
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Россия
    Добрый день.
    Существует таблица с полем blob, в которое сохраняются объекты в формате JSON.
    Сохранение и выбор, в принципе, работают. Делают они это так:

    1) Добавление

    PHP:
    1. $query = "insert into history (item_type, item_id, item_value, dt_change, person) values (
    2.            '" . $history->item_type . "',
    3.            '" . $history->item_id . "',
    4.            EMPTY_BLOB(),
    5.            '" . $history->dt_change . "',
    6.            '" . $history->person . "') RETURNING item_value INTO ?";
    7.  
    8.         $tmpfile = tmpfile();
    9.         fwrite($tmpfile, $history->item_value);
    10.         fseek($tmpfile, 0);
    11.  
    12.         $pdo = Ora::create()->pdo;
    13.         $q = $pdo->prepare($query);
    14.         $q->bindParam(1, $tmpfile, PDO::PARAM_LOB);
    15.  
    16.         $q->execute();
    2) Выборка

    PHP:
    1. $result = array();
    2.         $query = Select::create('history')
    3.                 ->addFields('item_value', 'dt_change', 'person', 'item_type', 'item_id')
    4.                 ->addConditions(array('item_type' => $type, 'item_id' => $id))
    5.                 ->orderBy('dt_change DESC');
    6.        
    7.         $pdo = Ora::create()->pdo;
    8.         $q = $pdo->prepare($query.'');
    9.         $q->execute();
    10.         $q->bindColumn(1, $blob, PDO::PARAM_LOB);
    11.         while ($history = $q->fetch(PDO::FETCH_ASSOC)) {
    12.             $value = fread($blob, 2000000);
    13.             $result[] = array(
    14.                 'dt_change' => $history['dt_change'],
    15.                 'person' => $history['person'],
    16.                 'value' => json_decode($value)
    17.             );
    18.         }
    19.         return $result;
    Как видно, работает все через PDO. Такие штуки, как beginTransaction и commit встроены в execute.

    Проблема в том, что допустим после сохранения не работает выборка, т.е. все зависает на выполнении select запроса больше чем на 30 секунд и сервер плюется ответом. Помогает только перезагрузка апача и удаление файлика сессии с компа. Возможно, есть и другие комбинации, например на какой-то определенной выборке без сохранений все зависнет.

    Надо сказать, что после удаления сессии и перезагрузке апача выборка работает очень шустро, собственно как и первое сохранение.

    Может кто-то сталкивался или просто поможет решить проблему?