powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как с помомощью jdbc передавать double в бинарном виде
25 сообщений из 37, страница 1 из 2
как с помомощью jdbc передавать double в бинарном виде
    #33531941
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi all.
Есть клиент на жабе, общается с базой по jdbc, на базе есть таблица с колонкой типа float8, есть переменная типа double. Хочу одно в переслать в другое без промежуточного преобразования в текст (а то потеря точности и вобще непредсказуемые последствия). как сделать?
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33532387
vfbar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jdbc prepare statement там все должно быть
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33532426
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да я знаю, а есть уверенность что соотвествующий set, в данном случае setDouble, просто не конвертнёт это в стринг?
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33532705
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
думаю можно не заморачиваться как это устроенно внутри (если очень хочется можно скачать исходники и глянуть я глянул увидел то что ожидал) :-)

когда sql запрс пишите не боитесь что сработает что нибудь не так? вот и я о томже
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33534272
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
где там конкретно глятеть то? если не секрет?
А что до sql запросов то всё достаточно хорошо документированно, а про этот момент вообще ни чего.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33534504
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
господа вот нащёл в libpq функцию

PQexecParams
Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text.

PGresult *PQexecParams(PGconn *conn,
const char *command,
int nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);

PQexecParams is like PQexec, but offers additional functionality: parameter values can be specified separately from the command string proper, and query results can be requested in either text or binary format.

насколько я понимаю она делает то что мне надо, но есть ли тоже самое на jdbc??????
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33544926
Безон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdbc может работать удаленно с одного компа на другой. и у этих двух компов может быть например разный ордер битов. Так что это правильно конвертировать из бинарника в инвариантное предстваление (строку) а затем обратно.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33545508
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безон Так что это правильно конвертировать из бинарника в инвариантное предстваление (строку) а затем обратно.вот только "это может быть правильно, в случае сохранения точности при конверсии". ибо конвертируемая величина может быть и ключевой. и потом какакя ля ля сказала, что идиотская строка десятиричного представления - это и есть то самое искомое инвариантное пердставление? давайте найдем этого урода и ввалим
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33545952
Безон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 Безон Так что это правильно конвертировать из бинарника в инвариантное предстваление (строку) а затем обратно.вот только "это может быть правильно, в случае сохранения точности при конверсии". ибо конвертируемая величина может быть и ключевой. и потом какакя ля ля сказала, что идиотская строка десятиричного представления - это и есть то самое искомое инвариантное пердставление? давайте найдем этого урода и ввалим
ломак спорить, давайте завалим того кто придумал точность для дабла 10 в -16. Используйте другое представление для хранения важного значения. Почему то погрешности джавы никого не волнуют
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33546007
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безондавайте завалим того кто придумал точность для дабла 10 в -16.а вот это без меня. на хлюпости я не писался.

есть простая задача - клиент должен апдейтить запись. пусь клиент знает ключевое поле, но знает его с потерей точности. как ему отапдейтить запись?

(пока единственный выход - иметь ключи с типом, для которого драйвер не теярет точности). т.е. на литце ограничение на структуру БД, накладываемое руками дровописца.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33550082
Фотография Иман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпока единственный выход - иметь ключи с типом, для которого драйвер не теярет точностиподписался. потому как по молодости и глупности однажды сделал таблицу с PK типа флоат. очень долго мучился
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33551795
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Безонjdbc может работать удаленно с одного компа на другой. и у этих двух компов может быть например разный ордер битов. Так что это правильно конвертировать из бинарника в инвариантное предстваление (строку) а затем обратно.

В постгресе при создании пользовательского типа (ну и соотвественно для встроенных уже есть), нужно задавать функции конвертации из внутренего текстового представления и обратно, и из бинарного представления в сети во внутреннее бинарное представление и обратно. см CREATE TYPE. Так что с этим вопросом там всё правильно проработано. Просто для JDBC ещё не реализованно.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33552583
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если читать внимательно то написано следующее

авторinput_function
The name of a function that converts data from the type's external textual form to its internal form.

output_function
The name of a function that converts data from the type's internal form to its external textual form.

те я могу передать в базу только строчки на входе и получить строчку на выходе, а внутри происходит конверт данных (если не верите то посмотрите примеры на С в конце страници про создание типов есть ссылка)

и я никак немогу понять чего не реализовано в ЖДБЦ??? база на входе имеет стринг и ЖДБЦ работает с базой только через сетевой порт и отсылает ей стринг (вернее массив байтов из которого можно получить стринг).

Если использовать prepare то происходит кеширование плана выполнения запроса (реализованно с помощью встроенного в постгрес prepare http://www.postgresql.org/docs/8.0/interactive/sql-prepare.html) это раз и второе можно упростить проверку неправельных данных отсылаемых серверу на клиенте.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33552666
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я роюсь в доке и не могу вообще найти примера или намека как запихнуть в базу НЕТЕКСТОВЫЕ данные даже через либпэку

может многоуважаемый stuav покажет где он видел подобные примеры? то что приведенно в начале треда тоже запихивает в базу стринги const char * const *paramValues
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33552698
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага нашел это называется The Fast-Path Interface

http://www.postgresql.org/docs/8.0/interactive/libpq-fastpath.html

и делать это насколько я понял можно только с сервера (ну впринципе понятно почему именно так)
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33554562
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vfabrя роюсь в доке и не могу вообще найти примера или намека как запихнуть в базу НЕТЕКСТОВЫЕ данные даже через либпэку

может многоуважаемый stuav покажет где он видел подобные примеры? то что приведенно в начале треда тоже запихивает в базу стринги const char * const *paramValues

смотри http://www.postgresql.org/docs/8.1/interactive/sql-createtype.html
функции RECEIVE, SEND.

The optional receive_function converts the type's external binary representation to the internal representation. If this function is not supplied, the type cannot participate in binary input. The binary representation should be chosen to be cheap to convert to internal form, while being reasonably portable. (For example, the standard integer data types use network byte order as the external binary representation, while the internal representation is in the machine's native byte order.) The receive function should perform adequate checking to ensure that the value is valid. The receive function may be declared as taking one argument of type internal, or as taking three arguments of types internal, oid, integer. The first argument is a pointer to a StringInfo buffer holding the received byte string; the optional arguments are the same as for the text input function. The receive function must return a value of the data type itself. Similarly, the optional send_function converts from the internal representation to the external binary representation. If this function is not supplied, the type cannot participate in binary output. The send function must be declared as taking one argument of the new data type. The send function must return type bytea.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33554694
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторOptionally, a user-defined type can provide binary input and output routines. Binary I/O is normally faster but less portable than textual I/O. As with textual I/O, it is up to you to define exactly what the external binary representation is. Most of the built-in data types try to provide a machine-independent binary representation. For complex, we will piggy-back on the binary I/O converters for type float8:

1) обычно быстрее, но менее кросплатформенно (сами понимаете что фишка джавы именно в этом)
2) большинство (а не все!!!) встроенных типов старается предоставить ... (см. пункт первый)

в ЖДБЦ этого скорее всего никогда не реализуют потому что джава платформонезависима это действительно так, это действительно важно, и это действительно очень нужно (спорить на эту тему надо в другом форуме :-) )

так что думаю вопрос исчерпан и тему можно закрывать

спасибо stuav за то что предоставили такую замечательную возможность с вами подискутировать.

ИТОГО:
- ЖДБЦ использует тексовое представление данных при передаче в силу сохранения своей кросплатформенности (и скорее всего никогда не будет реализованна возможность передавать данные в бинарном виде)
- в топике где ЖДБЦ был обвинен в ошибке передачи точности виноват был не ЖДБЦ а неправильно выбранный разработчиком примера тип данных колонки float4 который имеет точность 6 знаков и в который пытались положить число 1.9000001 в итоге постгрес обрезал его до 1.9
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555052
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Реальзованно это будет и это 100%
Посмотри драйвера от других баз, как коммерческих так и свободных.

А платвормо зависимость здесь очень слабая, всего навсего идёт речь о Big endian byte или Little endian byte. Процессоры в которых используются модели бинарного представления чисел с плавающей точкой отличной от IEEE я не знаю, а если и есть такие то там врядли когда нить будет джава реализована, а если будет то этот вакт учтут. Ну и я уж не говорю о формате целого числа.

Порядок байт можно перевернуть средствами самой джавы смотри Long.reverseBytes. Ну и навярняка как нить можно узнать средствами той же джавы соотвествует ли порядок на текущей машине Native network order или нет. Да и в конце концов это всё таки реализованно в очень многих СУБД.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555404
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в каких свободных базах это реализованно?
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555419
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HSQLDB, Firebird - это то с чем я работал.
Этого просто в документации не пишут почему то, надо в исходниках ковыряться или эксперимент ставить.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555443
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да естественно имелся в виду серверный режим СУБД а не embedded.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555745
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока [ , RECEIVE = receive_function ] находится в квадратных скобках эту возможность скорее всего не реализуют
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TYPE name (
    INPUT = input_function,
    OUTPUT = output_function
    [ , RECEIVE = receive_function ]
    [ , SEND = send_function ]
    [ , ANALYZE = analyze_function ]
    [ , INTERNALLENGTH = { internallength | VARIABLE } ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = alignment ]
    [ , STORAGE = storage ]
    [ , DEFAULT = default ]
    [ , ELEMENT = element ]
    [ , DELIMITER = delimiter ]
)
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555788
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и еще посмотрите как Вам придется конвертить джавой данные в вид который необходим вашей платформе (то бишь процу) и операционке например тот же самый дабл

выигрыш в скорости весьма неочевиден (выигрыша в точности не будет как мы выяснили и тот и другой способ работают одинаково хорошо :-) )
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33555829
stuav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
квадратные скобки всего лишь означают что это не обязательный параметр.

А как конвертить я уже говорил см: Long.reverseBytes, Double.doubleToRawLongBits, Double.longBitsToDouble, Float.floatToRawIntBits,Float.intBitsToFloat. Как это состыковать думаю догадаться не трудно.

Что до выигрыша в скорости, я думаю раз в 20 минимум, байты местами процессору переставить значительно быстрее чем конвертировать в десятичное представление, там же около сотни арифметических операций на одно число.
...
Рейтинг: 0 / 0
как с помомощью jdbc передавать double в бинарном виде
    #33556273
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторквадратные скобки всего лишь означают что это не обязательный параметр.
правильно не обязательный соответственно драйвера с большой вероятностью могут неработать потому что он напросто может быть не реализован. Для борьбы с этим придется менять/совершенствовать драйвера, серверную часть ну и тп.

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

грубая схема прохождения запроса
1) (запрос) ->
2) (передача данных по сети) ->
3) (парсинг запросов) ->
4) (выполнение запросов) ->
5) (результат) ...

ну будут у Вас в 20 раз (в чем я сомневаюсь) быстрее конвертится данные пункт 3) в схеме, а какой суммарный выигрыш получится на селектах, инсертах, апдейтах? как Вы себе представляете процентное соотношение в выигрыше производительности этих блоков?

Единтсвенное более менее ускорение будет при инсертах, а теперь прикинте на сколько увеличится сложность драйверов, серверной части и сколько потребуется времени на переделки и доделки.

ЖДБЦ работают и разработанны именно под базу. Они работают нормально и стабильно. Если Вам не подходит база тогда ее надо менять. В бесплатном сегменте аналогов имхо нет. Комерческие продукты ну там может быть все что угодно но за это надо платить.

я просто за то чтобы человек который случайно или неслучайно попал на этот форум не прочел Ваши категоричные заявления о том что все плохо которые зачастую основанны на ошибках. Скорее всего Вами неправильно выбранна платформа реализации, а не СУБД.
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как с помомощью jdbc передавать double в бинарном виде
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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