powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Мониторинг изменений в базах данных
25 сообщений из 153, страница 4 из 7
Мониторинг изменений в базах данных
    #39920183
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR,
Да. Встроены.
У них же задача - "передать удаленно всё что изменилось"))))))
Только не притягивай это к твоему ТЗ. Оно у тебя глупое.
Так как у репликации есть четкий юз кейс для теста и проверки.
У тебя в ТЗ нет юз кейса, цели и задачи.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920188
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
пока гуглил, наткнулся на статью: https://habr.com/ru/post/149431/
2012 год да и то, тольуо список измененных таблиц.
А у тебя время, плюс тип операции, плюс имя поля, плюс старое значение.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920201
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
GrossmasteR,

Что будет считаться изменением в СУБД, изменение одного значения
в одной из сотен миллионов записей в одной из нескольких тысяч таблиц
будет считаться изменением?

Интересно что считать drop table успешным по факту его подачи или по факту фиксации удаления самой таблички?
И что делать на slave системе которая может успешно грохнуть табличку в то время как master ее удалял но не смог.
И дальше - продолжают катится транзакции которые в мастер вливаются а в slave уже нет т.к. табличка улетела.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920235
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, что у меня получилось:
JDBCTemplate, будем говорить, самодельный.

Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
public class TriggerService {
    private final String dataSource;

    public TriggerService(String dataSource) {
        this.dataSource = dataSource;
    }

    public void init() {
        JdbcTemplate.executeInit(
                dataSource,
                "CREATE TABLE IF NOT EXISTS houses(id INTEGER PRIMARY KEY, price INTEGER NOT NULL, district TEXT NOT NULL, underground TEXT NOT NULL);"
        );
    }

    public House insert(House house) {
        JdbcTemplate.executeCreateQuery(
                dataSource,
                "INSERT INTO houses (price, district, underground) VALUES(?, ?, ?);",
                pstmt -> {
                    pstmt.setInt(1, house.getPrice());
                    pstmt.setString(2, house.getDistrict());
                    pstmt.setString(3, house.getUnderground());
                }
        );
        return house;
    }

    public House update(House house) {
        JdbcTemplate.executeCreateQuery(
                dataSource,
                "UPDATE houses SET price = ?, district = ?, underground = ? WHERE id = ?;",
                pstmt -> {
                    pstmt.setInt(1, house.getPrice());
                    pstmt.setString(2, house.getDistrict());
                    pstmt.setString(3, house.getUnderground());
                    pstmt.setInt(4, house.getId());
                }
        );
        return house;
    }

    public void initTrigger() {
        JdbcTemplate.executeInit(
                dataSource,
                "CREATE TABLE IF NOT EXISTS houses_trigger(new_id INTEGER PRIMARY KEY, new_price INTEGER NOT NULL, new_district TEXT NOT NULL, new_underground TEXT NOT NULL, date TEXT NOT NULL, operation TEXT NOT NULL);"
        );
        JdbcTemplate.executeInit(
                dataSource,
                "CREATE TRIGGER IF NOT EXISTS after_insert AFTER INSERT ON houses BEGIN INSERT INTO houses_trigger(new_id, new_price, new_district, new_underground, date, operation) VALUES (NEW.id, NEW.price, NEW.district, NEW.underground, datetime('now'), 'ins');END;"
        );
        JdbcTemplate.executeInit(
                dataSource,
                "CREATE TRIGGER IF NOT EXISTS after_update AFTER UPDATE ON houses BEGIN INSERT INTO houses_trigger(new_id, new_price, new_district, new_underground, date, operation) VALUES (OLD.id, OLD.price, OLD.district, OLD.underground, datetime('now'), 'upd');END;"
        );
    }

    public List<House> getAllChanges(String date) {
        return JdbcTemplate.executeQuery(
                dataSource,
                "SELECT new_id, new_price, new_district, new_underground, date FROM houses_trigger WHERE date LIKE '" + date + "%'",
                rs -> new House(
                        rs.getInt("new_id"),
                        rs.getInt("new_price"),
                        rs.getString("new_district"),
                        rs.getString("new_underground"),
                        rs.getString("date")

                )
        );
    }
}


Как по мне, работает. Единственное, я не понял, как мне в IDEA вторую таблицу увидеть
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920246
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Интересно что считать drop table успешным по факту его подачи или по факту фиксации удаления самой таблички?
И что делать на slave системе которая может успешно грохнуть табличку в то время как master ее удалял но не смог.
И дальше - продолжают катится транзакции которые в мастер вливаются а в slave уже нет т.к. табличка улетела.

Во первых не создавать и не удалять таблицы налету, а если все же решили сделать подобную архитектуру,
обрабатывать возможные нештатные ситуации.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920249
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как быть с этим? "Код должен быть покрыт нагрузочными тестами, приведены оценки планов запроса"
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920252
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR

Как по мне, работает. Единственное, я не понял, как мне в IDEA вторую таблицу увидеть

Это капец. А если у тебя 100 таблиц будет. Сколько тебе кода надо наколбасить. И сколько
протестировать.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920274
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
Код: java
1.
2.
CREATE TABLE IF NOT EXISTS houses_trigger(new_id INTEGER PRIMARY KEY, new_price INTEGER NOT NULL, new_district TEXT NOT NULL, new_underground TEXT NOT NULL, date TEXT NOT NULL, operation TEXT NOT NULL);"
        );


-Никогда не называй таблицы программисткими терминами - items/trigger. Только бизнес и сущность.
- new_id переименовать в id и автосчетчик
- date НЕ ТЕКСТ
- Операция тип поля char, одна буква
- новые значения можно кидать в одно поле текст. Как захочешь. Оно не not null
...
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920276
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR,
С памятью хорошо? Я говорил что один триггер.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920278
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
Код: java
1.
public class TriggerService {

что делает твой микросервис в кавычках?
Почему такое название?
Где обработка ошибок БД.
Где комментарии у класса и методов?
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920279
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
Код: java
1.
public List<House> getAllChanges(


Это в другой микро))))) сервис или класс перенеси.
Почему класс возврата House?
А те что удалены как назовем? Delete_House?
Подпиши комментарий метода.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920280
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
как мне в IDEA вторую таблицу увидеть
перечитай моё ТЗ.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920281
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
GrossmasteR
Для эксперимента создам простейшую таблицу. house adress price metro что то типа того и пропишу простейшие методы. insert update delete.

затем создам второй сервис TriggerService или что то типа того, где будут прописаны триггеры для каждой операции и попробую в какую -нибудь коллекцию получить изменения таблицы при выполнении операций с ней. Формально ТЗ будет выполнено?
это ТЗ для джуна. В начале треда не для джуна ТЗ. Сами решайте.
1. Один триггер для всех операций
2. Он пишет в таблу время, тип_операции_буква, прошлое значени_строка.
3. Коллекция не нужна. Просто вывод раз в 5 сек этой таблы в файл/лог

Всё

То что выше сделано пока двойка.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920290
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
Вот, что у меня получилось

Бред какой-то.
Вы сами-то задание своё читали? Или оно у вас из головы вылетело?
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920296
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
GrossmasteR
Вот, что у меня получилось

Бред какой-то.
Вы сами-то задание своё читали? Или оно у вас из головы вылетело?
вы в гостях поменьше выражайтечь. Соблюдайте приличия.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920306
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

исключения обрабатываются в JdbcTemplate.

Код: 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.
public class JdbcTemplate {

    private static <T> T execute(String dataSource, String sql, PreparedStatementExecutor<T> executor) {
        try (
                Connection connection = DriverManager.getConnection(dataSource);
                PreparedStatement preparedStatement = connection.prepareStatement(sql)
        ) {
            return executor.execute(preparedStatement);
        } catch (SQLException e) {
            throw new DataAccesException();
        }
    }

    public static void executeInit(String dataSource, String sql) {

        try (
                Connection connection = DriverManager.getConnection(dataSource);
                Statement statement = connection.createStatement()

        ) {
            statement.execute(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void executeCreateQuery(String dataSource, String sql, PreparedStatementSetter setter) {
        execute(dataSource, sql, pstmt -> {
            setter.set(pstmt);
            pstmt.execute();
            return null;
        });
    }

    public static <T> List<T> executeQuery(String dataSource, String sql, RowMapper<T> mapper) {
        return execute(dataSource, sql, pstmt -> {
            try (ResultSet resultSet = pstmt.executeQuery()) {
                List<T> result = new LinkedList<>();
                while (resultSet.next()) {
                    result.add(mapper.map(resultSet));
                }
                return result;
            }
        });
    }
}



ну и интерфейсы, которые передаются в параметры методов, написаны
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920313
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp

- new_id переименовать в id и автосчетчик

По-моему, имеет смысл все же new_id, потому что нам, возможно, для чего-то может быть интересно объект с каким id в изначальной таблице попал в новую
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920319
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA

Бред какой-то.
Вы сами-то задание своё читали? Или оно у вас из головы вылетело?


Задание:
"...Спроектировать алгоритм (функцию) определяющую есть ли изменения в СУБД или нет начиная с какого-либо времени или идентификатора..."
У меня есть некая таблица, при каждом insert и update в эту таблицу, я сохраняю эти изменения в другую таблицу и могу выгрузить в LIST. То есть не только сам факт "есть ли изменения", а еще и посмотреть, что изменилось.
Вызываю, к примеру
Код: java
1.
System.out.println(triggerService.getAllChanges("2020-01-29"));


и вижу, что изменилось за вчерашний день.
Неужели все так ужасно?
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920320
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
PetroNotC Sharp

- new_id переименовать в id и автосчетчик

По-моему, имеет смысл все же new_id, потому что нам, возможно, для чего-то может быть интересно объект с каким id в изначальной таблице попал в новую

Приведите Модель таблиц. Перед программированием ее обязательно делают. В любой форме. Лучше со стрелочками, но можно и без них)
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920322
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
Вариации:
  • Вычисление изменение всей схемы целиком.
  • Вычисление изменений заданных объектов (таблиц, колонок).
и где это?
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920323
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
и могу выгрузить в LIST.
этого в задании нет. Ни в первом ни в моем.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920324
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
GrossmasteR
Вариации:
  • Вычисление изменение всей схемы целиком.
  • Вычисление изменений заданных объектов (таблиц, колонок).
и где это?
а вы знаете понятие СХЕМА ЦЕЛИКОМ?
Вы не прогер чтобы такие ТЗ давать.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920325
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, а как мне создать метод, который бы уничтожил изначальную таблицу, чтобы я потом мог создать новую с нуля, пожалуйста, подскажите?

Что-то типа
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void close() {
        try {
            preparedStatement.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


подойдет?
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920326
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
Вычисление, реализованное только на JAVA без использования системных объектов СУБД.
где это?
GrossmasteR
Вычисление, реализованное только на SQL на СУБД Postgres.
а это?

Вообщем ничего по заданию не сделано.
...
Рейтинг: 0 / 0
Мониторинг изменений в базах данных
    #39920327
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR
уничтожил изначальную таблицу
drop table t
...
Рейтинг: 0 / 0
25 сообщений из 153, страница 4 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Мониторинг изменений в базах данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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