Форум » Для флейма » MiniGui + PostgreSQL » Ответить

MiniGui + PostgreSQL

Andrey: Кому будет интересно. https://habrahabr.ru/post/282764/

Ответов - 126, стр: 1 2 3 4 5 6 7 All

Петр: Все понятно: - hbpgsql из поставки MiniGUI; - вызов hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) работает, пользуйтесь и помните о dll hell; - сервер где установлен непонятно, не пингуется на локальной машине и стандартном порте.

Петр: Andrey пишет: А выгружать/убить после этой функции hb_DynCall() - не надо ? Для вызова типа hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) никого убивать не надо. hb_DynCall сама кого хошь убьет

Andrey: Петр пишет: - сервер где установлен непонятно, не пингуется на локальной машине и стандартном порте. Вот так: 80408 - 8.4.8 90407 - 9.4.7 90407 - 9.4.7 cConnInfo is "host = localhost database = test" PQPing( cConnInfo ) returns PQPING_NO_ATTEMPT (connection not attempted (bad params)) cConnInfo is "host = Serv-Test port = 3333" PQPing( cConnInfo ) returns PQPING_NO_ATTEMPT (connection not attempted (bad params)) cConnInfo is "host = Serv-Test hostaddr = 85.137.101.33 port = 5432 connect_timeout = 10" PQPing( cConnInfo ) returns PQPING_OK (server is accepting connections) Спасибо БОЛЬШОЕ Петр !

Andrey: Некоторые тесты сравнения LetoDb и PostgreSql. LetoDb - отправка по 1000 записей за 1 транзакцию, размер буфера транзакции равен 1 660 000 байт. PostgreSql - отправка всех записей за 1 транзакцию, размер буфера транзакции равен размеру файла. Система CentOS, 1Gb ОЗУ, 2Gb HDD ---------------------------------- Файл: 16 Мб, 20 полей, 10 000 записей LetoDb ver 2.15 - 15 транзакции, время копирования на сервер 00:04 (сек.) PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер 00:08 (сек.) Файл: 158 Мб, 20 полей, 100 000 записей LetoDb ver 2.15 - 143 транзакции, время копирования на сервер 00:25 (сек.) PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер НЕТ. Вылет по ошибке. Система Windows 2008 R2, 8Gb ОЗУ, 500Gb HDD ---------------------------------- Файл: 16 Мб, 20 полей, 10 000 записей LetoDb ver 2.15 - 15 транзакции, время копирования на сервер 00:04 (сек.) PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер 00:08 (сек.) Файл: 158 Мб, 20 полей, 100 000 записей LetoDb ver 2.15 - 143 транзакции, время копирования на сервер 00:34 (сек.) PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер 01:22 (сек.)

PSP: Andrey пишет: Некоторые тесты сравнения LetoDb и PostgreSql. Андрей, а скорость канала какая?

Andrey: 50-60 Мб.

PSP: Мне видится это так: когда передача идет порциями, сервер начинает записывать данные на диск по мере закрытия транзакций, не дожидаясь окончания передачи всех. В случае же, когда транзакция одна, сервер (postgre) сначала открывает новую транзакцию в журнале транзакций, накапливает ее (идет запись на диск), а потом, после закрытия клиентом, переписывает данные в основную базу (опять запись на диск). Т.е., идет интенсивное обращение к дисковой системе, растет время очереди диска. Получается, в этом примере postgre "уперся" в производительность диска. Андрей, интересно, какие будут результаты, если на postgre тоже передать кусками.

Петр: Andrey пишет: Система CentOS, 1Gb ОЗУ, 2Gb HDD Это характеристики сервера или клиента? Если сервера - то сервер транзитный, тестовый или рабочий? Кроме скорости копирования, ведь важна и сохранность данных. К сожалению, мы не видим кода и говорить что-то по теме тяжело. Andrey пишет: PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер НЕТ. Вылет по ошибке. Что значит вылет - программа упала или что? Ошибка обрабатывалась? Несколько ссылок по теме, ИМХО Производительность приложений на основе PostgreSQL Транзакции и точки сохранения в PostgreSQL

Andrey: Петр пишет: Система CentOS, 1Gb ОЗУ, 2Gb HDD Это характеристики сервера или клиента? Если сервера - то сервер транзитный, тестовый или рабочий? Это сервер, рабочий - взят в аренду. Прекрасно работает уже лет 5. ЛетоДБ уже года три работает на нем. Поставил туда PostgreSQL для тестирования. Петр пишет: Что значит вылет - программа упала или что? Ошибка обрабатывалась? Ошибка не обрабатывалась. Программа упала при записи ОДНОЙ большой транзакции состоящей из 158 Мб (размер строки). Смотрел по логам, нехватка памяти для PostgreSQL. Т.е. нужно больше оперативки для PostgreSQL, а там всего 1Gb, свободно примерно 500Мб под работу. Это не особо важно, что упала программа. Самое главное что такие данные можно писать в PostgreSQL. Хотя реально такие большие данные сложно представить, да и оперативки сейчас много на серверах. Тесты делал для сравнения с ЛетоДБ и текущими задачами, которые делаю. Получается что ЛетоДБ шустрей будет в таких тестах. А дальше посмотрим. Код выложу, просто ещё тест не доделал до конца. Петр СПАСИБО за статьи !

Andrey: PSP пишет: Андрей, интересно, какие будут результаты, если на postgre тоже передать кусками. Да наверно это лучше будет и по скорости и сервер с маленькой памятью - падать не будет. -------------------- При старте программы открываю базу: conn := PQconnectdb( "dbname="+cDatabase+"host ="+cHost+"user="+cUser+"password = "+cPass+"port=5432" ) Как проверить доступность базы через час/два/и т.д. из программы ? Будет ли правильным следующий код: IF PQstatus( conn ) != CONNECTION_OK MsgStop( "Error connecting to server !") ELSE // запись в базу ! MsgLog(conn, VALTYPE(conn)) // возвращает ->'P' P что за тип такой ? ENDIF Читал про PQstatus здесь https://postgrespro.ru/docs/postgresql/9.5/libpq-status И как сделать PQreset при ошибке ?

Петр: Andrey пишет: MsgLog(conn, VALTYPE(conn)) // возвращает ->'P' P что за тип такой ? Andrey пишет: PSP пишет: цитата: Andrey, pointer - это указатель.

Петр: Andrey пишет: Будет ли правильным следующий код: В чем сомнения? Можно так написать [pre2] IF PQstatus( conn ) == CONNECTION_BAD PQreset( conn ) ENDIF IF PQstatus( conn ) == CONNECTION_OK // запись в базу ! ELSE MsgStop( "Error connecting to server !") ENDIF[/pre2]

Петр: Andrey пишет: Как проверить доступность базы через час/два/и т.д. из программы ? Умеете изъясняться высоким стилем.. из программы ? Программно используя libpq — библиотеку для языка C, hbpqsql — библиотеку для Harbour через час/два/и т.д. ? Используйте таймер. доступность базы? Нет в терминах postgree понятия доступность базы - есть доступность сервера (PQping) и статус соединения (PQstatus), есть PQsocket. После подтвержения статуса соединения можно получить имя базы, с которой установлено соединение (PQdb) В любом случае держать часами открытое соединение я бы не стал. Для периодических задач лучше проверить статус сервера и, в случае доступности, переустановить соединение.

Andrey: Петр пишет: В любом случае держать часами открытое соединение я бы не стал. Для периодических задач лучше проверить статус сервера и, в случае доступности, переустановить соединение. Спасибо ! Понял. Можно ли при получении данных с сервера: oQuery := oServer:Query( "SELECT * FROM " + cTable ) как то и куда то поставить - do events ? А то форма (в другом потоке) замирает и всё... Потом в исходнике tpostgre.prg надо бы исправить METHOD TableStruct( cTable ) CLASS TPQserver строка 344 и ниже, а так же добавить новые типы полей для Харбора : ELSEIF "timestamp" $ cType cType := "C" Как это сделать ? Писать в Github ?

Петр: Andrey пишет: Можно ли при получении данных с сервера: oQuery := oServer:Query( "SELECT * FROM " + cTable ) как то и куда то поставить - do events ? В существующем виде ответ - НЕТ Или перепишите/дополните hbpgsql ( в части см. подключение к серверу баз данных неблокирующим способом), или оптимизируйте ваш запрос, потому, что а) использование * вместо select_list в некоторых кругах считается плохим тоном ; б) обратите внимание на то, что указания LIMIT и OFFSET позволяют получить только часть строк из тех, что выдал остальной запрос Если и у вас в форме отображается 100 строк, зачем вам тащить 1000 (или того больше).

SergKis: Andrey пишет: Потом в исходнике tpostgre.prg надо бы исправить METHOD TableStruct( cTable ) CLASS TPQserver строка 344 и ниже, а так же добавить новые типы полей для Харбора : ELSEIF "timestamp" $ cType cType := "C" Как это сделать ? Писать в Github ? Можно сделать свой клас, наследованный от TPQserver, скопировать (в свой класс) и подправить как нужно METHOD TableStruct( cTable ) В программе вместо TPQserver использовать свой класс.

Петр: Andrey пишет: Как это сделать ? Писать в Github ? Кстати, с почином 2016-09-02 01:58 UTC+0200 Viktor Szakats (vszakats users.noreply.github.com) * contrib/hbpgsql/hbpgsql.hbx * contrib/hbpgsql/postgres.c + add PQlibVersion() -> <nVersion> (returns 0 for pre-9.1 postresql versions) Ref: https://github.com/harbour/core/pull/127/ by @VerchenkoAG

Andrey: Петр пишет: Кстати, с почином Спасибо ! Буду дальше тогда предложения выкладывать... Пока использую библиотеку \MiniGUI\SOURCE\HbPgSql, там сам tpostgre.prg исправил, и очень хорошо и просто собирается libpq.lib - СПАСИБО БОЛЬШОЕ Григорию, об нас всех позаботился !!! В Харборе contrib_hbpgsql - так и не смог собрать. Столкнулся с такой непоняткой. Тестирую работу с базой при отрыве соединения. Т.е. база открыта в Tsbrowse, а потом я отключаю службу на сервере - Postgres. Ну типа внезапный обрыв соединения. После обрыва соединения проверяю доступность коннекта: ? "Ответ сервера при закрытии: ", PQstatus( oServer:pDb() ) IF PQstatus( oServer:pDb() ) == CONNECTION_OK oServer:Commit() ELSE ? "Ошибка сервера :", oServer:ErrorMsg() ENDIF oServer:Destroy() // убить объект Почему PQstatus( oServer:pDb() ) выдаёт 0 (т.е. CONNECTION_OK ) ? Что не так делаю ? А потом сваливается с ошибкой в tpostgre.prg Error BASE/2020 Неверный аргумент: PQRESULTSTATUS</p><BR> Called from PQRESULTSTATUS(0) Called from TPQSERVER:COMMIT(168) res := PQexec( ::pDB, "COMMIT" ) // Строка 167 lError := PQresultStatus( res ) != PGRES_COMMAND_OK // Строка 168 Как в исходнике убрать ошибку или не надо убирать ?

Петр: Andrey пишет: Что не так делаю ? Вам виднее Andrey пишет: А потом сваливается с ошибкой в tpostgre.prg Ошибка в postgres.c Andrey пишет: или не надо убирать ? Надо

Andrey: А как бы использовать функцию PQping у себя ? Или нужно как то затаскивать через те функции которые давали: hLib := hb_libLoad( "libpq.dll" ) ? GetPingResult( hb_DynCall( { "PQping", hLib, HB_DYN_CTYPE_CHAR }, c ) Неудобно уж очень. Подскажите (помогите) сделать пожалуйста эту функцию для tpostgre.prg из MiniGUI\SOURCE\HbPgSql Заранее огромное спасибо !



полная версия страницы