Автор | Сообщение |
|
| постоянный участник
|
Пост N: 4890
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.05.16 14:39. Заголовок: MiniGui + PostgreSQL
|
|
|
Ответов - 133
, стр:
1
2
3
4
5
6
7
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1266
Зарегистрирован: 09.10.06
|
|
Отправлено: 21.08.16 15:26. Заголовок: Все понятно: - hbpgs..
Все понятно: - hbpgsql из поставки MiniGUI; - вызов hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) работает, пользуйтесь и помните о dll hell; - сервер где установлен непонятно, не пингуется на локальной машине и стандартном порте.
|
|
|
|
| постоянный участник
|
Пост N: 1267
Зарегистрирован: 09.10.06
|
|
Отправлено: 21.08.16 15:29. Заголовок: Andrey пишет: А выг..
Andrey пишет: цитата: | А выгружать/убить после этой функции hb_DynCall() - не надо ? |
| Для вызова типа hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) никого убивать не надо. hb_DynCall сама кого хошь убьет
|
|
|
|
| постоянный участник
|
Пост N: 5055
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.08.16 15:54. Заголовок: Петр пишет: - серве..
Петр пишет: цитата: | - сервер где установлен непонятно, не пингуется на локальной машине и стандартном порте. |
| Вот так: 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) Спасибо БОЛЬШОЕ Петр !
|
|
|
|
| постоянный участник
|
Пост N: 5058
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.08.16 00:09. Заголовок: Некоторые тесты срав..
Некоторые тесты сравнения 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 (сек.)
|
|
|
|
| постоянный участник
|
Пост N: 1259
Зарегистрирован: 27.01.07
|
|
Отправлено: 25.08.16 16:42. Заголовок: Andrey пишет: Некот..
Andrey пишет: цитата: | Некоторые тесты сравнения LetoDb и PostgreSql. |
| Андрей, а скорость канала какая?
|
|
|
|
| постоянный участник
|
Пост N: 5059
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.08.16 17:18. Заголовок: 50-60 Мб...
50-60 Мб.
|
|
|
|
| постоянный участник
|
Пост N: 1260
Зарегистрирован: 27.01.07
|
|
Отправлено: 25.08.16 17:32. Заголовок: Мне видится это так:..
Мне видится это так: когда передача идет порциями, сервер начинает записывать данные на диск по мере закрытия транзакций, не дожидаясь окончания передачи всех. В случае же, когда транзакция одна, сервер (postgre) сначала открывает новую транзакцию в журнале транзакций, накапливает ее (идет запись на диск), а потом, после закрытия клиентом, переписывает данные в основную базу (опять запись на диск). Т.е., идет интенсивное обращение к дисковой системе, растет время очереди диска. Получается, в этом примере postgre "уперся" в производительность диска. Андрей, интересно, какие будут результаты, если на postgre тоже передать кусками.
|
|
|
|
| постоянный участник
|
Пост N: 1269
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.08.16 19:43. Заголовок: Andrey пишет: Систе..
Andrey пишет: цитата: | Система CentOS, 1Gb ОЗУ, 2Gb HDD |
| Это характеристики сервера или клиента? Если сервера - то сервер транзитный, тестовый или рабочий? Кроме скорости копирования, ведь важна и сохранность данных. К сожалению, мы не видим кода и говорить что-то по теме тяжело. Andrey пишет: цитата: | PostgreSql ver 9.4.7 - 1 транзакция, время копирования на сервер НЕТ. Вылет по ошибке. |
| Что значит вылет - программа упала или что? Ошибка обрабатывалась? Несколько ссылок по теме, ИМХО Производительность приложений на основе PostgreSQL Транзакции и точки сохранения в PostgreSQL
|
|
|
|
| постоянный участник
|
Пост N: 5060
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.08.16 17:19. Заголовок: Петр пишет: Система..
Петр пишет: цитата: | Система CentOS, 1Gb ОЗУ, 2Gb HDD Это характеристики сервера или клиента? Если сервера - то сервер транзитный, тестовый или рабочий? |
| Это сервер, рабочий - взят в аренду. Прекрасно работает уже лет 5. ЛетоДБ уже года три работает на нем. Поставил туда PostgreSQL для тестирования. Петр пишет: цитата: | Что значит вылет - программа упала или что? Ошибка обрабатывалась? |
| Ошибка не обрабатывалась. Программа упала при записи ОДНОЙ большой транзакции состоящей из 158 Мб (размер строки). Смотрел по логам, нехватка памяти для PostgreSQL. Т.е. нужно больше оперативки для PostgreSQL, а там всего 1Gb, свободно примерно 500Мб под работу. Это не особо важно, что упала программа. Самое главное что такие данные можно писать в PostgreSQL. Хотя реально такие большие данные сложно представить, да и оперативки сейчас много на серверах. Тесты делал для сравнения с ЛетоДБ и текущими задачами, которые делаю. Получается что ЛетоДБ шустрей будет в таких тестах. А дальше посмотрим. Код выложу, просто ещё тест не доделал до конца. Петр СПАСИБО за статьи !
|
|
|
|
| постоянный участник
|
Пост N: 5063
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.08.16 03:33. Заголовок: При старте программы..
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 при ошибке ?
|
|
|
|
| постоянный участник
|
Пост N: 1270
Зарегистрирован: 09.10.06
|
|
Отправлено: 31.08.16 07:15. Заголовок: Andrey пишет: MsgLo..
Andrey пишет: цитата: | MsgLog(conn, VALTYPE(conn)) // возвращает ->'P' P что за тип такой ? |
| Andrey пишет: цитата: | PSP пишет: цитата: Andrey, pointer - это указатель. |
|
|
|
|
|
|
| постоянный участник
|
Пост N: 1271
Зарегистрирован: 09.10.06
|
|
Отправлено: 31.08.16 07:54. Заголовок: Andrey пишет: Будет..
Andrey пишет: цитата: | Будет ли правильным следующий код: |
| В чем сомнения? Можно так написать цитата: | IF PQstatus( conn ) == CONNECTION_BAD PQreset( conn ) ENDIF IF PQstatus( conn ) == CONNECTION_OK // запись в базу ! ELSE MsgStop( "Error connecting to server !") ENDIF |
|
|
|
|
|
| постоянный участник
|
Пост N: 1272
Зарегистрирован: 09.10.06
|
|
Отправлено: 31.08.16 08:32. Заголовок: Andrey пишет: Как п..
Andrey пишет: цитата: | Как проверить доступность базы через час/два/и т.д. из программы ? |
| Умеете изъясняться высоким стилем.. из программы ? Программно используя libpq — библиотеку для языка C, hbpqsql — библиотеку для Harbour через час/два/и т.д. ? Используйте таймер. доступность базы? Нет в терминах postgree понятия доступность базы - есть доступность сервера (PQping) и статус соединения (PQstatus), есть PQsocket. После подтвержения статуса соединения можно получить имя базы, с которой установлено соединение (PQdb) В любом случае держать часами открытое соединение я бы не стал. Для периодических задач лучше проверить статус сервера и, в случае доступности, переустановить соединение.
|
|
|
|
| постоянный участник
|
Пост N: 5071
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.09.16 01:45. Заголовок: Петр пишет: В любом..
Петр пишет: цитата: | В любом случае держать часами открытое соединение я бы не стал. Для периодических задач лучше проверить статус сервера и, в случае доступности, переустановить соединение. |
| Спасибо ! Понял. Можно ли при получении данных с сервера: oQuery := oServer:Query( "SELECT * FROM " + cTable ) как то и куда то поставить - do events ? А то форма (в другом потоке) замирает и всё... Потом в исходнике tpostgre.prg надо бы исправить METHOD TableStruct( cTable ) CLASS TPQserver строка 344 и ниже, а так же добавить новые типы полей для Харбора : ELSEIF "timestamp" $ cType cType := "C" Как это сделать ? Писать в Github ?
|
|
|
|
| постоянный участник
|
Пост N: 1275
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.09.16 12:13. Заголовок: Andrey пишет: Можно..
Andrey пишет: цитата: | Можно ли при получении данных с сервера: oQuery := oServer:Query( "SELECT * FROM " + cTable ) как то и куда то поставить - do events ? |
| В существующем виде ответ - НЕТ Или перепишите/дополните hbpgsql ( в части см. подключение к серверу баз данных неблокирующим способом), или оптимизируйте ваш запрос, потому, что а) использование * вместо select_list в некоторых кругах считается плохим тоном ; б) обратите внимание на то, что указания LIMIT и OFFSET позволяют получить только часть строк из тех, что выдал остальной запрос Если и у вас в форме отображается 100 строк, зачем вам тащить 1000 (или того больше).
|
|
|
|
| постоянный участник
|
Пост N: 1202
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.09.16 12:38. Заголовок: Andrey пишет: Потом ..
Andrey пишет: цитата: | Потом в исходнике tpostgre.prg надо бы исправить METHOD TableStruct( cTable ) CLASS TPQserver строка 344 и ниже, а так же добавить новые типы полей для Харбора : ELSEIF "timestamp" $ cType cType := "C" Как это сделать ? Писать в Github ? |
| Можно сделать свой клас, наследованный от TPQserver, скопировать (в свой класс) и подправить как нужно METHOD TableStruct( cTable ) В программе вместо TPQserver использовать свой класс.
|
|
|
|
| постоянный участник
|
Пост N: 1277
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.09.16 17:59. Заголовок: Andrey пишет: Как э..
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 |
|
|
|
|
|
| постоянный участник
|
Пост N: 5073
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.09.16 19:59. Заголовок: Петр пишет: Кстати,..
Петр пишет: Спасибо ! Буду дальше тогда предложения выкладывать... Пока использую библиотеку \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 Как в исходнике убрать ошибку или не надо убирать ?
|
|
|
|
| постоянный участник
|
Пост N: 1278
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.09.16 22:13. Заголовок: Andrey пишет: Что н..
Andrey пишет: Вам виднее Andrey пишет: цитата: | А потом сваливается с ошибкой в tpostgre.prg |
|
Ошибка в postgres.c Andrey пишет: Надо
|
|
|
|
| постоянный участник
|
Пост N: 5075
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.09.16 15:39. Заголовок: А как бы использоват..
А как бы использовать функцию PQping у себя ? Или нужно как то затаскивать через те функции которые давали: hLib := hb_libLoad( "libpq.dll" ) ? GetPingResult( hb_DynCall( { "PQping", hLib, HB_DYN_CTYPE_CHAR }, c ) Неудобно уж очень. Подскажите (помогите) сделать пожалуйста эту функцию для tpostgre.prg из MiniGUI\SOURCE\HbPgSql Заранее огромное спасибо !
|
|
|
Ответов - 133
, стр:
1
2
3
4
5
6
7
All
[только новые]
|
|