Оптимальный метод для nodejs для передачи изображения из базы данных в браузер - PullRequest
0 голосов
/ 15 февраля 2019

конечный результат, который мне нужен, - это отправка нескольких изображений в веб-браузер из базы данных.

Изображения хранятся в виде BLOB-объектов.

Я знаю, что могу передавать их избазы данных и в файл, а затем я мог бы просто дать URL-адрес файла.

Я также знаю, что я могу передать строку base64 в браузер, чтобы он мог отобразить изображение.

Мой вопроскакой вариант является наиболее оптимальным?Или лучшая практика?Имейте в виду, что если я использую потоковый метод, мне нужно будет проверить, изменилось ли изображение с тех пор, как я в последний раз отображал его ... и если оно изменилось, то я должен повторно вывести его из базы данных.

Я играл с oracldb для узла js и смог успешно извлечь один BLOB-объект в файл, но у меня также возникают проблемы с потоковой передачей нескольких файлов.

Это сообщение из двух вопросов:

Что является наиболее оптимальным: 1. Отправьте строку Base64 - мне нравится этот метод, потому что мне не нужно беспокоиться о потоковой передаче файла и проверке, изменился ли он, поскольку он поступает прямо из базы данных.Меня беспокоит, может ли браузер / nodejs справиться с этим?Я знаю, что эти строки могут быть очень большими.Я также мог бы отправлять более одного изображения одновременно.

Потоковая передача больших двоичных объектов в файлы.

Вторая часть вопроса заключается в том, как я могу получить несколько больших двоичных объектов, приведенных ниже. Это мой код для потоковой передачи только одного файла, я нашел этот пример в github lobstream1.js *.1020 *

https://raw.githubusercontent.com/oracle/node-oracledb/master/examples/lobstream1.js

Сосредоточив внимание на коде:

// Stream a LOB to a file
var  dostream = function(lob, cb) {
  if (lob.type === oracledb.CLOB) {
    console.log('Writing a CLOB to ' + outFileName);
    lob.setEncoding('utf8');  // set the encoding so we get a 'string' not a 'buffer'
  } else {
    console.log('Writing a BLOB to ' + outFileName);
  }

  var errorHandled = false;

  lob.on(
    'error',
    function(err) {
      console.log("lob.on 'error' event");
      if (!errorHandled) {
        errorHandled = true;
        lob.close(function() {
          return cb(err);
        });
      }
    });
  lob.on(
    'end',
    function() {
      console.log("lob.on 'end' event");
    });
  lob.on(
    'close',
    function() {
      // console.log("lob.on 'close' event");
      if (!errorHandled) {
        return cb(null);
      }
    });

  var outStream = fs.createWriteStream(outFileName);
  outStream.on(
    'error',
    function(err) {
      console.log("outStream.on 'error' event");
      if (!errorHandled) {
        errorHandled = true;
        lob.close(function() {
          return cb(err);
        });
      }
    });

  // Switch into flowing mode and push the LOB to the file
  lob.pipe(outStream);
};

Исправлен спулинг изображений с помощью этого метода, я немного изменил dostream.

for(var x = 0; x<result.rows.length;x++)
        {
          outputFileName = x + '.jpg';
          console.log(outputFileName);
          console.log(x);

          var lob = result.rows[x][0];
          dostream(lob,outputFileName);
//        cb(null,lob);
        }

Спасибо залюбая помощь.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Учитывая все детали, которые вы указали в последующих комментариях, включая средний размер изображения, количество отдельных изображений, память, доступную для Node.js, количество одновременных пользователей и тот факт, что «очень важно иметь изображения в актуальном состоянии»"вот мой первоначальный подход ...

Для первой реализации придерживайтесь принципа KISS и избегайте чрезмерного проектирования.Отключите кеширование браузера и не кэшируйте изображения в Node.js.Вместо этого положитесь на драйвер и базу данных Oracle, чтобы выполнить тяжелую работу за вас.

Что касается таблицы, хранящей изображения, попробуйте использовать SecureFile LOB над BasicFile (как известно, они работают лучше), если это возможно.Также обратите внимание на параметры кэширования, доступные для обоих (CACHE, CACHE READS и NOCACHE).Рассмотрите возможность включения опции CACHE READS в зависимости от заявленной рабочей нагрузки, но поработайте с вашим администратором базы данных, чтобы убедиться, что размер буферного кеша соответствует размеру, поэтому вы не будете влиять на другие.контролировать, сколько людей загружают файлы одновременно.Фактически, вы можете захотеть создать отдельный пул только для этой цели, чтобы люди, выбирающие большие объекты, не блокировали людей, выполняющих другие действия в приложении.Например, допустим, у вас обычно один пул соединений с 10 соединениями.Вы можете создать два пула соединений по 5 соединений в каждом (используйте кеш кеш пула соединений , чтобы сделать это проще).Затем, в пути к коду, который выбирает большие объекты, используйте пул больших ресурсов и используйте другой пул для всего остального.

Учитывая эту настройку, я бы также рекомендовал НЕ выполнять потоковую передачу больших объектов.Использование возможности драйвера для буферизации больших объектов в Node.js значительно упростит код, и у вас должно быть достаточно памяти при таком небольшом количестве одновременных выборок пользователей / файлов.

Самая большая проблема в этом сценарии заключается в том, чтоизображения довольно большие, и они всегда будут передаваться из базы данных через Node.js в браузер.Но так как вы будете во внутренней сети, это может быть не большой проблемой.Если это окажется проблемой, вы можете начать добавлять кеширование либо в браузере, либо в Node.js, основываясь на том, что имеет смысл.

0 голосов
/ 15 февраля 2019

Если вы не делаете что-то вроде тайлинга или встроенного кодирования base64, каждому изображению необходим свой собственный URL, поэтому каждый вызов node-oracledb вернет только одно изображение.Вы можете выполнить какое-то кэширование, записав на диск, но это кажется дополнительным вводом-выводом - вам нужно будет протестировать, чтобы измерить производительность вашей системы и требования к памяти.Что касается доступа к нескольким изображениям в node-oracledb, в https://github.com/oracle/node-oracledb/issues/1041#issuecomment-459002641 есть некоторый код, который может быть полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...