Начало » Использование СУБД » Firebird, HQbird, InterBase » Единоличный захват базы клиентом fbclient.dll 4.0.2.2816
Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #817] |
Wed, 12 October 2022 20:41 |
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 [сообщение #819 является ответом на сообщение #818] |
Wed, 12 October 2022 20:58 |
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 [сообщение #821 является ответом на сообщение #820] |
Wed, 12 October 2022 23:58 |
shalamyansky
Сообщений: 150 Зарегистрирован: August 2022
|
Senior Member |
|
|
Понимать - это хорошо. Я вот понимаю, что не очень понимаю, но не понимаю, что бы прочитать, чтобы понимать. XNET (как я сейчас понимаю) - это связь клиентского процесса с процессом сервера посредством неких механизмов IPC (возможно, pipes). Embedded (как я сейчас понимаю) - это загрузка движка сервера в клиентский процесс. Но я точно не понимаю, в каких вызовах должно обязательно происходить одно, а в каких - другое, особенно если это вызовы через промежуточный драйвер.
localhost - можно, конечно, так сейчас и сделал, но это уход на TCP, теряется прелесть IPC.
xnet:// - не знаю, примет ли Jaybird такую строку, попробую. Это было бы хорошо.
"Не давай клиента из полного комплекта сервера" - вот это точно не понял. А какого надо давать? В смысле - надо давать отдельно стоящего, чтобы он конфигурации не видел? Да, возможно именно это поможет.
Спасибо за советы! Буду пробовать.
Но вообще-то сама ситуация странная. Ходишь, ходишь в школу, а потом - бац, вторая смена...
|
|
|
|
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #823 является ответом на сообщение #821] |
Thu, 13 October 2022 09:50 |
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
Сообщений: 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
Сообщений: 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
Сообщений: 150 Зарегистрирован: August 2022
|
Senior Member |
|
|
Цитата:А вот если бы ты использовал ServerMode = SuperClassic или Classic, то ты бы и не заметил, embedded там или что. Но по умолчанию-то SuperServer...
Лично мне кажется естественным и нормальным, когда сервер (как процесс) один-единственный, и доступ к файлам баз имеет только он. Интуитивно ожидается, что будет так. И когда внезапно оказывается, что это так не всегда, ситуация застает врасплох.
Похожая история была у меня с gbak. Казалось бы, утилита архивирования из комплекта сервера должна для манипуляций с базой обращаться собственно к этому серверу. Ан нет, она сама захватывает файл базы, закрывая доступ всем прочим желающим пообщаться с базой. А чтобы бэкап работал именно через сервер, не блокируя работу всех остальных, оказывается, надо произнести волшебное слово service_mgr. ИМХО, неочевидно. Но, наступив в очередной раз на грабли, запоминаешь, конечно.
|
|
|
|
Re: Единоличный захват базы клиентом fbclient.dll 4.0.2.2816 [сообщение #835 является ответом на сообщение #834] |
Fri, 14 October 2022 15:38 |
shalamyansky
Сообщений: 150 Зарегистрирован: August 2022
|
Senior Member |
|
|
Если вы неоднократно получили граблями по лбу, можно сделать два не исключающих друг друга вывода:
1. У вас нет привычек внимательно смотреть под ноги и делать правильные выводы.
2. Кто-то регулярно заботливо раскладывает грабли на дороге.
Если у вас паранойя, это еще не значит, что за вами никто не следит.
|
|
|
Переход к форуму:
Текущее время: Sun Dec 22 20:35:16 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00791 секунд
|