SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Единоличный захват базы клиентом fbclient.dll 4.0.2.2816
Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #817] Wed, 12 October 2022 20:41 Переход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Конфигурация:
сервер:
Windows Server 2012
Firebird 4.0.2.2816 (64-bit,pdb)

клиент (локальный, на том же компьютере-сервере):
fbcient  4.0.2.2816
Java     8.0.2410.7
jna      5.12.1
Jaybird  4.0.6.java8

коннект через Jaybird:
spring.datasource.url:jdbc:firebirdsql:local:testbase?encoding=UTF8
У драйвера JDBC Jaybird есть тип коннекта local, который означает, что связываться с базой следует через локальный сервер по протоколу XNET. Так оно везде замечательно и работало, пока не настал день 4.0.2.2816. Теперь Jaybird, который работает через fbclient.dll, вместо того, чтобы связаться с сервером, сам "захватывает" файл, handle файла базы оказывается во владении процесса java.exe. Если я правильно понимаю, а ля embedded режим. Соответственно, ни сервер, ни какой другой "нормальный" клиент больше подключиться к базе не могут, что очень неприятно. Обходится проблема несложно, путем изменения типа коннекта на localhost, но сам факт!

Еще что интересно. Если перед тем как связываться через Jaybird local, предварительно соединиться с этой базой каким-нибудь другим клиентом, то все проходит замечательно, возникает еще одно столь ожидаемое XNET соединение.

И последнее. Если процессу java.exe вместо fbcient 4.0.2.2816 подсунуть fbcient 4.0.1.2631, то тоже без экцессов. В смысле, c access как раз все хорошо.

И совсем последнее. На другой машине с полностью аналогичной конфигурацией, только вместо Windows Server 2012 там Windows 10, опять-таки такие странные дела не замечены.

Может, дело и не в клиенте вовсе. Но я не понимаю, в чем.
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #818 является ответом на сообщение #817] Wed, 12 October 2022 20:48 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
shalamyansky писал(а) Wed, 12 October 2022 20:41

У драйвера JDBC Jaybird есть тип коннекта local, который означает, что связываться с базой следует через локальный сервер по протоколу XNET.
Так в доке и написано - XNET ? Можно ссылку ?
А может это просто означает коннект через fbclient без указания имени сервера, только с путём к БД ?
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #819 является ответом на сообщение #818] Wed, 12 October 2022 20:58 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
https://firebirdsql.github.io/jaybird-manual/jaybird_manual. html#driver-native-maven

2.2.2. NATIVE and LOCAL types
The NATIVE and LOCAL types (JDBC Type 2) use a JNA proxy to access the Firebird client library and requires installation of the Firebird client. The NATIVE driver type is used to access the remote database server, the LOCAL type accesses the database server running on the same host by means of IPC (Inter-Process Communication). Performance of NATIVE driver is approximately 10% lower compared to the PURE_JAVA driver, but LOCAL type has up to 30% higher performance compared to the PURE_JAVA driver when connecting the server on the same host. This is mostly due to the fact that TCP/IP stack is not involved in this mode.

To create a connection using the NATIVE JDBC driver to connect to a remote server you have to use the following JDBC URL with the native subprotocol:

jdbc:firebirdsql:native:host[/port]:<path to database>
When connecting to a local database server using the LOCAL driver, you should use following:

jdbc:firebirdsql:local:<absolute path to database>
In addition to Jaybird, this requires a native Firebird client library, and JNA 5.5.0 needs to be on the classpath.
---------------------------------------

Тут нет слова XNET, зато есть слова IPC (Inter-Process Communication), что я и истолковывал в пользу XNET в данном случае. Но самое главное, всегда раньше и сейчас в хороших случаях при соединении посредством Jaybird:local я в rdb$attachments вижу соединение XNET. Аж 10 XNET, которые создает пул Spring'а.

[Обновления: Wed, 12 October 2022 21:12]

Известить модератора

Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #820 является ответом на сообщение #819] Wed, 12 October 2022 22:43 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
Не надо "истолковывать". Нужно просто понимать что такое "локальный" коннект, что изменилось начиная с fb3, и где у него теперь embedded, а где XNET.

Если embedded "вредит" - пиши в строке коннекта явно xnet://, или localhost:, или не давай клиента из полного комплека сервера.
Вариантов - на любой вкус.
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #821 является ответом на сообщение #820] Wed, 12 October 2022 23:58 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Понимать - это хорошо. Я вот понимаю, что не очень понимаю, но не понимаю, что бы прочитать, чтобы понимать. XNET (как я сейчас понимаю) - это связь клиентского процесса с процессом сервера посредством неких механизмов IPC (возможно, pipes). Embedded (как я сейчас понимаю) - это загрузка движка сервера в клиентский процесс. Но я точно не понимаю, в каких вызовах должно обязательно происходить одно, а в каких - другое, особенно если это вызовы через промежуточный драйвер.

localhost - можно, конечно, так сейчас и сделал, но это уход на TCP, теряется прелесть IPC.
xnet:// - не знаю, примет ли Jaybird такую строку, попробую. Это было бы хорошо.
"Не давай клиента из полного комплекта сервера" - вот это точно не понял. А какого надо давать? В смысле - надо давать отдельно стоящего, чтобы он конфигурации не видел? Да, возможно именно это поможет.

Спасибо за советы! Буду пробовать.

Но вообще-то сама ситуация странная. Ходишь, ходишь в школу, а потом - бац, вторая смена...
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #822 является ответом на сообщение #821] Thu, 13 October 2022 00:39 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
Для начала - Quick Start Guide и Release Notes для тройки. Developer's Guide тоже не повредит.
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #823 является ответом на сообщение #821] Thu, 13 October 2022 09:50 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Цитата:
localhost - можно, конечно, так сейчас и сделал, но это уход на TCP, теряется прелесть IPC.
А в чём прелесть IPC? Только в том что он якобы на 30% быстрее? Не факт, надо у себя мерить. Напомню, что xnet работает только под windows

Учитывая, что Jaybird написана на Java и призвана работать на любой платформе, я бы остерегался использовать что-то другое кроме inet

Цитата:
XNET (как я сейчас понимаю) - это связь клиентского процесса с процессом сервера посредством неких механизмов IPC (возможно, pipes).
Правильно, кроме pipes. Оно отношение к xnet не имеет, это уже wnet.

З.Ы. Это изменилось не в 4.0.2. Такое поведение ещё с Firebird 3.0. Просто раньше вам везло, вероятно на момент подключения Jaybird уже существовал другой коннект к БД.

1. Попробовать явно указать префикс xnet://
2. Поменять в firebird.conf/database.conf порядок провайдеров

Providers = Remote,Loopback,Engine13
2 применять только если 1ый не прокатит. А ещё можно спросить у автора Jaybird разъяснения
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #828 является ответом на сообщение #821] Thu, 13 October 2022 13:26 Переход к предыдущему сообщениюПереход к следующему сообщению
kdv в настоящее время не в онлайне  kdv
Сообщений: 98
Зарегистрирован: June 2022
Member
Ты просто пропустил этот момент, не интересовался, раз не надо было.
Embedded с 1.5 по 2.5 был "фиксированным", то супер, то суперклассик.
А в 3.0 это определяется режимом ServerMode в конфиге.
И, если он у тебя выставлен в SuperServer, то конечно ты наступаешь на грабли (после 2.5), имея в мечтах какой-то xnet - Суперсервер монопольно блокирует файл БД, и ембеддед там или что - два экземпляра сервера не могут работать с одной БД.
Xnet в 3.0, конечно, есть, но он должен быть явно указан как протокол в строке коннекта.

А вот если бы ты использовал ServerMode = SuperClassic или Classic, то ты бы и не заметил, embedded там или что. Но по умолчанию-то SuperServer...
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #829 является ответом на сообщение #828] Thu, 13 October 2022 18:54 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Почитал "Firebird 3 Quick Start Guide", помогло.

Upon receiving a local connection string, the Firebird client will first attempt to make a direct, embedded connection to the database file, bypassing authentication but respecting the SQL privileges and restrictions of the supplied user and/or role name. That is, if the Engine12 provider is enabled in firebird.conf or databases.conf — which it is by default. If the database file exists, but the connection fails because the client process doesn’t have the required access privileges to the file, a client-server connection is attempted (by the Loopback provider), in this order...

И есть даже целый раздел Disable embedded connections. Но для того, чтобы что-то отключить, надо хотя бы иметь догадку, что это что-то существует или может возникнуть. Не, ну получив граблями по лбу, что-то начинаешь подозревать. Оказывается (sic!), что fbclient.dll - не просто модуль для соединения с сервером, а очень хитрая программа, которая при одном и том же вызове может вести себя очень по-разному в зависимости от состояния файла базы и от того, где сама находится. Не просто работает / не работает, а работает одним образом / работает совершенно иным образом.

У меня же ситуация оказалась тривиальной, и версия сервера, конечно, была не причем. При обновлениях версий Firebird и я кидаю новые клиенты нужных разрядностей в System32 и SysWOW64 соответственно. В этот же раз рука или голова дернулась, и в System32 оказалась 32-разрядная fbclient.dll. После чего события предположительно развивались так: при загрузке Java-сервиса JDBC драйвер находит в System32 fbclient.dll, пытается загрузить, бракует (не та разрядность!), идет дальше по путям, находит в путях папку Firebird c fbclient.dll, грузит, и вуаля, embedded режим.

Всем спасибо, узнал много нового!

P.S.
После некоторого числа экспериментов нашел, что работает такой вызов:

jaybird:local:xnet://testdb

Теперь я дважды спасен от embedded!

[Обновления: Thu, 13 October 2022 19:33]

Известить модератора

Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #830 является ответом на сообщение #829] Thu, 13 October 2022 19:22 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Цитата:
А вот если бы ты использовал ServerMode = SuperClassic или Classic, то ты бы и не заметил, embedded там или что. Но по умолчанию-то SuperServer...
Лично мне кажется естественным и нормальным, когда сервер (как процесс) один-единственный, и доступ к файлам баз имеет только он. Интуитивно ожидается, что будет так. И когда внезапно оказывается, что это так не всегда, ситуация застает врасплох.

Похожая история была у меня с gbak. Казалось бы, утилита архивирования из комплекта сервера должна для манипуляций с базой обращаться собственно к этому серверу. Ан нет, она сама захватывает файл базы, закрывая доступ всем прочим желающим пообщаться с базой. А чтобы бэкап работал именно через сервер, не блокируя работу всех остальных, оказывается, надо произнести волшебное слово service_mgr. ИМХО, неочевидно. Но, наступив в очередной раз на грабли, запоминаешь, конечно.
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #834 является ответом на сообщение #830] Fri, 14 October 2022 00:40 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
Ты умудрился наступить на одни и те же грабли дважды. gbak ничем не отличается от любого другого клиентского приложения и, внезапно, тоже работает через Y-valve (AKA fbclient.dll), который для доступа к серверу использует конфигурируемый список плагинов, как и написано в процитированной тобою документации для тех, кто Firebird видит первый раз в жизни. И нет, "service_mgr" не магия дружбы, он тоже способен использовать Embedded движок.
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #835 является ответом на сообщение #834] Fri, 14 October 2022 15:38 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Если вы неоднократно получили граблями по лбу, можно сделать два не исключающих друг друга вывода:

1. У вас нет привычек внимательно смотреть под ноги и делать правильные выводы.

2. Кто-то регулярно заботливо раскладывает грабли на дороге.

Если у вас паранойя, это еще не значит, что за вами никто не следит.
Предыдущая тема: .NET EF + Firebird + VS2022
Следующая тема: XNET vs WNET
Переход к форуму:
  


Текущее время: Sun Dec 22 14:42:47 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01368 секунд