|
|
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Вопрос к знатокам Hibernate - возможно ли организовать такую штуку: Мне необходимо перехватывать ряд SQL запросов, которые генерируются hinernate'ом при изменении полей объекта, и желательно записывать их в спец. таблицу в БД. Я знаю что можно включить режим дебага, тогда все запросы пишутся в лог, а вот можно ли указать какой-нибудь кастомный логер, чтобы из него дописывать эти запросы в бд (или хотя бы в файл)? Может быть есть более простой способ организовать подобное? Не хочется просто на чистом JDBC все делать. Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 17:13:11 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Тут два момент. Настроить логгер на запись в базу, не проблема. Так же не проблема настроить логгер писать только те логи в которых SQL запросы хибера. Это все решается с log4j без особых трудностей. Трудности вызывает вторая часть вопроса. Подразумевается что эти запросы потом надо будет переиспользовать? А они все имеют вид для PreparedStatement то есть "... WHERE column = ?" И вытягивать реально подставляемые значения задача не тривиальная. Но в этом случае, я бы написал обертку над JDBC драйвером, которая сможет логировать заапросы наряду со значениями. Кстати, вопрос, из ряда "У меня есть не скажу какая задача, и я её решаю таким способом. Как мне этот способ осуществить?" Если расскажешь более общую задачу, может подскажем решение получше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 17:25:07 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПодразумевается что эти запросы потом надо будет переиспользовать? А они все имеют вид для PreparedStatement то есть "... WHERE column = ?" И вытягивать реально подставляемые значения задача не тривиальная. Но в этом случае, я бы написал обертку над JDBC драйвером, которая сможет логировать заапросы наряду со значениями. Да, необходимо писатьзапросы именно со значением (как их бд получает). Что-то мне внутренне подсказывало, что с этим могут быть трудности. BlazkowiczКстати, вопрос, из ряда "У меня есть не скажу какая задача, и я её решаю таким способом. Как мне этот способ осуществить?" Если расскажешь более общую задачу, может подскажем решение получше. Извиняюсь, критику принял :[ В более общем виде стоит задача оранизовать (т.е. сначала предусмотреть такую возможность) что-то вроде репликации. Существует N равноправных офисов, в каждом менеджеры вводят и просматривают данные (объем вставки/изменения данных сравнительно мал, изменятьданные могут только в офисе, в котором они изначально вводились). По возможности во всех офисах должна быть максимально одинаковая (и свежая) инфомация. Посадить их всех на единую БД нет возможности в основном из-за качества связи. В данном случае лучше наличие несколько устаревших данных, чем прекращение работы целого офиса в случае очердного обрыва связи. Отсуда и решение - лог вносимых изменений в бд с периодической (или моментальной) его отправкой. Синхронизация... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 17:48:12 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Огого. А в базе изменения вносить нельзя? Например триггера навесить? А то уж больно кривое решение вы выбрали для этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:06:01 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
samumИзвиняюсь, критику принял :[ В более общем виде стоит задача оранизовать (т.е. сначала предусмотреть такую возможность) что-то вроде репликации. Да, здесь и на других форумах процентов 80 таких вопросов. Никак не могу придумать определение этому феномену. samumСуществует N равноправных офисов, в каждом менеджеры вводят и просматривают данные (объем вставки/изменения данных сравнительно мал, изменятьданные могут только в офисе, в котором они изначально вводились). По возможности во всех офисах должна быть максимально одинаковая (и свежая) инфомация. Посадить их всех на единую БД нет возможности в основном из-за качества связи. В данном случае лучше наличие несколько устаревших данных, чем прекращение работы целого офиса в случае очердного обрыва связи. Отсуда и решение - лог вносимых изменений в бд с периодической (или моментальной) его отправкой. Синхронизация... Я бы начал решать задачу с поиска средств репликации прежде чем писать свою репликацию. И начинать поиск стоит как раз с базы данных. Это конечно уже отдельная тема для другого форума, но комерческие SQL сервера имеют вполне себе нормальную репликацию как раз для твоего случая. Для некомерческих есть ряд решений, которые можно к ним прикрутить. Так же я уверен, что существуют средства репликации реализованые на Java. Самому сталкиватся не приходилось. Но сомневаюсь что гугл не может в этом помочь. А вот если ты рассмотришь эти варианты и поймешь что тебе они не подходят. То тогда выкладывай эту самую причину сюда. И тогда можно обсуждать и свою репликацию в рамках этой причины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:09:47 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
samum Существует N равноправных офисов, в каждом менеджеры вводят и просматривают данные (объем вставки/изменения данных сравнительно мал, изменятьданные могут только в офисе, в котором они изначально вводились). По возможности во всех офисах должна быть максимально одинаковая (и свежая) инфомация. Посадить их всех на единую БД нет возможности в основном из-за качества связи. В данном случае лучше наличие несколько устаревших данных, чем прекращение работы целого офиса в случае очердного обрыва связи. - как вариант: JMS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:24:53 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Даже логирующие триггеры на всех изменяемых таблицах и то более правильным решением будут. Но лучше все-таки поискать штатные механизмы, и проще и правильнее и меньше проблем потом будет. Кроме того гарантированно будут учитываться все изменения в БД, независимо от того сделаны они через интерфейс системы, подправлены админами ручками/скриптами непосредственно в БД (согласитесь ошибки в данных случаются и их бывает надо править, иногда и массово) или через какую нибудь другую систему, которую руководство закажет через две недели после того, как вы завершите разработку вашей репликации. К тому же вполне вероятно, что рано или поздно измениться правило "изменять данные могут только в офисе, в котором они изначально вводились". Пусть для особо избранных, но от этого легче не будет ;) Разрешение коллизий еще одно преимущество с умом реализованных средств репликации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:27:02 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Kachalov samum Существует N равноправных офисов, в каждом менеджеры вводят и просматривают данные (объем вставки/изменения данных сравнительно мал, изменятьданные могут только в офисе, в котором они изначально вводились). По возможности во всех офисах должна быть максимально одинаковая (и свежая) инфомация. Посадить их всех на единую БД нет возможности в основном из-за качества связи. В данном случае лучше наличие несколько устаревших данных, чем прекращение работы целого офиса в случае очердного обрыва связи. - как вариант: JMS сначала Бритва Оккама ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:29:52 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
TiGДаже логирующие триггеры на всех изменяемых таблицах и то более правильным решением будут. Но лучше все-таки поискать штатные механизмы, и проще и правильнее и меньше проблем потом будет. С учетом того что проблемы даже с каналом, не исключено что и БД - Access. 8)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:30:39 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Kachalov- как вариант: JMS Это же все данные конвертировать в подходящую форму, а потом ещё и рассылать по узкому каналу? Или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 18:32:07 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz TiGДаже логирующие триггеры на всех изменяемых таблицах и то более правильным решением будут. Но лучше все-таки поискать штатные механизмы, и проще и правильнее и меньше проблем потом будет. С учетом того что проблемы даже с каналом, не исключено что и БД - Access. 8)) Вот и не угадали. БД - не коммерческая, это факт. Предъявляемые к ней требования - стандарт SQL92 и небольшой размер дистрибутива. Остается выбор между MySQl, Firebird или PostgreSql. В основном то, что я встречал - это репликации Master/Slave, когда в центральном например офисе данные вносятся, а все остальные их только лицезреют. У нас же ситуация такова, что есть обычно от 3 до 10 офисов, и они равноправны, т.е. репликация нужна Master/Master. Я таких репликаторов пока не встретил (плохо искал, наверное). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 19:26:49 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
TiGДаже логирующие триггеры на всех изменяемых таблицах и то более правильным решением будут. Но лучше все-таки поискать штатные механизмы, и проще и правильнее и меньше проблем потом будет. Кроме того гарантированно будут учитываться все изменения в БД, независимо от того сделаны они через интерфейс системы, подправлены админами ручками/скриптами непосредственно в БД (согласитесь ошибки в данных случаются и их бывает надо править, иногда и массово) или через какую нибудь другую систему Возможно логирущие триггеры и придется делать, если не найду хорошего репликатора :( TiGК тому же вполне вероятно, что рано или поздно измениться правило "изменять данные могут только в офисе, в котором они изначально вводились". Пусть для особо избранных, но от этого легче не будет ;) Разрешение коллизий еще одно преимущество с умом реализованных средств репликации. 99,9% что изменится. Ну как бы этот момент просчитывается при проектировании бд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 19:33:06 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Kachalov- как вариант: JMS Это же все данные конвертировать в подходящую форму, а потом ещё и рассылать по узкому каналу? Или как? - создаем DataObject, пихаем его в Message, Message отправляем в очередь, когда связь с центральным офисом (ЦО) восстановлена мессаджи от сабоффиса (СО) отправляются в ЦО, а мессаджи из ЦО в СО, происходит синхронизация данных между СО и ЦО. Прикидка грубая, это всего лишь вариант :) TiGБритва Оккама - спасибо за ликбез, но чта такое "бритва Оккама" знаю. Однако триггеры и прыггеры это тоже новые сущности, которые явно не упрощают систему, а кроме того усложняют ее развитие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 19:51:30 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Kachalov- создаем DataObject, пихаем его в Message, Message отправляем в очередь, когда связь с центральным офисом (ЦО) восстановлена мессаджи от сабоффиса (СО) отправляются в ЦО, а мессаджи из ЦО в СО, происходит синхронизация данных между СО и ЦО. Прикидка грубая, это всего лишь вариант :) Лично мне на первый взгляд подобное решение кажется слишком сложным. Не понятно как гарантировать синхронность с состоянием базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 22:42:01 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЛично мне на первый взгляд подобное решение кажется слишком сложным. Не понятно как гарантировать синхронность с состоянием базы. - так как связь не постоянна, то БД в ЦО по определению не синхронна с БД филиала, т. е. синхронизация производится периодически, при наличии соединения. - в те моменты когда производится синхронизация филиала с ЦО, она гарантированна так как все мессаджи которые отправлялись при внесении изменений в БД не пропали, они все сидят в очереди филиала и в теме ЦО - собственно JMS и создавалась в расчете на асинхронную доставку, здесь как раз такой случай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 23:57:22 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
samum TiGК тому же вполне вероятно, что рано или поздно измениться правило "изменять данные могут только в офисе, в котором они изначально вводились". Пусть для особо избранных, но от этого легче не будет ;) Разрешение коллизий еще одно преимущество с умом реализованных средств репликации.99,9% что изменится. Ну как бы этот момент просчитывается при проектировании бд. и при выборе механизма репликации, я надеюсь, тоже ;) Blazkowicz Лично мне на первый взгляд подобное решение кажется слишком сложным. Не понятно как гарантировать синхронность с состоянием базы.Как раз наоборот, схема с единым центральным узлом будет проще в сопровождении и самое главное надежнее и более производительна (последнее - исходя из посыла о качестве связи). Опять же разрешение коллизий проще делать на центральном узле. И особенно, если будет решено делать репликацию самостоятельно ;) Кроме того, централизованный сервер репликации можно использовать и еще для одной очень полезной вещи - гонять на нем отчетность к примеру. В среднем (по всем филиалам) он будет находиться в наиболее актуальном состоянии. что уж говорить про скорость получения нужной информации по сравнению с опросом всех филиалов. Kachalov- собственно JMS и создавалась в расчете на асинхронную доставку, здесь как раз такой случайЭто свойство обязательно для любого нормального механизма репликации. Имхо, все-таки лучше чуток времени потерять и поискать подходящее (по цене, функциональности, надежности, скорости, сложности изучения/сопровождения) готовое решение, чем изобретать своё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 15:16:32 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
TiG Blazkowicz Лично мне на первый взгляд подобное решение кажется слишком сложным. Не понятно как гарантировать синхронность с состоянием базы.Как раз наоборот, схема с единым центральным узлом будет проще в сопровождении и самое главное надежнее и более производительна (последнее - исходя из посыла о качестве связи). Опять же разрешение коллизий проще делать на центральном узле. И особенно, если будет решено делать репликацию самостоятельно ;) Кроме того, централизованный сервер репликации можно использовать и еще для одной очень полезной вещи - гонять на нем отчетность к примеру. В среднем (по всем филиалам) он будет находиться в наиболее актуальном состоянии. что уж говорить про скорость получения нужной информации по сравнению с опросом всех филиалов. На словах и в теории оно все красиво. Но я себе слабо представляю как должна работать репликация на уровне объектов так чтобы в чем-то превзойти репликацию на уровне БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 16:09:07 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz TiG Blazkowicz Лично мне на первый взгляд подобное решение кажется слишком сложным. Не понятно как гарантировать синхронность с состоянием базы.Как раз наоборот, схема с единым центральным узлом будет проще в сопровождении и самое главное надежнее и более производительна (последнее - исходя из посыла о качестве связи). Опять же разрешение коллизий проще делать на центральном узле. И особенно, если будет решено делать репликацию самостоятельно ;) Кроме того, централизованный сервер репликации можно использовать и еще для одной очень полезной вещи - гонять на нем отчетность к примеру. В среднем (по всем филиалам) он будет находиться в наиболее актуальном состоянии. что уж говорить про скорость получения нужной информации по сравнению с опросом всех филиалов. На словах и в теории оно все красиво. Но я себе слабо представляю как должна работать репликация на уровне объектов так чтобы в чем-то превзойти репликацию на уровне БД. Хм, я вообще то писал про преимущества репликации с единым центральным узлом в данной задаче. А то что не следует изобретать своих велосипедов, если можно найти готовый - см. мои посты выше. Как и про то, что даже если надумают писать своё, то JMS - почти наверняка лишняя сущность ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 16:42:32 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
TiGА то что не следует изобретать своих велосипедов, если можно найти готовый - см. мои посты выше. - как называется "готовый велосипед" и где его можно скачать? TiG Как и про то, что даже если надумают писать своё, то JMS - почти наверняка лишняя сущность ;) - конечно, писать свое, реализуя сетевые протоколы, очереди и сервера! Это будет надежно и эффективно работать и что ценно - "не одной новой сущности" :) Прославим Россию как родину изобретателей! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 17:29:12 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Kachalov TiGА то что не следует изобретать своих велосипедов, если можно найти готовый - см. мои посты выше. - как называется "готовый велосипед" и где его можно скачать? Репликация в том или ином виде существует для всех основных вендоров БД. Даже Master2Master. Хотя наверное, кроме SQL Server и Orcale с Master2Master вряд ли кто-то адекватно справляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 17:46:05 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Хотя наверное, кроме SQL Server и Orcale с Master2Master вряд ли кто-то адекватно справляется. Эх, в том то и все дело... А так, конечно, мало очень желания изобретать собственные квадратные колеса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 17:57:16 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Kachalov TiGА то что не следует изобретать своих велосипедов, если можно найти готовый - см. мои посты выше. - как называется "готовый велосипед" и где его можно скачать? TiG Как и про то, что даже если надумают писать своё, то JMS - почти наверняка лишняя сущность ;) - конечно, писать свое, реализуя сетевые протоколы, очереди и сервера! Это будет надежно и эффективно работать и что ценно - "не одной новой сущности" :) Прославим Россию как родину изобретателей!Взяв первый из списка samumВот и не угадали. БД - не коммерческая, это факт. Предъявляемые к ней требования - стандарт SQL92 и небольшой размер дистрибутива. Остается выбор между MySQl, Firebird или PostgreSql.первой же ссылкой в гугле получаем MySQL 5.0 Reference Manual :: 15 Replication . Даже если там нет таких наворотов как в Oracle Advanced Replication, все равно это штатный механизм, на базе которого можно построить свою репликацию, при необходимости дополнив ее нужными фичами. А вы про протоколы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 18:04:26 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Репликация в том или ином виде существует для всех основных вендоров БД. Даже Master2Master. Хотя наверное, кроме SQL Server и Orcale с Master2Master вряд ли кто-то адекватно справляется. - как то плохо представляется автоматическая двунаправленная репликация в момент установления связи филиала с ЦО, защищенная от сбоев при передаче данных. По моему без внешней логики не обойтись. Хотя конечно я не специалист по соответствующим продуктам (Oracle, MS SQL Server), возможно есть готовые решения, которые стоят дешевле чем разработка самоделок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 18:08:27 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
TiG MySQL 5.0 Reference Manual :: 15 Replication - как же, как же, читали : автор Replication enables data from one MySQL database server (called the master) to be replicated to one or more MySQL database servers (slaves) - в руководстве администратора MySQL написано что Slave может выступать и как Master для построения цепочки реплицируемых серверов, возможно таким образом и удастся решить задачу, но что-то нет уверенности что замкнув два сервера друг на друга мы не получим зацикливания или еще чего то странного :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 18:17:04 |
|
||
|
Перехват SQL запросов в Hibernate
|
|||
|---|---|---|---|
|
#18+
TiGпервой же ссылкой в гугле получаем MySQL 5.0 Reference Manual :: 15 Replication . Даже если там нет таких наворотов как в Oracle Advanced Replication, все равно это штатный механизм, на базе которого можно построить свою репликацию, при необходимости дополнив ее нужными фичами. А вы про протоколы Да это можно сказать первое, что я прочитал по теме :)) Штатный механизм обеспечивает только Master/Slave репликацию, т.е. все филиалы пишут на какую-то одну (условно центральную) базу, а читают с одной из реплик (ближайшей, например, из локальной сети). Чтобы обеспечить то что я хотел бы получить - типа мастер/мастер, мануал рекомендует кластеризацию. Особенности реализации этой самой кластеризации в MySQL несолько... Ну в общем не подходит кластеризация... Там и требования к связи должны быть иными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2007, 18:17:12 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34818681&tid=2144550]: |
0ms |
get settings: |
15ms |
get forum list: |
24ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
85ms |
get topic data: |
23ms |
get forum data: |
6ms |
get page messages: |
124ms |
get tp. blocked users: |
3ms |
| others: | 320ms |
| total: | 614ms |

| 0 / 0 |
