|
|
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
Добрый день, в jave новичок, в спринге тем более. Возник такой вопрос: как перенести на spring довольно простой jdbc-код. Суть в том, что нужно один раз сделать prepare для каждого используемого DML, и затем использовать их в одном соединении с БД для пакетной вставки данных ПОРЦИЯМИ одновременно в несколько таблиц, периодически делая commit , после некоторого количества порций данных (то есть использовать несколько транзакций). Как в спринге это сделать, не могу пока понять. Есть batchUpdate, но он не дает возможность делать вставку порциями в несколько таблиц (1000 строк в мастер-таблицу, потом соответствующие строки в таблицы деталей, затем коммит, затем снова порция данных в мастер и в детали). Если использовать несколько batchUpdate по отдельности, то нет возможности сделать prepare один раз, и расходуется лишняя память (необходимо подготовить отдельный список с одной порцией). jdbc-код метода вставки результатов расчета в БД примерно такой: Код: java 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 14:14:45 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
LVA, а каким боком тут нужен spring? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 14:59:21 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
am_sasa, уже написанный код находится на инспекции. требование главного архитектора - перенести все на спринг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:00:56 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
LVA, ну тогда делай из Код: java 1. 2. 3. 4. 5. поля класса с сеттерами а в спринге Код: xml 1. 2. 3. 4. 5. зачем тут еще спринг нужен не знаю.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:22:16 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
am_sasa, дело не в инжекте этих полей. Требование - уйти от работы на уровне jdbc :) Если что то действительно нельзя сделать иначе, кроме как через jdbc, то надо аргументировать, почему нельзя. Сейчас требование такое: работать через jdbcTemplate, который собственно и будет инжектиться. Доступ к данным вынести в DAO. Алгоритм должен дергать какой нибудь DAO, в котором будет пакетная вставка с помощью jdbcTemplate, ну или чего-то подобного). но вот я не нахожу в jdbcTemplate возможности сделать по человечески то, что сделано сейчас на jdbc. то ли задача нестандартная, то ли просто не там или не так ищу, потому что опыта нет в данной технологии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:35:54 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
По идее если обернуть 2-3 вызова JdbcTepmlate.BatchUpdate() в одном @Transactional методе, то они будут в одной транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:18:32 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
и рулить уже имя с помощью Propagation.REQUIRED и Propagation.REQUIRES_NEW ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:25:03 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
pavel_nv, в БД будут вставляться сотни тысяч записей (в каждую из таблиц, в некоторые из таблиц деталей - миллионы), каждый отдельный JdbcTepmlate.BatchUpdate() - это новый prepareStatement, как я понимаю. это явно не хорошо. Один из вопросов: как добиться многократного использования уже отпрепаренного стэйтмента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:28:23 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
pavel_nvи рулить уже имя с помощью Propagation.REQUIRED и Propagation.REQUIRES_NEW это уже другой вопрос. если у меня @Transactional метод, делает чтение из БД, обработку и переходит к записи. я, допустим, запись в БД выношу в еще один @Transactional метод - это что будет: новое соединение (сессия) или новая транзакция в том же соединении ? нужно второе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:31:07 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
LVA, то что на 1к записей БД будет парсить запрос 1 раз - в пределах погрешности, я б не заморачивался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:35:25 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
pavel_nvто что на 1к записей БД будет парсить запрос 1 раз - в пределах погрешности, я б не заморачивался. система (и БД) высоконагруженная. таблиц много. размер пачки настраивается. например, для оракла рекомендуется 100, максимум 500 записей в пачке, далее заметного прироста производительности не наблюдается. зато ресурсов тратится намного больше. правда, это рекомендация для pl/sql, где нет передачи данных по сети, может при работе через jdbc->DOA рекомендации и другие, не знаю. честно говоря, такой рефакторинг приводит только к ухудшению характеристик. печально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:48:23 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
для начала я бы проверил а) поддерживается ли на уровне драйвера и бд кэширование стейтментов б) на сколько просядет производительность на batchUpdate. если заметно - доложить шефу. если фигня - делать как велят. c) почему нужно вставлять именно 1000 мастер, 1000 деталь1, 1000 деталь2? почему нельзя все мастер по 1000, все деталь1 по 1000 и т.д.? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 17:55:08 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
chpasha, 1. поддерживается 2. не уверен, что замер в тепличных условиях и замер в боевых (многопользовательская высоконагруженная система с большой конкуренцией за ресурсы) будут сопоставимы. да и объем данных такой мне на имеющейся локальной БД не потянуть. Попробовал бы все равно замерить, но под спринг код еще не написан, когда напишу - можно посмотреть. но пока вопрос - стоит ли так вообще писать. и можно ли написать как то по другому, но через спринг. 3. потому что нужно соблюсти целостность данных. 1000 строк мастера, и все его детали - это цельная информация, которая коммитится. А иметь закоммиченными 1 млн строк матстера без деталей - это кривые данные :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 18:20:48 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
LVAchpasha, 1. поддерживается тогда по логике ты ничего не выигрываешь. LVAкогда напишу - можно посмотреть. но пока вопрос - стоит ли так вообще писать. и можно ли написать как то по другому, но через спринг. можно, но это будет в стиле "шоб отстали". jdbcStatement.execute(ConnectionCallback) и ему подобные. но я бы накатал с batchUpdates и хоть приблизительно сравнил замеры. кстати на 100k записях возможно есть смысл подумать о средствах сервера, типа load from file или что там у вас. LVA3. потому что нужно соблюсти целостность данных. 1000 строк мастера, и все его детали - это цельная информация понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 20:10:18 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
LVA, у тебя банальная заливка данных. - спринг не для заливки данных - я так понимаю, что заливка - это разовый процесс (ночной и т.д.) Поэтому какая тут конкуренция и с кем? ЗЫ. Не писать. Либо сделать замеры для "архитектора". Возможно его не интересует производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 23:17:42 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
Petro123- спринг не для заливки данных имеется в виду спринговая обертка вокруг jdbc и спринговые декларативные транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 23:25:47 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
chpasha, ну, ты как всегда сужаешь, а я расширяю. Я имел ввиду, что jdbc тут самое верное и гибкое решение (минимальное перед всякими СУБД-приблудами). И не нужны тут никакие шаблоны, ОРМы и ДАО. Но конкретно, что хочет его шеф, надо его звать. Удачи аффтару. ______________________________________________ "Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 23:54:52 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
chpashaLVAchpasha, 1. поддерживается тогда по логике ты ничего не выигрываешь. не хотелось бы оффтопить. тема не об этом. просто скажу, что разница, безусловно, есть. так называемый "мягкий парсинг". Другое дело, оказывает ли эта разница заметное влияние. это вопрос сложный. Том Кайт говорит, что разница эта особенно заметна в высоконагруженных многопользовательских средах. В однопользовательском особой разницы, по видимому не будет. Исследовать этот вопрос в высоконагруженной среде для меня не представляется возможным. Но учитывать это надо, и если известно, что лучше парсить один раз, а не 1000, то надо делать именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2013, 01:18:51 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
Petro123LVA, у тебя банальная заливка данных. - спринг не для заливки данных - я так понимаю, что заливка - это разовый процесс (ночной и т.д.) Поэтому какая тут конкуренция и с кем? ЗЫ. Не писать. Либо сделать замеры для "архитектора". Возможно его не интересует производительность. у меня не банальная заливка, а мощная расчетная процедура в системе 24х7, и работать она может в любой момент, параллельно с ней работают (и изменяют данные) еще много-много сессий. Поскольку объем расчитанных данных очень велик, и время расчета тоже велико, то сохранять все в одной транзакции довольно смело. посему реализован механизм порционного сохранения, а алгоритм поддерживает инкрементальный досчет в случае ошибок. Petro123Я имел ввиду, что jdbc тут самое верное и гибкое решение (минимальное перед всякими СУБД-приблудами). И не нужны тут никакие шаблоны, ОРМы и ДАО. Но конкретно, что хочет его шеф, надо его звать. я тоже так думаю, что никакие фреймворки здесь не нужны. лучше, чем на JDBC, не сделать. И это для меня наиболее понятный и простой код, поскольку с БД дружу. А с архитектором спорил до хрипоты. но он хочет, чтобы все и у всех было в одном стиле. А стиль этот он всем собирается прививать :)) JDBC - работать нельзя, мол придет кто то после меня - ничего в этом не поймет. вот так :) Даже работать со Statement-ом или RecordSet-ом (полученным в том числе и из спринга) напрямую не дает. Возможный resource leak - вот такой странный для меня аргумент. Используйте callback-интерфейсы, ага. хотя, если руки кривые, то всегда можно налажать, даже со спрингом, который сам управляет ресурсами, выдав мне в руки распрекрасный jdbcTemplate. В итоге, кто то (я ) должен уступить, иначе дело встанет. Поэтому это тоже оффтоп :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2013, 01:37:15 |
|
||
|
знатокам spring-а
|
|||
|---|---|---|---|
|
#18+
pavel_nv 10.5.7 Transaction propagation да, читал, но не совсем понял. когда REQUIRED_NEW, то написано, что используется новая транзакция, но не ясно до конца, новая ли это сессия ? или это что то вроде автономной транзакции (хотя для этого вроде бы есть еще PROPAGATION_NESTED) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2013, 01:41:42 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=246&tid=2130038]: |
0ms |
get settings: |
19ms |
get forum list: |
27ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
41ms |
get topic data: |
22ms |
get forum data: |
5ms |
get page messages: |
112ms |
get tp. blocked users: |
3ms |
| others: | 296ms |
| total: | 541ms |

| 0 / 0 |
