|
|
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
у меня возникла идея. Самые частый обращения к БД идут от клиентов, коих >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) недолжно возникать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 11:58:49 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
есть подозрение, что ты упираешься по быстродействию файловой системы. если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 13:51:21 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадяесть подозрение, что ты упираешься по быстродействию файловой системы. если есть возможность попробуй на ssd базу разместить а лучше ssd поставить в raid У меня база на SSD У меня такое же соображение, что все упирается в файловую систему. Причем даже есть косвенные д-ва этому. У меня в некоторых местах было логгирование, типа создать файл номер 22345 и записать туда данные, полученные от клиента. Я так понимаю, что такого рода операции были что-то типа sleep На 5 миллисекунд и у БД было чуть больше времени, чтобы выполнить операцию и закрыть соединение. Потому как раньше поток исключений начинался после 70000 операций, а сейчас после 20000-30000. Надо помозговать, как еще можно что-то соптимизировать. Хотя, может и нету такой возможности, все-таки я работаю за домашним компом, а не с навороченным сервером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 14:29:28 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
замени 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); } чему равно количестчо циклов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 14:49:42 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
так правильнее for (.....) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 16:28:57 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
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/ кстати, хибернат имеет конекш-пул сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 03:52:34 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадятак правильнее for (.....) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 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-х часового периода. Чтобы были часы пик и периоды практической тишины (в это время буду очищать таблицу операций и перекидывать все в таблицу Архива) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 19:13:17 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
вадя 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. И все это дело в цикле. Честно говоря, я не уверен в его правоте. А как вы думаете ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 14:56:02 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Или же еще один вариант, где возможно 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 15:22:45 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Preparecall лучше если ты применишь его вместо текущего способа. а если всё в разных потоках и в разных коннектах - не поможет. как вариант(если у тебя цикл из 70± ) - можно попробовать все данные сформировать в строку с разделителем и отправить в хранимку, а там в цикле парсить и делать дело. тут нет гарантии что будет быстрее, но и медлееннее - не факт. было б интересно узнать результатты такого опыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 18:50:18 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
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. всегда полезно попробовать альтернативные варианты. т.е. поможет-непоможет, но ислледовать в познавательных целях -- обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2014, 07:16:23 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Нужна помощь. Около суток не могу понять, что происходит с Томкатом. Я навводил кучу логгирования по всему коду и вижу, что выполняется не мое приложение, а то, что было, часов 12 назад. Далее я обнаружил ошибку в коде Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В файле логов 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. Но Томкат меня почему-то не воспринимает. Я и перезапускал его и перегружал комп, а он все равно выдает ошибку в логе 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 раз код поменял, откуда это вылазит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 13:10:12 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Так, возможно нашел, откуда ноги растут, но что с этим делать все еще не понимаю. В логе Томката 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 они тут собрались использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 13:22:39 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Еще подкину инфу. Проект у меня maven и в pom.xml вот такое прописано. <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 13:35:15 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
А в файле 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-дневной давности из х. з. какого кэша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 14:00:44 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Разобрался !!! Пришлось создавать заново maven-проект, с другим именем, но таким же содержанием. В чем суть была, не знаю. Похоже где-то в кэше застряла версия проекта 2-хдневной давности и все время запускалась она. Хоть мне разок и удалось ее отредактировать - напихать кучу логов. Но дальше мне уже ничего не помогало. В общем создал я таблицу Архива, запущу большое тестирование, посмотрим, как пойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 15:39:53 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Geronemo, много лун тому назад в Томкате была фишка что надо удалят- компилированые классы из рабочей директории что бы подгрузить новую версию. Но в вашем случае вроде все проше -- пока не почините указаный ХМЛ Томкат даже не будет пытатся задеплоить новый жар. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 16:45:28 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
Решил сделать небольшой рефакторинг проекта. 1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации. 2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets). 3. Пакет business, в котором вся логика, там несколько EJB бинов, а также.... и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу. В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 21:02:36 |
|
||
|
Вопрос о целостности данных. 2 процесса и несколько операций над таблицами.
|
|||
|---|---|---|---|
|
#18+
GeronemoРешил сделать небольшой рефакторинг проекта. 1. Теперь у меня не 5 проектов, а 1, в котором есть модули типа common и не надо дублировать кучу информации. 2. Я решил сделать 2 версии клиентского приложения и 2 версии web-tier слоя серверной части (REST и SErvlets). 3. Пакет business, в котором вся логика, там несколько EJB бинов, а также.... и вот тут возникает вопрос Я бы тут хотел иметь несколько постоянно функционирующих потоков, которые раз в несколько секунд дергали эти EJB бины, чтобы те апдейтили базу. В общем, я не знаю, как стартовать эти потоки. Должен быть какой-то Application с функцией типа main, но у меня там EJB бины. Похоже я тут немного запутался. ...вашето тут форум по мускл... ...контейнер сам разберется с бинами... их не надо инстанциировать в ручную... читайте книжки по жабе, дезайну, архитектурам, бест практизе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2015, 06:16:31 |
|
||
|
|

start [/forum/topic.php?fid=47&startmsg=38722312&tid=1832955]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 363ms |

| 0 / 0 |
