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

Самые частый обращения к БД идут от клиентов, коих >1000 и запросов приходит несколько сотен в сек. Что если метод, который сохраняет данные в БД не будет закрывать соединение с БД.

Или 2-я идея.
Организовать вот такую конструкцию.
private Connection connectToDB ()
{
Connection cn = null;

try {
cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=123");
}
catch (Exception e) {
{
e.printStackTrace();
}
}
return cn;
}

А где-нибудь в теле метода сохранения данных от клиента сделать так
while ((cn = connectToDB()) == null)
Thread.sleep(100);
За 100 миллисекунд мы даем возможность всем потокам закрыть соединение с БД и исключения
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)
недолжно возникать.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722475
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть подозрение, что ты упираешься по быстродействию файловой системы.
если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722538
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяесть подозрение, что ты упираешься по быстродействию файловой системы.
если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid

У меня база на SSD
У меня такое же соображение, что все упирается в файловую систему. Причем даже есть косвенные д-ва этому. У меня в некоторых местах было логгирование, типа создать файл номер 22345 и записать туда данные, полученные от клиента. Я так понимаю, что такого рода операции были что-то типа sleep На 5 миллисекунд и у БД было чуть больше времени, чтобы выполнить операцию и закрыть соединение. Потому как раньше поток исключений начинался после 70000 операций, а сейчас после 20000-30000.

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

StringBuilder updateQuery = new StringBuilder(200 ); (200 это к примеру)


"UPDATE OperationtTable SET paymentresult = '" + responseFromOperator.getResponse() + "' WHERE paymentid = " + responseFromOperator.getId() + ";"

на

for (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}

чему равно количестчо циклов?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38722681
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так правильнее
for (.....)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery.toString);

updateQuery.delete(1,200);
}
st.executeBatch();
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38723038
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoу меня возникла идея.

Самые частый обращения к БД идут от клиентов, коих >1000 и запросов приходит несколько сотен в сек. Что если метод, который сохраняет данные в БД не будет закрывать соединение с БД.

Или 2-я идея.
Организовать вот такую конструкцию.
private Connection connectToDB ()
{
Connection cn = null;

try {
cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/PaymentServer?user=root&password=123");
}
catch (Exception e) {
{
e.printStackTrace();
}
}
return cn;
}

А где-нибудь в теле метода сохранения данных от клиента сделать так
while ((cn = connectToDB()) == null)
Thread.sleep(100);
За 100 миллисекунд мы даем возможность всем потокам закрыть соединение с БД и исключения
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)
недолжно возникать.

ок, вы созрели для коншн-пула :-)

напромер такой:
http://www.snaq.net/java/DBPool/

кстати, хибернат имеет конекш-пул сразу.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38723805
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадятак правильнее
for (.....)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery.toString);

updateQuery.delete(1,200);
}
st.executeBatch();



StringBuilder updateQuery = new StringBuilder(200);

if (listsOfResponses.getResponseList().size() > 0) {
for (ResponseFromOperator responseFromOperator : listsOfResponses.getResponseList()) {
updateQuery.append("UPDATE OperationTable SET paymentresult = '");
updateQuery.append(responseFromOperator.getResponse());
updateQuery.append("' WHERE paymentid = ");
updateQuery.append(responseFromOperator.getId());
updateQuery.append(";");
st.addBatch(updateQuery.toString());
updateQuery.delete(1,200);
}
st.executeBatch();
}

Переделал по вашему подобию, спс за совет, так будет быстрее работать.

Циклов штук 70. Но я могу настраивать частоту появления запросов от клиента. Моей следующей задачей будет имитация 24-х часового периода. Чтобы были часы пик и периоды практической тишины (в это время буду очищать таблицу операций и перекидывать все в таблицу Архива)
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38726772
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
for (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}

чему равно количестчо циклов?

Ко мне тут заходил знакомый java-программист, смотрел код. Он сказал, что когда делаются куча однотипных действий, то лучше использовать Preparecall со знаками '?', а потом делать setPAram. И все это дело в цикле. Честно говоря, я не уверен в его правоте. А как вы думаете ?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38726803
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или же еще один вариант, где возможно Preparecall лучше.

E мея в секунду поступает около 300 запросов (каждый в своем потоке) от клиентов и их я помещаю в БД. Возможно вот эту запись лучше лучще сделать с помощью preparecall. Ну то что StringBuilder лучше текущего варианта, это я понимаю.

String query = "insert into TempTable (clientid, paymenttype, account, paymentvalue) values " +
"(" + payment.getClientId() + ",'" + payment.getType() + "', " + payment.getAccount() + ", " + payment.getValue() + ")";
int id = -1;
st.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38727068
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Preparecall лучше если ты применишь его вместо текущего способа.
а если всё в разных потоках и в разных коннектах - не поможет.

как вариант(если у тебя цикл из 70± ) - можно попробовать все данные сформировать в строку с разделителем и отправить в хранимку, а там в цикле парсить и делать дело.
тут нет гарантии что будет быстрее, но и медлееннее - не факт.
было б интересно узнать результатты такого опыта.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38727417
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoвадяfor (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}

чему равно количестчо циклов?

Ко мне тут заходил знакомый java-программист, смотрел код. Он сказал, что когда делаются куча однотипных действий, то лучше использовать Preparecall со знаками '?', а потом делать setPAram. И все это дело в цикле. Честно говоря, я не уверен в его правоте. А как вы думаете ?


1. препаре стейтмент имеют большой шанс сильно укорить здесь.
Опятже, без конекш-пула это все бестолку

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

Далее я обнаружил ошибку в коде
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for (.....)
{
updateQuery.append("UPDATE OperationtTable SET paymentresult = '" )
.append( responseFromOperator.getResponse() )
.append("' WHERE paymentid = " )
.append(responseFromOperator.getId())
.append(";")
st.addBatch(updateQuery>toString);
st.executeBatch();
updateQuery.delete(1,200);
}


В файле логов stderr Томката по этому поводу написано
java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' UUPDATE OperationTable SET paymentresult = 'suсcess' WHERE paymentid =' at line 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1196)
Тупо скопировав текст и, решив, что updateQuery.delete( 1 ,200) это правильно, т. к. мне тут так написали я допустил ошибку в ситаксисе, но исправив на updateQuery.delete( 0 ,200) у меня вылетает все та же ошибка, как в логах, так и при просмотре таблицы OperationTable (в колонке paymentresult должно стоять везде 'suсcess', а у меня только у 1-го платежа данного типа, у остальных со времен предыдущей записи стоит 'processing' ).

Более того я пошел далее.
Я решил поменять всю эту конструкцию на

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            preparedStatement = cn.prepareStatement(
                    "UPDATE OperationPaymentTable SET paymentresult = ? WHERE paymentid = ?;");

                for (ResponseFromOperator responseFromOperator :listsOfResponses.getResponseList()) {

                    preparedStatement.setString(1, responseFromOperator.getResponse());
                    preparedStatement.setInt(2, responseFromOperator.getId());

                    preparedStatement.executeUpdate();
                } 



Но Томкат меня почему-то не воспринимает. Я и перезапускал его и перегружал комп, а он все равно выдает ошибку в логе
java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' UUPDATE OperationTable SET paymentresult = 'suсcess' WHERE paymentid =' at line 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1196)
Что за бред. Я уже 100 раз код поменял, откуда это вылазит ?
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728041
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, возможно нашел, откуда ноги растут, но что с этим делать все еще не понимаю. В логе Томката catalina2014-8-25
есть такое
авторINFO: validateJarFile(C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\PaymentServer\WEB-INF\lib\ servlet-api-2.5.jar) - jar not loade d. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
авг 25, 2014 1:12:33 PM org.apache.catalina.deploy.WebXml setVersion
WARNING: Unknown version string [3.1]. Default version will be used .

Интересно, почему ему не нравится этот файл. Он лежит в папке lib с давних времен (скорее всего, т. к. я настройками не увлекался последнее время). И еще - что еще за Default version они тут собрались использовать.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728057
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще подкину инфу. Проект у меня maven и в pom.xml вот такое прописано.

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728081
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в файле tomcat7-stderr.2014-08-25.log
все так и вываливается ошибка
авторjava.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' UUPDATE OperationTable SET paymentresult = 'sucess MTS' WHERE paymentid = ' at line 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1196)
at DB.ModifyPaymentStatus(DB.java:280)
Что за бред. Этой SQL строки в моем проекте уже давно нету. Такое ощущение, что я пересобираю проект (и помещаю его в webapp ) каждый раз впустую, а Томкат все равно бкркт его версию 2-дневной давности из х. з. какого кэша.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728213
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался !!! Пришлось создавать заново maven-проект, с другим именем, но таким же содержанием.
В чем суть была, не знаю. Похоже где-то в кэше застряла версия проекта 2-хдневной давности и все время запускалась она. Хоть мне разок и удалось ее отредактировать - напихать кучу логов. Но дальше мне уже ничего не помогало.

В общем создал я таблицу Архива, запущу большое тестирование, посмотрим, как пойдет.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #38728288
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

много лун тому назад в Томкате была фишка что надо
удалят- компилированые классы из рабочей директории
что бы подгрузить новую версию.

Но в вашем случае вроде все проше -- пока не почините
указаный ХМЛ Томкат даже не будет пытатся
задеплоить новый жар.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #39001804
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил сделать небольшой рефакторинг проекта.

1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации.
2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets).
3. Пакет business, в котором вся логика, там несколько EJB бинов, а также....
и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу.
В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался.
...
Рейтинг: 0 / 0
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
    #39005523
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoРешил сделать небольшой рефакторинг проекта.

1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации.
2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets).
3. Пакет business, в котором вся логика, там несколько EJB бинов, а также....
и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу.
В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался.



...вашето тут форум по мускл...

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


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