powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Блокировка в пустой базе hsql на уровне БД
5 сообщений из 5, страница 1 из 1
Блокировка в пустой базе hsql на уровне БД
    #38509467
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос эзотерический.
В postgres например можно тупо написать что-то типа
Код: plsql
1.
LOCK TABLE pg_class IN EXCLUSIVE MODE

, и ок.
В hsql подобное не канает.
Если заглянуть в код liquibase, занимающийся подобной задачей (который кстати, в inmemory базе, прежде чем начать накатывать скрипт, пыхтит загружая на 100% процессор около 2-х минут), то мы увидим неприятный код и мутные манипуляции с тыщями ролбеков туда-сюда.
Есть какие идеи насчет?
...
Рейтинг: 0 / 0
Блокировка в пустой базе hsql на уровне БД
    #38509481
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче написал такую мотню, вопрос закрыт.
Код: 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.
 try (Statement stmt = jdbcConn.createStatement()) {
                    jdbcConn.setAutoCommit(true);

                    long thisSessionId;
                    try (ResultSet current = stmt.executeQuery("SELECT VALUE FROM INFORMATION_SCHEMA.SYSTEM_SESSIONINFO WHERE key ='SESSION ID'")) {
                        current.next();
                         thisSessionId = current.getLong(1);
                    } catch (Exception e){
                        throw new RuntimeException(e);
                    }

                    stmt.executeUpdate("CREATE TABLE IF NOT EXISTS CHANGELOG_LOCK (SESSION_ID BIGINT PRIMARY KEY)");
                    stmt.executeUpdate("INSERT INTO CHANGELOG_LOCK (SESSION_ID) VALUES (" + thisSessionId + ")");

                    for (; ; ) {
                        stmt.executeUpdate("DELETE FROM CHANGELOG_LOCK WHERE NOT SESSION_ID IN (SELECT SESSION_ID FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS)");
                        try (ResultSet rst = stmt.executeQuery("SELECT 1 FROM CHANGELOG_LOCK HAVING MIN(SESSION_ID)=" + thisSessionId)) {
                            if (!rst.next()) {
                                Thread.sleep(100);
                                continue;
                            }

                            ..... синхронный код ... 
                            ..... синхронный код ... 
                            ..... синхронный код ... 


                            break;
                        }
                    }
                    return null;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException();
                }
...
Рейтинг: 0 / 0
Блокировка в пустой базе hsql на уровне БД
    #38509486
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя не, тоже фигня. В общем, снова открыт
...
Рейтинг: 0 / 0
Блокировка в пустой базе hsql на уровне БД
    #38509488
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быть может, так будет корректнее:
Код: java
1.
2.
3.
4.
5.
6.
7.
                    stmt.executeUpdate("CREATE TABLE IF NOT EXISTS CHANGELOG_LOCK (SESSION_ID BIGINT, SEQ BIGINT PRIMARY KEY)");
                    stmt.executeUpdate("CREATE SEQUENCE IF NOT EXISTS CHANGELOG_SEQ");
                    stmt.executeUpdate("INSERT INTO CHANGELOG_LOCK (SESSION_ID, SEQ) VALUES (" + thisSessionId + ", nextval('CHANGELOG_SEQ'))");

                    for (; ; ) {
                        stmt.executeUpdate("DELETE FROM CHANGELOG_LOCK WHERE NOT SESSION_ID IN (SELECT SESSION_ID FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS)");
                        try (ResultSet rst = stmt.executeQuery("SELECT 1 FROM CHANGELOG_LOCK WHERE SESSION_ID=" + thisSessionId + " ORDER BY SEQ")) {
...
Рейтинг: 0 / 0
Блокировка в пустой базе hsql на уровне БД
    #38509490
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а точнее
Код: java
1.
"SELECT SESSION_ID FROM CHANGELOG_LOCK ORDER BY SEQ"
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Блокировка в пустой базе hsql на уровне БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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