powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
25 сообщений из 30, страница 1 из 2
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587766
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Visual Studio 2012 + Firebird 2.5.2 SuperServer Win7 x64 + Firebird .NET provider.
Подключаюсь к базе удаленно через TCP/IP. Так как в некоторых таблицах имеются по несколько BLOB-ов а я кеширию в программе несколько таблиц выборка идет очень медленно (60-180 секунд). Таблицы не очень большие (500-1000 строк). Вопрос в том что-бы как-то ускорить SELECT * FROM SomeTable. Имеется-ли возможность всю таблицу вернуть как JSON? Есть-ли стандартные функции или подключаемые функции?
С отчаяния даже написал несколько ХП что-бы частично решить проблему.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET TERM ^ ;
CREATE OR ALTER PROCEDURE  CONVERT_ESCAPE_TXT2JSON ( GELENBILGI Blob sub_type 1 )
RETURNS (CIKTI Blob sub_type 1 )
AS
begin
  cikti=replace(replace(replace (gelenBilgi,  '\', '\\'),'"','\"'),'/','\/');
  suspend;
end^
SET TERM ; ^




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SET TERM ^ ;
CREATE OR ALTER PROCEDURE CONVERT_TIMESTAMP2JSON_ISO8601 ( DT Timestamp )
RETURNS (RESULT Varchar(100) )
AS
declare variable grkInt integer;

begin
/*
from:
http://firebirdsql.su/doku.php?id=extract
*/

  
  result =  lpad(EXTRACT(YEAR FROM :dt),4,'0') || '-' ||
            lpad(EXTRACT(MONTH FROM :dt),2,'0') || '-' ||
            lpad(EXTRACT(DAY FROM :dt),2,'0') || 'T' ||
            lpad(EXTRACT(HOUR FROM :dt),2,'0') || ':' ||
            lpad(EXTRACT(MINUTE FROM :dt),2,'0') || ':';  
  
  
  
  --extract seconds
  --нужно целое число а то какая-то чушь получатся с точкой если секунды меньше 10
  grkInt = EXTRACT(second FROM :dt);  
  result = result || lpad(cast(:grkInt as varchar(10)),2,'0') || '.';
  
  --extract milliseconds
  --нужно целое число а то какая-то чушь получатся с точкой если миллисекунды меньше 100
  grkInt = EXTRACT(MILLISECOND from :dt);  
  result = result || lpad(cast(:grkInt as varchar(10)),3,'0');
 
  --result = '2014-03-16T06:48:12.525';
 
  suspend;
end^
SET TERM ; ^




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SET TERM ^ ;
CREATE OR ALTER PROCEDURE CONVERT_TIMESTAMP2JSON_MS ( DT Timestamp )
RETURNS ( RESULT Varchar(100) )
AS
declare variable grkInt integer;

begin
  result = '\/Date(' || datediff(second,cast('1970-01-01' as timestamp),:dt);
  
  --extract milliseconds
  --нужно целое число а то какая-то чушь получатся с точкой если миллисекунды меньше 100
  grkInt = EXTRACT(MILLISECOND from :dt);  
  result = result || lpad(cast(:grkInt as varchar(10)),3,'0') || ')\/';
 
  suspend;
end^
SET TERM ; ^
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587804
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench Amanov,

правильным мне в данном случае представляется написание сервера приложений
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587850
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема не в том чтобы написать сервер приложений. Я и так использую связку NancyFX + Topshelf чтобы устройства на андроиде могли пользоватся базой на "огнептице" :) . Дело как раз в том чтобы узнать есть ли хотя бы теоретическая возможность реализовать такой функционал в самой базе, используя или родные функции или хранимые процедуры. UDF в моем сценарии тоже исключено. Потому-что мои клиенты ничего кроме Далее->Далее не знают. Думаю закончу такой функционал полностью через месяц, потому что пока не могу из ХП слелать конвертацию [binary blob] -> Base64. А так по прикидкам остальное все работает.
Тогда в чем проблема и зачем вопрос?
Просто если работа уже однажды сделана, не хочется мучиться во второй раз И вся эта бодяга оперативки жрет не по детски.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587861
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут действительно нужен сервер, только не сервер приложений, а просто промежуточный сервер, который будет делать всю сложную работу, которую неудобно делать в ХП...
Этот сервер - обычное приложение, работающее с БД. Отличие только в том, что нужно добавить в него к-нить технологию обмена с "внешним миром". Я, например, использую http и Datasnap, т.е. в сервере есть еще встроенный web-сервер и datasnap-сервер.

Т.е. классическая трехзвенка. Это не так сложно, как кажется.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587873
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nancyfx это как раз легкий веб сервер. Topshelf это фрейморк для виндовых служб. Так-что трехзвенка в наличии :) Используется HTTP (GET/POST). Просто не всегда есть возможность эту службу установить. И чисто по человечески интересно, можно так сделать или нет. Вот было-бы прекрасно написать SELECT * FROM SomeTable RETURNING JSON (как если не ошибаюсь есть в PostgreSQL).
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587891
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench AmanovВот было-бы прекрасно написать
нет этого, и вряд-ли будет. Не серверово это дело всякими форматами заниматься. Например, у InterBase в свое время сделали преобразование получаемой выборки в XML, но в клиентской части (gds32.dll).
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38587933
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench AmanovВопрос в том что-бы как-то ускорить SELECT * FROM SomeTable. Имеется-ли возможность всю таблицу вернуть как JSON?А как второе поможет первому ?
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588010
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladА как второе поможет первому ?
я так понял, что "быстрее" было бы если сервер будет сам преобразованиями заниматься, чем делать преобразования и формирование json в хранимой процедуре.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588034
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench AmanovUDF в моем сценарии тоже исключено. Потому-что мои клиенты ничего кроме Далее->Далее не знают.Ты программист или где? что мешает написать свой инсталлятор файрберда, который подсунет нужные либы? Тем более писать его не с нуля.
Begench Amanovкак-то ускорить SELECT * FROM SomeTableтакой запрос можно ускорить только шустрым диском и достаточным объемом ОЗУ. К жейсону это вообще перпендикулярно.
kdvнет этого, и вряд-ли будет. Не серверово это дело всякими форматами заниматься.В 2.1 много чего "затащили внутрь". Если найдется купец, то какие проблемы?
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588088
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvя так понялА я вот - ничего не понял. И сильно сомневаюсь, что ТС понимает, что делает...
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588264
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench AmanovWin7 x64 + Firebird .NET provider.
Так как в некоторых таблицах имеются по несколько BLOB-ов а я кеширию в программе
несколько таблиц выборка идет очень медленно (60-180 секунд).

Это известная архитектурная проблема .NET провайдера. Используй нативные интерфейсы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588678
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю как это сделано в нативных интерфейсах но в .NET + Firebird .NET Provider выборка SELECT * FROM SomeTable работает так:
1) возвращается вся таблица (вместо BLOB-ов их ID)
2) На КАЖДЫЙ blob генерируется новый запрос... Ну вы поняли.

Так что если для примера в выборке больше 200 строк и в каждой строке 2-3 блоба, можно идти пить чай.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588683
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench Amanov,

трейс это подтверждает?
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588689
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите забыл добавить что медленная выборка это при обращении к базе через сеть (удаленно). Если запрос к локальной базе, то никаких проблем.

kdvhvladА как второе поможет первому ?
я так понял, что "быстрее" было бы если сервер будет сам преобразованиями заниматься, чем делать преобразования и формирование json в хранимой процедуре.

именно.

Dimitry SibiryakovЭто известная архитектурная проблема .NET провайдера. Используй нативные интерфейсы.


Не знаю, не знаю. FlameRobin тоже не по детски тормозит на этой выборке.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588691
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench AmanovНе знаю как это сделано в нативных интерфейсах
Ну так слушай тех, кто знает. Используй нативные интерфейсы и для получения содержимого
блобов буфер побольше (64к вместо 300 байт) - будет тебе счастье. Может быть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588704
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Dimitry SibiryakovНу так слушай тех, кто знает. Используй нативные интерфейсы и для получения содержимого
блобов буфер побольше (64к вместо 300 байт) - будет тебе счастье. Может быть.


А можно подсказать неофиту как это сделать в .NET (ссылка на доки, мануалы?)
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588715
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Для этого трейс не нужен.
Дока
6. If you query tables with BLOBs without actually reading BLOB data (just doing SELECT *) it is a good idea to remove them from the column list, since BLOBs require two trips to the server (one to retrieve BLOB ID and other the retrieve the data).
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588716
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench Amanov,

Кстати, а в блобах у тебя данные какой длины? Может проще звать CAST (BLOBFIELD as VARCHAR(xxxx)), чтобы обойти эту генерацию 100500 запросов по блоб полям?
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588722
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench AmanovА можно подсказать неофиту как это сделать в .NET (ссылка на доки,
мануалы?)
Это просто: сначала сносишь .NET, потом устанавливаешь вменяемый нативный C++ и... всё.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588728
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterКстати, а в блобах у тебя данные какой длины? Может проще звать CAST (BLOBFIELD as VARCHAR(xxxx)), чтобы обойти эту генерацию 100500 запросов по блоб полям?

У меня вся база в UTF8, а блобы у меня произвольной длины. Так что не получится.

Dimitry SibiryakovЭто просто: сначала сносишь .NET, потом устанавливаешь вменяемый нативный C++ и... всё.


Проект которому 8 лет и он вполне успешен переписать на С++? Да вы юморист батенька.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А впрочем, я неправ: CORE-3424 так и висит открытым, так что как руки ни рихтуй, два
round-trip на каждый BLOB остаются и по сей день.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588736
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Так и вопрос был в том что если можно сделать RETURNING JSON эти roundtrip-ы были бы не нужны. Возвращался бы один большой BLOB.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588760
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench Amanov,

по первой процедуре, чудится мне, что тут тормоза отсюда
Код: plaintext
replace(replace(replace (gelenBilgi,  '\', '\\'),'"','\"'),'/','\/');

http://www.ibase.ru/devinfo/dbgrowth.html

нет?

Begench AmanovТак и вопрос был в том что если можно сделать RETURNING JSON
ну нету никакого returning json. Сделать - да, можно, за деньги. А без денег оно тут кроме тебя никому не нужно.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588779
Begench Amanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Сделать я и сам могу :) Хотелось узнать делал это кто ранее или нет. Просто делать однажды сделанное... лень.
Спасибо за подсказку про тормоза. Просто пока не нашел сбособ не создавать блобы после каждого replace.
...
Рейтинг: 0 / 0
Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
    #38588838
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begench Amanov1) возвращается вся таблица (вместо BLOB-ов их ID)
2) На КАЖДЫЙ blob генерируется новый запрос... Ну вы поняли.1. Есс-но
2. Что, даже если код их не трогает - провайдер всё равно САМ их вытягивает ?
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возможно ли возвратить выборку в формате JSON, Firebird 2.5.2 SuperServer Win7 x64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]