|
|
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Привет всем! Столкнулся с такой проблемой: необходимо выполнить определенное число SQL-запросов в цикле. Посоветуйте как правильно сделать. Вот урезанный код программы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2005, 20:35 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Переписал код таким образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Посоветуйте как теперь правильно закрывать объекты. Нужно ли в цикле while закрывать объект Connection ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2005, 23:56 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
На мой взгляд в цикле закрывать объект Connection не просто нет необходимости, но и неправильно, также нет необходимости каждый раз закрывать объекты resultset2, и ps! Я думаю это должно происходить примерно так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 07:12 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Хорошим тоном считается указание имен серверов и версии сипользуемых компонент. У тебя крупная ошибка если ты использует autocommit mode=true тот тогда та можеш иметь по спецификации только один открытый resultset. Некоторые севрера вообще могутиметь только один открытый resultset в одном connection. Далее надо оборачивать в try{} finally использование объектов. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 10:55 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
если не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet? ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 11:02 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Timmесли не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet? А прямо в документации на setAutoCommit. The commit occurs when the statement completes or the next execute occurs Т.е. когда у тебя идет excute в любом Statement вызывается commit, что равно закрытию всех ResultSet. Timm ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым. Хм. а имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 13:17 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Евгений Путилин Timmесли не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet? А прямо в документации на setAutoCommit. The commit occurs when the statement completes or the next execute occurs Т.е. когда у тебя идет excute в любом Statement вызывается commit, что равно закрытию всех ResultSet. Timm ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым. Хм. а имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически. 1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов. 2) а что утечка то? одного finally вполне достаточно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 13:47 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Timmиз одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true можно. только что проверил. ms sql 2000, jsqlconnect. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 13:49 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Timm 1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов. Не уверен что правильно понял. Смысл в том что ты при выполнении любого statement'а, получиш commit для Connection. Со всеми вытекающими последтвиями. Timm2) а что утечка то? одного finally вполне достаточно... Хм. а что будет с Connection если у тебя в ps.close() вылетит exception? Лично ловился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 13:51 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Евгений Путилин Timm 1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов. Не уверен что правильно понял. Смысл в том что ты при выполнении любого statement'а, получиш commit для Connection. Со всеми вытекающими последтвиями. Timm2) а что утечка то? одного finally вполне достаточно... Хм. а что будет с Connection если у тебя в ps.close() вылетит exception? Лично ловился дык пофиг на коммит. вопрос, насколько я понял, в другом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. finally - один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 13:58 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Hi Timm дык пофиг на коммит. вопрос, насколько я понял, в другом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. finally - один. О ужас =8-0 Ты не то считаеш, во первых у тебя 4 try проив 3-х моих. Во вторых у тебя на каждый ресурс по 4 дополнительных операции -- при объявлении Код: plaintext Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext Еще ты теряеш исключения коотрые происходят в close(). Т.е. ты написал почти то что и я, только обвешал многими дополнительными рющечками которые нафиг не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 14:50 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Я конечно не знаю постановку задачи, но нельзя ли использовать вместо: Код: plaintext вот это: Код: plaintext ? То есть nodes будет генериться в цикле, а потом ВНЕ цикла будет выполняться запрос... -- nexus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 15:02 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Евгений ПутилинHi Timm дык пофиг на коммит. вопрос, насколько я понял, в другом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. finally - один. О ужас =8-0 Ты не то считаеш, во первых у тебя 4 try проив 3-х моих. Во вторых у тебя на каждый ресурс по 4 дополнительных операции -- при объявлении Код: plaintext Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext Еще ты теряеш исключения коотрые происходят в close(). Т.е. ты написал почти то что и я, только обвешал многими дополнительными рющечками которые нафиг не нужны. 1) я плохо считаю? у тебя 6 try'ев. у меня - один основной. Try которые в finally - только для проформы. 2) Throwable на то и написано, что пойух, че там происходит. главное - обnull'ить по поводу рюшечек - не знаю что ты там имеешь ввиду... но твой код читать гораздо неудобней - каждй чих для чего то ловится, но сути не меняет. чтоб уж было понятно, вот 2 куска кода. твой Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 15:23 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Timm согласен с оратором. ----------------------------------- The Bat + My Gate Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 15:25 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Timm 1) я плохо считаю? у тебя 6 try'ев. у меня - один основной. Try которые в finally - только для проформы . Ясь ?, что не знаю применение этого слова к програмированию. Timm 2) Throwable на то и написано, что пойух, че там происходит. главное - обnull'ить. обнулять нафиг не Обнулять не надо вообще. Timmпо поводу рюшечек - не знаю что ты там имеешь ввиду... но твой код читать гораздо неудобней - каждй чих для чего то ловится, но сути не меняет. чтоб уж было понятно, вот 2 куска кода. твой Вот здесь ты приврал. Код: 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. 39. 40. 41. 42. Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. Количество try 6 штук. Timmчто лучше читается - по моему ясно. ну да, согласен только передергивать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 16:21 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
А зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать??? так вот напрмер нельзя? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 08:14 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
SherstПривет всем! Столкнулся с такой проблемой: необходимо выполнить определенное число SQL-запросов в цикле. Посоветуйте как правильно сделать. Вот урезанный код программы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Заранее спасибо. А что, параметризованные запросы уже под запретом?! По-моему, просто пишешь запрос с параметром и в цикле этот параметр меняешь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 08:51 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
LinerА зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать??? так вот напрмер нельзя? делать commit в блоке finally - не самая хорошая идея. хотя все зависит от задачи. в общем случае - это неправильно. к тому же в соотв. блоке catch лучше делать явный rollback. А.Грасоff™ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 08:53 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
LinerА зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать??? так вот напрмер нельзя? Код: 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. Что у тебя будет с connect.close(); если в connect.commit(); вылетит исключение например по deadlock ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 11:13 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™ делать commit в блоке finally - не самая хорошая идея. хотя все зависит от задачи. в общем случае - это неправильно. к тому же в соотв. блоке catch лучше делать явный rollback. А зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true). Евгений ПутилинЧто у тебя будет с connect.close(); если в connect.commit(); вылетит исключение например по deadlock ? Согласен, поторопился, нужно переместить commit выше в конец блока try и все, хотя если например нужно чтобы в базу пошли те запросы которые корректные и отработали до вылета, тогда commit нужно обернуть в еще try-catch Вопрос не о том хотел задать, вопрос зачем писать по 5 try-catch? Чтобы в правильном порядке закрыть resultset и statement? Но они и сами прекрасно закроются когда в текущем блоке кода больше не останется на них ссылок или когда закроется подключение. Зачем в них null записывать и городить для этого Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 11:29 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Liner А.Грасоff™ делать commit в блоке finally - не самая хорошая идея. хотя все зависит от задачи. в общем случае - это неправильно. к тому же в соотв. блоке catch лучше делать явный rollback. А зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true). Евгений ПутилинЧто у тебя будет с connect.close(); если в connect.commit(); вылетит исключение например по deadlock ? Согласен, поторопился, нужно переместить commit выше в конец блока try и все, хотя если например нужно чтобы в базу пошли те запросы которые корректные и отработали до вылета, тогда commit нужно обернуть в еще try-catch Вопрос не о том хотел задать, вопрос зачем писать по 5 try-catch? Чтобы в правильном порядке закрыть resultset и statement? Но они и сами прекрасно закроются когда в текущем блоке кода больше не останется на них ссылок или когда закроется подключение. Зачем в них null записывать и городить для этого Код: plaintext 1. 2. 3. 4. 5. 6. 7. следи за темой :) последнее - это мое. явное об'nullение - для случая когда на close() вылетит exeption. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 11:38 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Timmследи за темой :) последнее - это мое. явное об'nullение - для случая когда на close() вылетит exeption. Слежу, это тоже твое Timm ResultSet resultset = null; ... resultset = null; resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0"); А зачем нужно явное об'nullение всех объектов? Все ResultSet, Statement можно описать в блоке try - блок закрылся, все объекты ушли. Тем более пишут Евгений Путилина имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически а потом все равно их закрывают, на всякий случай наверное :-) И вот так должно нормально работать Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 12:03 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Liner Тем более пишут Евгений Путилина имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически а потом все равно их закрывают, на всякий случай наверное :-) Не на всякий случай а т.к. так принято. В освобождении ресурсов. Liner И вот так должно нормально работать Код: 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. Оно работать наверное будет. Можно вообще так написать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 17:06 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
LinerА зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true).а где про это сказано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 17:22 |
|
||
|
SQL-запросы
|
|||
|---|---|---|---|
|
#18+
Я так понимаю вопрос стоит в выборке древовидных структур из БД. Если да то ваш вариант подходит плохо только потому что уровень вложености ограничен тут нужны рекурсивные алгоритмы. Вообщем хотелось бы знать зачем такая структура нужна. Да кстати если в качестве сервера БД используется Oracle или скажем PostgreSQL то может подумать над использованием запроса Connect by prior? Он вам всю структуру за один запрос нарисует. Если де нет то может попробовать другую структуру БД когда у листьев только указатель на корневую ноду и поле LEVEL которое показывает глубину вложенности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 11:39 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33433012&tid=2150664]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 464ms |

| 0 / 0 |
