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

, и ок.
В hsql подобное не канает.
Если заглянуть в код liquibase, занимающийся подобной задачей (который кстати, в inmemory базе, прежде чем начать накатывать скрипт, пыхтит загружая на 100% процессор около 2-х минут), то мы увидим неприятный код и мутные манипуляции с тыщями ролбеков туда-сюда.
Есть какие идеи насчет?
...
Рейтинг: 0 / 0
23.12.2013, 02:01:59
    #38509481
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка в пустой базе hsql на уровне БД
короче написал такую мотню, вопрос закрыт.
Код: 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
23.12.2013, 02:11:20
    #38509486
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка в пустой базе hsql на уровне БД
Хотя не, тоже фигня. В общем, снова открыт
...
Рейтинг: 0 / 0
23.12.2013, 02:19:09
    #38509488
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка в пустой базе hsql на уровне БД
Быть может, так будет корректнее:
Код: 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
23.12.2013, 02:20:59
    #38509490
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка в пустой базе hsql на уровне БД
а точнее
Код: java
1.
"SELECT SESSION_ID FROM CHANGELOG_LOCK ORDER BY SEQ"
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Блокировка в пустой базе hsql на уровне БД / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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