powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
25 сообщений из 69, страница 2 из 3
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38719805
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirGeronemo, то есть имелась в виду чистка уже той таблицы, куда записи пришли?

Да, речь про 2-ю таблицу (OperationTable)
Сначала в нее перемещаются данные из временной таблицы (раз в несколько секунд). Затем отдельный поток перекидывает эти данные обработчикам, которые отрабатывают с внешними серверами и возвращают какой-то результат, который мы пишем в эту таблицу. На этом, можно сказать, наша работа закончена. Клиент сделал запрос, мы его распарсили, отправили куда надо и сохранили результат.
Но со временем в этой таблице накопится сотни миллионов записей и, учитывая, что в нее постоянно кто-то обращается, будут большие тормоза.

Вот почему я задумался о том, что надо заиметь еще одну - архивную таблицу, куда бы перемещались неактуальные данные из OperationTable.
Приведу пример. Вы заходит в интернет-банк и совершаете там платеж за услуги оператора связи. Какое-то время ваша операция будет храниться в списке активных операций. Пока до нее дойдет очередь, пока будет налажено соединение с оператором связи, передача данных, ответ оттуда. И когда мы получаем ответ, то эта наша операция уже не так важна, мы можем ее переместить в архив, а клиент, если вдруг будет не доволен качеством услуги (деньги заплатил, а на счет они не пришли), то может пожаловаться, сообщив id операции (ее он получает при первом обращении к серверу) и администраторы могут заглянуть в архив и посмотреть, что не так.

Вот я и думаю, как лучше такое реализовать. На словах все очень просто. Но много вопросов - как часто перемещать данные исполненных запросов в Архив. Какой архив иметь - за все время (допустим, система будет все еще работать через 10 лет и придут ребята из органов, попросят данные 10-летней давности) или же иметь какой-нибудь срок давности, например год, а все остальное на удаление (или запись на Blu-ray и диск в ящик). Также интересно, в какое время перекидывать данные из OperationTable в Архив. У меня мысль такая. Допустим сейчас 5 утра 13.08. Ночью активность явно поменьше, чем днем. В это время можно устроить перенос данных с датой < 13.08.2014, 00:00:00.
Также можно создать 4-ю таблицу, в которую в 5 утра будут перемещаться данные из OperationTable, по которым от соответствующего внешнего сервера пришел ответ "error" или ответ не пришел.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720119
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появился еще один вопрос.

Касательно самой первой временной таблицы (напомню, что я пишу на java и работаю с БД)
При обращении клиента к серверу и я делю insert в эту таблицу, там пишутся все данные (в том числе timestamp) и в результате на выходе получаю получаю id, но мне также надо еще и текущее время. Я могу сделать сразу же после insert'а select по id и получить время, но я тут озабочен быстродействием, есть ли способ получить время в одном запросе.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720139
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

к сожалению, returning в mysql нет, так что только вторым запросом.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720159
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поясню вопрос.

Сейчас я делаю 4 java операции
1. statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
2. statement.getGeneratedKeys(); Извлекаю id и сохраняю его
3. resultset = statement.executeQuery (select ... currenttime ... where id = 'id')
4. if (resultset.next()) currenttime = resultset .getTimestamp(1)

Потом клиентку отправляю id и currenttime

Хотелось бы, как-то объединить п. 1 и 3, а также 2 и 4.
Как я написал выше, я довольно сильно озабочен быстродейстием.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720161
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirGeronemo,

к сожалению, returning в mysql нет, так что только вторым запросом.

Пока писал свое обобщение вопроса, вы мне ответили. Ок буду делать 2-й запрос. Жаль на форуме нельзя рейтинги ставить, я бы Вам плюсанул ))
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720188
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo, ну как вариант - если вы вставляете по одной записи - можно сделать хранимку, которая будет отдавать всё что угодно. Но "у ней унутре" опять же будет второй запрос, так что сэкономить тут удастся разве что на собственно посылке запроса по сети - а если жаба и скуль живут на одной машине, то эта экономия имхо будет совершенно призрачной.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720321
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, все верно,
tanglirесли жаба и скуль живут на одной машине
Сделал 2 последовательных запроса.

Далее. Вопрос по множественному апдейту. Какой по-вашему из возможных вариантов более предпочтительнее
1. UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END
2. там где on duplicate key
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720414
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторто эта экономия имхо будет совершенно призрачной.
я б так не стал заявлять.
время на переключение между программами, хоть и мало, но при тех требованиях, что у тс может играть роль.
думаю, что передав часть логики в хранимку можно сэкономить приличное время.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720430
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, не могли бы пояснить, я не совсем в курсе sql-жаргона, что такое хранимка.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720489
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранимка - хранимая процедура
http://yandex.ru/yandsearch?text=mysql хранимые процедуры&from=fx3&clid=1909644
вещь очень полезная.
для твоей цели - (очень грубо говоря) резместить оба запроса в хранимку и на этом сэкономить время на переключении между приложениями.
ну а правильно - переложить туда весь анализ и пр.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720509
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вызов хранимки без возврата результата
Код: java
1.
2.
3.
 con = DriverManager.getConnection(Singleton.getBase(), Singleton.getBase_login(), Singleton.getBase_password());
 proc = con.prepareCall("{ call имя_процедуры(" + param + ")}");
 proc.executeQuery();


с возвращением результата
Код: java
1.
2.
3.
4.
5.
con = DriverManager.getConnection(Singleton.getBase(), Singleton.getBase_login(), Singleton.getBase_password());
proc = con.prepareCall("{ call имя_процедуры(" + param + ")}");
rs = proc.executeQuery();
rs.next();
rs.getString("имя столбца") - результат хранимки
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720512
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, спасибо. Пока сделал в 2 запроса, чуть позже займусь оптимизацией.

по поводу множественного апдейта, повторю вопрос, какой способ лучше (с т. з. быстродействия)

1. UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END

2. INSERT INTO `table` (id, field) VALUES (1, 1), (2, 12), (3, 0.5) ON DUPLICATE KEY UPDATE field = VALUES(field)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720531
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если у тебя мульоны данных в таблице (куда вставляешь) - первый быстрее,
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720561
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
 UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END



в данном варианте выяснение чир вставлять я бы вынес из запроса
в java
запрос стал таким
Код: sql
1.
UPDATE `table` SET `field`=нужное
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720565
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ
а если id не рано ни val1, ни val2, тогда и запрос вызывать не надо
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720671
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, спс за хранимку ))

В моем случае
1. Вы правы, у меня мульон записей
2. данные с полученным id процентов на 99 присутсвуют ()кроме каких-то форс-мажоров)

/quot]
в данном варианте выяснение чир вставлять я бы вынес из запроса
в java
запрос стал таким
Код: sql
1.
UPDATE `table` SET `field`=нужное

[/quot]

А вот тут есть вопрос. Я читал, что разного рода логика в MySQL Работает быстрее и потому всякие поиски по id, сортировки лучше переложить на БД, ( например, лучше сделать один большой запрос, чем много простых в цикле). Или может я вашу мысль неправильно понял.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38720780
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
 UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END



если мульон, то это странный запрос.
в зависимости от id он поменяет во всём мульоне в поле field значение на data1 или data2 или на прежнее
зачем менять на прежнее во всём мульоне? по факту ничено не изменится, только потратится время.

либо приведенный запрос не верен.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721135
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
Код: sql
1.
2.
3.
4.
 UPDATE `table` SET `field` = CASE `id`
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE `field` END



если мульон, то это странный запрос.
в зависимости от id он поменяет во всём мульоне в поле field значение на data1 или data2 или на прежнее
зачем менять на прежнее во всём мульоне? по факту ничено не изменится, только потратится время.

либо приведенный запрос не верен.

Т. е. строчка
ELSE `field`
присваивает каждой записи, полю field текущее значение ?

А нету ли такого множественного апдейта, который затрагивал бы только те записи, которые мне нужны.

Потому что у меня мульон записей и в секунду обрабатывается несколько сотен.

Может сделать такой запрос
String updateString = "UPDATE OperationTable SET field_name "success" WHERE ID = id1;" + ....
UPDATE OperationTable SET field_name "success" WHERE ID = idi; + ....
UPDATE OperationTable SET field_name "success" WHERE ID = idn;"
statement.execute(updateString);
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721246
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверно будет грубовато, но инет богат мануалами, и даже на русском.
http://yandex.ru/yandsearch?text=mysql update&from=fx3&clid=1909644
http://phpclub.ru/mysql/doc/update.html

если хочешь научиться, скачай dbForge, там в удобном виде , с шаблонами, с gui, можно пробовать(только не на боевой базе, конечно)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721277
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадянаверно будет грубовато, но инет богат мануалами, и даже на русском.
http://yandex.ru/yandsearch?text=mysql update&from=fx3&clid=1909644
http://phpclub.ru/mysql/doc/update.html

если хочешь научиться, скачай dbForge, там в удобном виде , с шаблонами, с gui, можно пробовать(только не на боевой базе, конечно)

Вовсе не грубовато. Я постоянно почитываю такого рода и много вещей делаю сам. А сюда задаю вопросы, если есть какие-то сомнения или, если я наткнулся на ошибку, которая отнимает много времени.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721498
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зупустил 2 раза приложение на продолжительное тестирование
В первый раз работало где-то час, образовалось 150000 записей. Ни одна не потерялась, ни одной ошибки не вылетело.

Во второй раз через полчаса, после где-то 70000 записей. Стало вываливаться исключение в строчке
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=xxxxx");
вот такого вида
om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at sun.reflect.GeneratedConstructorAccessor39.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance

Я нагрузил сервер по-максимуму и он упал. Похоже слишком много потоков и соответственно слишком много соединений.
Как с этим бороться. Может не (открывать/закрывать) соединение с БД так часто (как это сделать). Или вообще установить соединение 1 раз и не рвать его, пока сервер не остановится (т. е. чтобы все желающие что-то куда-то писать пользовались одним connection)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721582
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так общаюсь с базой
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
try {
            con = DriverManager.getConnection(getBase, getBase_login, getBase_password);
            proc = con.prepareCall("{ call page1('" + param + "')}");
            rs = proc.executeQuery();
            while(rs.next()){
ля-ля
            }
        } catch (SQLException ex) {
            Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                proc.close();
                rs.close();
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
            }


а ты?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38721959
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, у меня похоже некоторые исключения не обрабатывались, сейчас я привел код к такому виду.

Кстати, утром поставил симуляция, получилось 37000 записей, потом вылетело то самое исключение.

Теперь я привел все методы работы с БД вот к такому виду и поставлю опять симуляцию на пару часиков

Код: 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.
 Connection cn = null;
        Statement st = null;

        try {
            cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=xxxxxx");

            ResultSet rs = null;

            st = cn.createStatement();

            StringBuilder updateQuery = new StringBuilder("");
            if (listsOfResponses.getResponseList().size() > 0) {
                for (ResponseFromOperator responseFromOperator : listsOfResponses.getResponseList()) {
                    st.addBatch("UPDATE OperationtTable SET paymentresult = '" + responseFromOperator.getResponse() + "' WHERE paymentid = " + responseFromOperator.getId() + ";");
                }

                st.executeBatch();

                st.close();
                cn.close();
            }
        }

        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {

                st.close();
                cn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722027
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Connection cn = null;
        Statement st = null;

        try {
            cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=xxxxxx");

            ResultSet rs = null;

            st = cn.createStatement();

            StringBuilder updateQuery = new StringBuilder("");
            if (listsOfResponses.getResponseList().size() > 0) {
                for (ResponseFromOperator responseFromOperator : listsOfResponses.getResponseList()) {
                    st.addBatch("UPDATE OperationtTable SET paymentresult = '" + responseFromOperator.getResponse() + "' WHERE paymentid = " + responseFromOperator.getId() + ";");
                }

                st.executeBatch();

                st.close(); ------------------------это лишнее
                cn.close(); -----------------------это лишнее
            }
        }

        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {

                st.close();
                cn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722032
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя ? это была ошибка копи-паста. fixed

Запустил симуляцию на пару часов, около 50000 запросов, причем, начиная с 70000 стали вываливаться исключения и 430000 записей остались во временной таблице.

У меня есть некоторые соображения, как это можно поправить, сейчас запущу симуляцию еще раз.

Напомню, исключение вы валивается в строчке

cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=123");
имеет очень большой stack race. Вот его часть
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
at com.mysql.jdbc.Util.getInstance(Util.java:383)
.......

Может можно как-то ограничить количество одновременных соединений с БД и приказать потокам вставать в очередь ?
...
Рейтинг: 0 / 0
25 сообщений из 69, страница 2 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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