|
|
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пишу standalone приложение. Приложение работает с MySQL. У меня есть интерфейс java.sql.Connection объекта для работы с базой данных - connection. Этот интерфейс находится в отдельном классе Database. Указатель на объект класса Database я передаю в конструкторы всех классов, которые работают с базой данных, будь то фрейм или какой-либо поток. В приложении есть куча фреймов, с помощью которых пользователь имеет возможность просматривать, добавлять или изменять данные в базе данных. Так вот, есть необходимость отслеживать все изменения, сделанные в базе данных из данного приложения. Можно конечно это делать в каждом классе, который вносит такие изменения, но этот способ - потенциальный источник ошибок, так как можно забыть или пропустить что-то. Куда проще и интереснее было бы использовать какое-нибудь событие самого соединения, ведь оно же должно знать о всех успешных UPDATE и DELETE. И так как все фреймы используют одно соединение, то можно было бы легко отслеживать все изменения. Но в данном интерфейсе нет методов для добавления слушателей событий. Хотелось бы узнать, кто как делает. С уважением Vector. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 07:52 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
p6spy (http://www.p6spy.com/) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 09:23 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
VectorКуда проще и интереснее было бы использовать какое-нибудь событие самого соединения, ведь оно же должно знать о всех успешных UPDATE и DELETE. И так как все фреймы используют одно соединение, то можно было бы легко отслеживать все изменения. А по-моему, довольно проблематично отследить изменения. Например, если через Connection СУБД отправлен следующий запрос Код: plaintext По-моему, такую задачу следует решать либо на более "высоком" уровне (при изменении данных, приложение будет указывать, кто их меняет), либо на уровне СУБД (аудит, триггера и т.п.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 09:37 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Для меня важен только факт изменения. Поясню. У меня к одной базе может быть подключены несколько приложений. В базе есть специальная таблица, куда каждый клиент заносит (серверное) время после своего последнего изменения. Также в каждом клиенте есть поток, который сверяет с определенной периодичностью значение своего времени последнего изменения и времени в этой таблице. Если они не совпадают, то вызывается функция обносвления данных во всех фреймах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 09:42 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
авторУ меня есть интерфейс java.sql.Connection объекта для работы с базой данных - connection. Этот интерфейс находится в отдельном классе Database. Указатель на объект класса Database я передаю в конструкторы всех классов, которые работают с базой данных, будь то фрейм или какой-либо поток. Не в тему топика, но такую вещь лучше синглтоном сделать. Паттерн если не в курсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 15:45 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
А теперь в тему. Проше всего функции UPDATE и DELETE оформить в виде хранимых процедур, а помимо выполнения обновления, ... фиксировать кто, куда, зачем, ... в другой таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 15:56 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
VectorУ меня есть интерфейс java.sql.Connection По другому поводу, но мне однажды потребовалось обмануть готовые библиотеки. Для этого я подменил jdbc-драйвер, разрегистрировал стандартный и зарегистрировал под его именем свою прокладку. Оказалось весьма и весьма несложно. Можно таким образом всадить необходимый notification. Хотя я отметил бы, что по-хорошему это задача для Data Access Layer, и это одна из причин, по которым я предпочитаю не просто использовать стандартные классы, но сразу делать от них тривиальных собственных наследников и использовать их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 16:44 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Оказывается, автор не сразу дал точную постановку задачи, но уточнил VectorДля меня важен только факт изменения. Поясню. У меня к одной базе может быть подключены несколько приложений. В базе есть специальная таблица, куда каждый клиент заносит (серверное) время после своего последнего изменения. Также в каждом клиенте есть поток, который сверяет с определенной периодичностью значение своего времени последнего изменения и времени в этой таблице. Если они не совпадают, то вызывается функция обносвления данных во всех фреймах. В оригинальном java.sql события, уведомляющего о том, что в БД произошли изменения, нет. Но некоторые СУБД реализуют такую возможность. Есть ли она в MySQL, не знаю. В любом случае, процитированная идея вполне работоспособна. По крайней мере при малом количестве пользователей или невысокойих активности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 17:23 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
для прокладок: java.lang.reflect.Proxy - одно из удобных решений. регистрация/дерегистрация драйвера при этом не нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 17:35 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Timmдля прокладок: java.lang.reflect.Proxy - одно из удобных решений. регистрация/дерегистрация драйвера при этом не нужна. Спасибо за информацию, пороюсь на досуге. Не знал об этой возможности; быстрым поиском по гуглю удачных примеров не нашел. Сходу я не увидел, каким образом этот прокси сам по себе, без манипуляций с драйвером, поможет поймать вызов драйвера. Если не трудно, пожалуйста проясните это момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 18:01 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
сам прокси ничего не ловит. Он позволяет создавать на лету объект, класс которого реализует заданный набор интерфейсов (ех. Statement), при этом реализацию своей логики он передает InvocationHandler'у. Т.е. выглядит все примерно так: 1. пишется класс реализующий InvocationHandler. у него один метод: invoke(Object proxy, Method method, Object[] args). 2. создается прокси инстанс, с логикой этого хэндлера. 3. вызов методов прокси инстанса диспатчится хэндлером. 4. в хэндлер можно добавить свою логику - например для трейса. собственно этого достаточно чтобы избежать манипуляций с драйвером - его логика остается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 18:30 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Timm3. вызов методов прокси инстанса диспатчится хэндлером. Это понятно. По сути, прокси позволяет избежать реализации набора "тупых" методов (состоящих из одной строки вызова оригинального метода) за счет необходимости реализации большого switch-а в методе хандлера. Timm4. в хэндлер можно добавить свою логику - например для трейса. собственно этого достаточно чтобы избежать манипуляций с драйвером - его логика остается. А вот этого я не понимаю. Есть библиотека, которой я делаю Код: plaintext Эта библиотека создает jdbc-соединение и использует его. Мне нужно, чтобы использовались не стандартные классы драйвера, но доработанные мной. Куда и как мне здесь всунуть прокси? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 18:38 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 10:38 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Timm Код: plaintext Я же вроде как сказал - внутри себя этот объект создает jdbc-соединение и использует его. Мне нужно вмешаться в его общение с БД. Вы говорите о том, что это можно сделать без подмены драйвера за счет создания прокси. Я пытаюсь выяснить - как. Timmвот пример из книги (Java Refelection in Action): Хм. И? Все подобные примеры, которые я вчера просмотрел, подразумевали собственноручное подсовывание созданного прокси-объекта тому, кто собирается им пользоваться. В том числе и этот. Итак, у нас есть объект, который внутри себя делает Код: plaintext Мне нужно, чтобы при этом он получил экземпляр моего класса. И я пока не понимаю, как сделать это без подмены драйвера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 11:26 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
softwarer Код: plaintext Мне нужно, чтобы при этом он получил экземпляр моего класса. И я пока не понимаю, как сделать это без подмены драйвера. А ты получай Connection через java.sql.DataSource - его реализацию легко сделать - в нем и будешь осуществлять подмену. А имя класса ( реализцющего DataSource ) пропиши в конфиг/куда угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 11:38 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
softwarer... Итак, у нас есть объект, который внутри себя делает Код: plaintext Мне нужно, чтобы при этом он получил экземпляр моего класса. И я пока не понимаю, как сделать это без подмены драйвера. я говорил о проксировании стандартного, а не о его подмене. Код: plaintext Код: plaintext 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. 37. 38. softwarerВсе подобные примеры, которые я вчера просмотрел, подразумевали собственноручное подсовывание созданного прокси-объекта тому, кто собирается им пользоваться. В том числе и этот. что значит собственноручное? ну используется какой то factory метод. в нем и будет добавлено проксирование при необходимости. я вообще не понимаю, зачем в коде писать прямо DriverManager.getConnection(...). это должно быть спрятано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 12:35 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Ненавижу регистрациюА ты получай Connection через java.sql.DataSource Я-то могу его получать как угодно. Но вот декомпилировать библиотеку и править способ, которым получает она - не хочется. Точнее, явно невыгодно (подмену драйвера я свалял за полчаса, а патчить под себя каждую вновь выходящую версию библиотеки потребует явно больше усилий). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 17:22 |
|
||
|
java.sql.Connection есть ли способ отслеживать изменения в БД
|
|||
|---|---|---|---|
|
#18+
Timmя говорил о проксировании стандартного, а не о его подмене. Вы сказали о том, что при применении этой технологии подмена драйвера не обязательна. Я прошу таки рассказать, как эта технология позволяет без нее обойтись. Код: plaintext Timmкривоватый пример, конечно. но смысл то понятен: добиться перехватывания методов определенного класса и выполнять свою логику. все. никаких подмен драйверов. Да вот нет, смысл как раз непонятен. Мне нужно перехватывать не методы определенного класса - это делается тривиальным наследованием - а методы определенного объекта, причем этот объект создается в недоступном мне месте. Timmчто значит собственноручное? ну используется какой то factory метод. в нем и будет добавлено проксирование при необходимости. я вообще не понимаю, зачем в коде писать прямо DriverManager.getConnection(...). это должно быть спрятано. Хм. Опуская прочие моменты - может быть getConnection и незачем писать, но как факт какие-то идиоты его написали. И мне нужно, чтобы этот getConnection вернул мой объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 17:36 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33579655&tid=2150024]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
204ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 584ms |

| 0 / 0 |
