|
|
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo3. Потоки, которые лязят в базу раз в несколько секунд каждый раз открывают и закрывают соединение. вполне возможно обойтись без потоков......? Что они конкретно делают и где стартуют? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 21:35 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Geronemo Код: java 1. 2. 3. 4. 5. 6. [/SRC] слона надо есть по частям (с) - вставь после старта транзакции процедуру payment = GetMyPayment(); - вынеси в неё всю лабуду. - убери из кода все потоки и доп обработку таблиц. - запусти нагрузочно на 30 мин просто вставку в БД .... работает? Похоже я решил проблему, апгрейднув немного класс HibernateUtil, который создавал sessionFactory и оттуда создавались сессии. Я этот класс нагуглил и тупо вставил. Он имел не совсем законченный вид, но меня это тогда не смутило, т. к. я вообще х. з., что это такое, имею с этим делом первый раз. В общем, было вот так. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Я решил, что метод createSessionFactory можно вызвать и один раз и сделать вот так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Запустил стресс-тест, пока что все норм. Часик посмотрю, что будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 21:49 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo, раз уж класс утилитный, то можно побольше кишков туда спрятать Код: java 1. 2. 3. 4. 5. 6. 7. 8. Код: java 1. 2. 3. 4. 5. 6. 7. - try везде ставь - сдаётся мне, что в коде выше можно одну сессию хибера на весь блок while "протянуть" imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2014, 22:28 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Есть еще один момент, который я упустил, когда переводил всю работу с БД на Hibernate. Код: java 1. 2. 3. 4. Вот тут мне надо бы узнать id новой записи и Timestamp. Метод save класса Session что-то возвращает, вопрос - можно ли из этого что-то вытащить хотя бы id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 00:41 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
GeronemoВот такое у меня в doPost сервлета, куда посылается несколько сотен запросов в секунду. Без Hibernate все эти запросы успевали обрабатываться.Без ORM вы работали с подключением? Лично я ORM не знаю, но, тем не менее, не уверен, что "ORM session" == "JDBC connection"А здесь висяк уже после 15 Код: java 1. 2. 3. 4. 5. 6. Давайте переведём это всё на SQL. ORM, как я уже отмечал, мне неизвестен, но с кочки зрения эрудиции и банальной логики, должно быть: Код: sql 1. 2. 3. 4. "По моему так" (ц) Винни-Пух Возникает вопрос - для чего явно стартовать транзакцию, если достаточно разрешить autocommit и "просто вставлять"? Соответственно, вместо гадания на кофейной гуще путём тасования методов единственного класса, имеет смысл изучить документацию Hibernate на предмет "просто вставки". P.S. Спросив у гугля Hibernate insert получил на третьей позиции Chapter 15. Batch processing , которая начинается с рассмотрения случая очень похожего на ваш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 03:26 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo, лучше конечно сначала хоть немного разобраться. От такого перехода с jdbc на hibernate будет только вред, сплошные глюки и тормоза. Вот только несколько фактов из приведенного выше кода: - configuration.configure() действительно нужно делать пореже, лучше всего, 1 раз, так как тут работа с ресурсами, достаточно долгая. - configuration.buildSessionFactory() надо делать еще реже, тут идет составляение словаря, сопоставление меппингов с классами и т.п. Эта операция очень долгая - следует научиться работать с транзакциями, если хочется коммитить на каждый чих, то лучше просто воспользоваться автокоммитом. Лучше, конечно, использовать 1 транзакцию на метод, а еще лучше - на бизнес-транзакцию. При работе с транзакциями в обязательно порядке использовать try finally, учесть, что возможны эксепшены, а значит, нужны и роллбеки. Наконец, отдать управление транзакциями серверу/менеджеру - понять, что сессия хибернейт - это не просто аналог коннекта, а также и локальный кеш данных, позволяющий при правильном использовании работать с базой даже быстрее чем на чистом jdbc. Точно так же, как и с транзакциями, не надо открывать и закрывать сессию на каждый чих - разобраться с коннектами. Что там в конфигурации? Открывать "физический" коннект на каждый чих тоже большая роскошь. Читать про пулы и их конфигурирование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 10:27 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
GeronemoВот тут мне надо бы узнать id новой записи и Timestamp. Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 10:39 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123GeronemoВот тут мне надо бы узнать id новой записи и Timestamp. Код: java 1. 2. Спасибо, это работает. Но есть один очень грустный момент. При перезапуске сервера (Tomcat 7.0) session.save(myclass); начинает генерить id сначала. А мне нужно, чтобы БД как-то запоминало последний id. хм... А я в другом потоке вытаскиваю все записи из этой таблицы (BufferPaymentTable) и помещаю в другую (OperationPaymentTable). Т. е. обнаружилась сложность, как мне писать id так, чтобы при перезапуске сервера нумерация продолжалась с того момента, где закончилась в предыдущий раз. Вариант решения. Каждый раз при инициализации сервера я могу слазить в БД, в эту другую таблицу (OperationPaymentTable) и посмотреть максимальный id там. Потом как-то сообщить БД, чтобы session.save(myclass); продолжало с id+1 (а оно пишет в BufferPaymentTable). Или же есть какой-то способ попроще. Кстати, все еще открыт вопрос, про то, как мне получать текущеее время записи полученных данных. Потому как myclass = (MyСlass) session.get(MyСlass.class, myclass.getId()); получает id, а мне еще нужно и currenttime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP. Неужели делать еще один запрос в БД, т. е. всего их будет 3 ? (1 - запись, 2-й прочитали id, 3-й по этому id прочитали currenttime) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 14:31 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
И еще вопрос. Посоветуйте книгу/руководство по SQL. Ищу сейчас работу java-программера, везде где был надо знать SQL на более-менее приличном уровне (а не моем - сделать insert, update и delete). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 14:33 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo, почему сразу при приходе объекта его не записать и не обработать? Зачем 5 сек? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 14:43 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemoначинает генерить id сначала ))) прикольно. Измени маппинг Id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 14:51 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemoтекущеее время записи полученных данных. myclass.geXXXXXXX()) не работает? .... Если обрабатывать сразу, то время вообще не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 14:53 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Geronemo, почему сразу при приходе объекта его не записать и не обработать? Зачем 5 сек? Таковы требования к системе. Вкратце. Есть около несколько десятеов тыс. клиентов, которые формируют в среднем несколько сотен запросов в секунду. Обработка каждого запроса зависит от внешних серверов, которые нам неподвластны. Поэтому все входящие запросы пишутся в буферную таблицу. Тут наше дело просто зарегистрировать запрос. Вы обращали внимание, что в сервисах приема платежей, в интернет-банках, когда вы отправляете запрос на платеж, то обычно вам дается ответ ввиде "Платеж принят на обработку id=xxxxxxx", а не ввиде "ваш платеж успешно исполнен". Я пишу именно такую систему. Сначала все запросы становятся в очередь (помещаются в буферную таблицу). Далее другое приложение (возможно установленное на другом физ. сервере) забирает порциями эти запросы в другую таблицу, передает данные обработчику, который связывается с удаленным сервером некого оператора услуг, получает ответ и пишет его в базу. Давайте тему этих взаимодействий не будем обсуждать. Это ТЗ. Мое дело реализовать это наиболее быстрым и надежным способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 19:28 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
GeronemoДавайте тему этих взаимодействий не будем обсуждать. Это ТЗ. Мое дело реализовать это наиболее быстрым и надежным способом. А мы хотим обсуждать. Может мы тебе JMS присоветуем. А тебя за инициативу нагрядят. Или побъют. Впрочем это неважно. Главное чтоб форум был интересен а не решал чьи-то меркантильные задачки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 19:34 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
maytonGeronemoДавайте тему этих взаимодействий не будем обсуждать. Это ТЗ. Мое дело реализовать это наиболее быстрым и надежным способом. А мы хотим обсуждать. Может мы тебе JMS присоветуем. А тебя за инициативу нагрядят. Или побъют. Впрочем это неважно. Главное чтоб форум был интересен а не решал чьи-то меркантильные задачки. Ну можно и пообсуждать, я непротив выслушать интересные мысли. Почему у меня организовано именно так, я изложил выше. Если каждому входящему запросу (а их несколько сотен) дать ресурсы на немедленную полную обработку, то все повиснет из-за того,что они будут ломиться по одному на связь со внешними серверами. А так мы можем их как-то выстроить в очередь, некоторые запросы скомпоновать и передать в одном пакете несколько запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 19:56 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
maytonнагрядят. Или побъют.Впрочем это неважно. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 19:59 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemoвыстроить в очередь очередь какая то странная - "while" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 20:01 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Geronemoвыстроить в очередь очередь какая то странная - "while" Задумывалась как временная конструкция. Но, очень хорошо работает, т. ч. надо будет еще голову поломать, чем это заменить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 20:47 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Geronemoтекущеее время записи полученных данных. myclass.geXXXXXXX()) не работает? .... Если обрабатывать сразу, то время вообще не нужно. Там дело не в маппинге, а втом, что эта таблица постоянно очищается. И если перезапустить Сервер, то движок Hibernate забудет, что в этой таблице когда-то присутствовали данные. Если честно, то, когда у меня работа с БД была через jdbc, тогда вероятно была та же самая ошибка, но я ее не заметил. В общем, я х. з., нужен совет по этой теме. Сейчас у меня в маппинг-файле написано такое Код: xml 1. 2. 3. 4. Я сделал небольшой метод в классе Hibernate Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. И он работает. В процессе инициализации сервера я вызываю эту функцию. Только вот остался вопрос, как заставить BufferPaymentTable назначать id не с 1, а с этого полученного мною значения. Пробовал payment.setId(startId); session.save(payment); Но не работает, все равно id пишет с еденицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 22:03 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo, что за бред? Если инкремент не твой доморощенный, а самой СУБД, то она его никогда не забудет)). Даже оракл в своей 12-ой версии всё таки ввел такое поле) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 22:12 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Geronemo, что за бред? Если инкремент не твой доморощенный, а самой СУБД, то она его никогда не забудет)). Даже оракл в своей 12-ой версии всё таки ввел такое поле) <class name="Payment" table="BufferPaymentTable"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class=" increment " /> </id> Вот при таком маппинге СУБД забывает инкремент и при перезапуске Томката начинает с id=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 22:33 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo, ложись спать. Я уже сказал - измени маппинг. Я твой маппинг видел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 22:37 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Geronemo, конструкция getNextId() не гарантирует уникальных идентификаторов, если только её вызов не сериализован. Если очень хочется получить управляемый счетчик, то лучше завести для него специальную таблицу и использовать встроенный table-generator (@TableGenerator) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2014, 23:01 |
|
||
|
org.hibernate.MappingException: Java Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Geronemo, ложись спать. Я уже сказал - измени маппинг. Я твой маппинг видел. Неплохо бы подсказочку тут. Методом тыка убивается слишком много времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2014, 00:17 |
|
||
|
|

start [/forum/topic.php?fid=59&startmsg=38735481&tid=2126566]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 495ms |

| 0 / 0 |
