powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
25 сообщений из 87, страница 3 из 4
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39314565
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devВот как-то так:
...
Спасибо за пример, я и сам уже попробовал такой вариант, он не работает. Соединение в отдельном потоке/процессе, после запуска процедуры shutdown, не создаётся пока shutdown не завершится.. Попытка создать соединение раньше - не помогает..
Но зато, думаю, заработает вариант с поочерёдным запуском shutdown'а с нулевым таймаутом и запроса закрывающего соединения, и так до победного конца.. кривовато, конечно..
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39314569
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladЕсс-но. Оно же всё в одном потоке.
У тебя в примере нет никаких
vitkudклиентов, которые хотят "добровольно" закрыть все свои соединения (если их больше одного).Ибо кроме gfix'а есть ровно один клиент, который что-то там хочет.
в моём описании "их" относилось к соединениям, т.е. несколько клиентов с несколькими соединениями в каждом. А для примера достаточно одного клиента с несколькими соединениями.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39314576
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkud,

ты противоречишь сам себе.
Сначала говоришь про много соединений (неважно, сколько процессов на клиенте их создаёт).
В коде твоём нет "много соединений", они создаются и уничтожаются по-одному, последовательно.
Далее, опция -att не убивает текущие коннекты, в отличие от -force.
Если приспичило пользовать именно -att, сделай сначала DELETE FROM MON$ATTACHMENT в любом коннекте.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39314584
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladПроверил с isql:
запустил 3 штуки isql

isql работает с одним соединением одновременно, а вот если например в IBExpert'е зарегистрировать дважды одну базу и открыть обе...
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39314632
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkudisql работает с одним соединением одновременно, а вот если например в IBExpert'е зарегистрировать дважды одну базу и открыть обе...У тебя что, однопоточное приложение обслуживает сотню коннектов ?
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39314744
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkudСпасибо за пример, я и сам уже попробовал такой вариант, он не работает. Соединение в отдельном потоке/процессе, после запуска процедуры shutdown, не создаётся пока shutdown не завершится..У меня в isql от имени SYSDBA соединение прекрасно создается после "-shut -attach" и скрипт дропает подключения в соответствии с условием в предложении WHERE.
Если вы пишите какой-то высоконагруженный сервер, для которого необходим пул соединений и очень хотите, чтобы сервер сам закрывал свои соединения с базой, создайте отдельно службу управления базой/сервером FB с которой ваш высоконагруженный сервер будет держать соединение и получать от этой службы указания в том числе и на закрытие всех соединений.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315449
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladУ тебя что, однопоточное приложение обслуживает сотню коннектов ?
Почему сразу однопоточное? Потоков несколько, но пул соединений закрывается в одном.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315458
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devУ меня в isql от имени SYSDBA соединение прекрасно создается после "-shut -attach" и скрипт дропает подключения в соответствии с условием в предложении WHERE.
в смысле после неудачного выполнения "-shut -attach"? Так в чём тогда смысл? Или прямо во время выполнения? Тогда странно, у меня второй процесс ждёт когда завершится таймаут у shutdown'а, особенно заметно это если установить таймаут на 30 сек..

rdb_devЕсли вы пишите какой-то высоконагруженный сервер, для которого необходим пул соединений ...
да нет, обычной сервер, просто пул используется для того чтобы реже подключаться к БД..
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315466
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladты противоречишь сам себе.
Сначала говоришь про много соединений (неважно, сколько процессов на клиенте их создаёт).
В коде твоём нет "много соединений", они создаются и уничтожаются по-одному, последовательно.

Под соединениями я подразумеваю объекты типа "Connection", и изначально я писал о двух и более соединениях..

hvladДалее, опция -att не убивает текущие коннекты ...
это понятно, но он мешает закрыть пул соединений

hvlad... в отличие от -force.
а -force - зависает, начиная с 2.5.3...

hvladЕсли приспичило пользовать именно -att, сделай сначала DELETE FROM MON$ATTACHMENT в любом коннекте.
не приспичило, а вынужден... судя по всему придётся пользоваться таким решением, хоть оно и несколько "кривовато"...
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315514
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkud,

я не вижу, чтобы дисконнекты зависали на фоне gfix -force
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315552
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladя не вижу, чтобы дисконнекты зависали на фоне gfix -force
вот практически тот же скрипт на Groovy:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
@Grapes([
        @Grab(group='org.firebirdsql.jdbc', module='jaybird-jdk18', version='2.2.11'),
        @GrabConfig(systemClassLoader = true),
])

def dbUser = 'someUser'
def dbPassword = 'somePassword'

// Create database
File dbFile = File.createTempFile 'tmp', '.fdb'
dbFile.delete()
dbFile.deleteOnExit()
org.firebirdsql.management.FBManager.newInstance().with {
    start()
    createDatabase dbFile.path, 'SYSDBA', 'masterkey'
    stop()
}
def dbUrl = 'jdbc:firebirdsql:localhost:' + dbFile.path

// Open connection pool
def connPool = [
        java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPassword),
        java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPassword),
        java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPassword),
]

// Gradual closing of connections in another thread
Thread.start {
    connPool.each {
        Thread.sleep(1000)
        println 'close connection begin'
        it.close()
        println 'close connection end'
    }
}

// Shutdown database
println 'shutdown started'
try {
    org.firebirdsql.management.FBMaintenanceManager.newInstance().with {
        host = 'localhost'
        database = dbFile.path
        user = 'SYSDBA'
        password = 'masterkey'
        shutdownDatabase OPERATION_MODE_MULTI, SHUTDOWNEX_FORCE, 20
    }
    println 'shutdown finished'
} catch (Exception e) {
    println "shutdown error: $e"
}

// Delete database
while (!dbFile.delete())
    Thread.sleep 100
println 'database removed'



с 2.5.2 вывод такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
shutdown started
close connection begin
 ... спустя 19 секунд ...
shutdown finished
close connection end
database removed
close connection begin
close connection end
close connection begin
close connection end



а вот вывод с 2.5.6:
Код: sql
1.
2.
shutdown started
close connection begin

и всё, не завершается..

кстати, если timeout у shutdown'а установить в 0, то на 2.5.6 такой вывод:
Код: sql
1.
2.
3.
4.
shutdown started
close connection begin
close connection end
close connection begin

но опять-таки зависает...
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315566
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты уверен, что внутри у jdbc драйвера подключения и отключения не сериализуются?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315590
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkud, допилил, попробуй:

Создаем в БД процедуру:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SET TERM ^;
CREATE OR ALTER PROCEDURE DROP_ATTACHMENTS
  (
    timeout INTEGER NOT NULL
  )
AS
  DECLARE VARIABLE tmstmp TIMESTAMP;
BEGIN
  IF (:timeout <= 0) THEN EXIT;
  tmstmp = DateAdd(MILLISECOND, :timeout, CURRENT_TIMESTAMP);
  WHILE (DateDiff(MILLISECOND, Cast('Now' AS TIMESTAMP), :tmstmp) > 0) DO
    BEGIN END
  DELETE FROM MON$ATTACHMENTS;
END^
SET TERM ;^
COMMIT WORK;


cmd скрипт:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
@echo off
setlocal
if "%~1"=="" (
  if not "%db_path%"=="" (
    goto :drop_attachments
  ) else goto :eof
)
set db_path=%~1
if "%~2"=="" (
  set db_user=sysdba
  set db_password=masterkey
) else (
  set db_user=%~2
  set db_password=%~3
)

start db_shutdown.cmd
ping -n 1 -w 1000 -k "127.0.0.2" 1.1.1.1>nul
gfix -user "%db_user%" -password "%db_password%" -shut multi -attach 20 "%db_path%"
if errorlevel 1 goto :eof
echo Database "%db_path%" is shutted down successfully!
endlocal
goto :eof

:drop_attachments
echo SET SQL DIALECT 3;^
 CONNECT '%db_path%' USER '%db_user%' PASSWORD '%db_password%';^
 EXECUTE PROCEDURE DROP_ATTACHMENTS 2000;^
 COMMIT WORK;^
 QUIT;^
 | isql -quiet -z
exit
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315635
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devvitkud, допилил, попробуй:
...

Спасибо, попробовал - тоже самое. Я даже увеличил таймауты в 10 раз, и наблюдал по загрузки проца как ожидает своего часа процедура, но до тех пор пока shutdown не вылетит по timeout-у процесс с isql не завершается..
Собственно для проверки можно использовать тот же IBExpress: просто продублировать в нём соединение 2-3 раза и открыть их..
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315660
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkud,

Я вижу следующее:
- gfix -shut -force 0 блокируется до тех пор, пока не отсоединятся все существующие коннекты

- Существующие коннекты при этом блокируются при дисконнекте
(простые тесты с isql это не подтверждают)

- Приложение на JayBird с пулом коннектов не может одновременно сделать шатдаун (в одном потоке)
и закрыть все свои коннекты из другого потока.

Варианты:
а) написать трекеру и ждать когда починят в 2.5.6+ (я вижу, где он ждёт)
б) перейти на fb3 (там нет проблемы)
в) создать обходной путь, рассчитанный на конкретное приложение
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315714
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladvitkud,
Я вижу следующее:
- gfix -shut -force 0 блокируется до тех пор, пока не отсоединятся все существующие коннекты
- Существующие коннекты при этом блокируются при дисконнекте (простые тесты с isql это не подтверждают)Забавно, что если на момент запуска gfix -shut -attach к базе открыто не более двух любых подключений (включая подключение isql, в котором выполняется DELETE FROM MON$ATTACHMENTS), то ХП на удаление выполняется сразу и база нормально "кладется в shutdown".
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315769
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Код: plsql
1.
2.
 WHILE (DateDiff(MILLISECOND, Cast('Now' AS TIMESTAMP), :tmstmp) > 0) DO
    BEGIN END

Я не любитель фраз про "отрывание рук за такой код", но могу и пересмотреть свю точку зрения :)
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315770
vitkud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad- Существующие коннекты при этом блокируются при дисконнекте
(простые тесты с isql это не подтверждают)
да, с одним соединением проблем нет, а isql работает с одним соединением..

hvlad- Приложение на JayBird с пулом коннектов не может одновременно сделать шатдаун (в одном потоке)
и закрыть все свои коннекты из другого потока.
необязательно JayBird, то же самое повторяется с использованием IBExpert'а и gfix'а

hvladВарианты:
а) написать трекеру и ждать когда починят в 2.5.6+ (я вижу, где он ждёт)
я уже нашёл на трекере такую проблему: CORE-4742

hvladб) перейти на fb3 (там нет проблемы)
это всенепременно, но переход займёт много времени

hvladв) создать обходной путь, рассчитанный на конкретное приложение
так и поступлю.

Спасибо за уделённое время.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315781
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladЯ не любитель фраз про "отрывание рук за такой код", но могу и пересмотреть свю точку зрения :)К сожалению, пока ничего лучше для реализации задержки в транзакции придумать не смог. Подскажи, если знаешь способ лучше.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315787
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkudда, с одним соединением проблем нет, а isql работает с одним соединением..Да по барабану это.
isql нормально закрывает свой коннект, шатдаун этому не мешает.
Не мешает шатдаун закрывать коннекты.
Не мешает.

Прочитай вот тут *каждое* слово, а не через десять :
hvlad- Приложение на JayBird с пулом коннектов не может одновременно сделать шатдаун (в одном потоке)
и закрыть все свои коннекты из другого потока.
vitkudнеобязательно JayBird, то же самое повторяется с использованием IBExpert'а и gfix'аПроверил - не подтверждаю. IBE закрывает 4 клонированных DB и кричит при этом про database shutdown
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315788
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devhvladЯ не любитель фраз про "отрывание рук за такой код", но могу и пересмотреть свю точку зрения :)К сожалению, пока ничего лучше для реализации задержки в транзакции придумать не смог. Подскажи, если знаешь способ лучше.Лучше - не ставить себе глупые задачи ;)
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315796
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, да были бы задачи, а то так... Эксперимент. Хотелось из скрипта создать соединение до shutdown, а произвести DELETE FROM MON$ATTACHMENTS уже в процессе работы gfix -shut -attach.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315803
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devhvlad, да были бы задачи, а то так... Эксперимент. В качестве эксперимента, у себя - что угодно делай.
Но ты же другому человеку, да ещё и неопытному, каку советуешь...
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315807
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladЯ вижу следующее:
- gfix -shut -force 0 блокируется до тех пор, пока не отсоединятся все существующие коннектыКстати, проблема не наблюдается с SC\CS - gfix не блокируется, коннекты по факту отключены.
...
Рейтинг: 0 / 0
FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
    #39315809
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, ну почему сразу "каку"? Не вижу ничего плохого в том, что транзакция секунду пошуршит вхолостую перед отбрасыванием соединений к БД, ничего, при этом, не блокируя. Последний пример был как вариант для проверки, против предыдущего, где соединение из isql устанавливалось в уже процессе выполнения gfix -shut -attach.
...
Рейтинг: 0 / 0
25 сообщений из 87, страница 3 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB >2.5.2: gfix -shut -force 0 - зависает при двух открытых соединениях
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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