|
|
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Хочу создать класс, который будет загружать драйвер и выдавать соединения с бд, а также закрывать их. Код: 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. При этом хочу, чтобы методы были статическими и не нужно было бы создавать экземпляр класса. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Пару вопросов: 1). Как сделать то, что я хочу? 2). Правильно ли я понимаю - метод Class.forName(String name); - загружает класс драйвера в память и тот регистрирует себя в DriverManager-е. Драйвер доступен до тех пор пока на него есть ссылка в DriverManager-е? 3). Для работы с базой нам достаточно загрузить один экземпяр класса Driver (все другие загрузки будут избыточными)? Например, у нас будет 2 отдельных класса, которые будут работать с БД и у каждого будет свое соединение, нам же не нужно загружать драйвер дважды? 4). Чем отличается загрузка класса Class.forName(String name); от new Driver();? Class.forname - эта динамическая загрузка (run-time) и мы можем вынести имя драйвера в файл свойств, например, для того чтобы при необходимости сменить драйвер через конфигурацию? 5). Если создать класс со статическим блоком инициализации и поместить туда загрузку драйвера, то он опять же зарегистрируется в DriverManager и будет доступен пока на него есть ссылка (При этом это произойдет только 1 раз ? И в какой момент?)? Если так то в статическом блоке мы же не можем пробросить исключение в случае чего, как быть с этим ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 00:57 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
faustgreen, посмотри java8, и куча хотелок отпадет за ненадобностью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 04:41 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
достаточно один раз сделать Class.forName(driverName); потом, внужном месте Код: java 1. 2. 3. 4. 5. 6. 7. 8. всё будет закрыто автоматом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 05:45 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
faustgreen, ИМХО посмотрите в сторону Spring. Там можно ч/з Spring-JDBC можно работать с JDBC ч\з DI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 06:35 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
faustgreenХочу создать класс, который будет загружать драйвер и выдавать соединения с бд, а также закрывать их. Какая от него польза по сравнению с javax.sql.DataSource ? faustgreenПри этом хочу, чтобы методы были статическими и не нужно было бы создавать экземпляр класса. Это ущербное желание. Таким образом вы создадите себе методы работы с БД глобальной видимости и будете использовать их в любом классе проекта, совершенно не заботясь о такой ерунде как coupling и cohesion. Почитайте о проблеме глобальных переменных. faustgreen Код: java 1. 2. 3. 4. 5. try with resource потерялся. Пользы от того что getConnection() статический - ноль. Предлагаю проследовать в гугл с вопросом "singleton antipattern" faustgreen 1). Как сделать то, что я хочу? У вас уже сделано. В чем вопрос? По-хорошему, конечно, стоило начать и изучение Apache Commons DBUtils, Apache Commons DBCP, Spring JdbcTemplate и других готовых решений. faustgreen 2). Правильно ли я понимаю - метод Class.forName(String name); - загружает класс драйвера в память и тот регистрирует себя в DriverManager-е. Драйвер доступен до тех пор пока на него есть ссылка в DriverManager-е? Не совсем. Слово "загружает" здесь не уместно. Класс может быть уже загружен при вызове этого метода. Кстати, спецификация JDBC требует ещё и вызова newInstance(). Так как в древности драйвера регистрировали себя из конструктора. Но в реальном мире они регистрируют себя в статическом инициализаторе, поэтому особой надобности в newInstance() нет. faustgreen 3). Для работы с базой нам достаточно загрузить один экземпяр класса Driver (все другие загрузки будут избыточными)? Например, у нас будет 2 отдельных класса, которые будут работать с БД и у каждого будет свое соединение, нам же не нужно загружать драйвер дважды? И вот тут начинается куча недопонимания построенного на заблуждении "загрузить драйвер". JVM грузит один класс только один раз. Вы не можете загрузить класс два раза. Правда, есть нюанс. Один и тот же байт-код загруженый разными ClassLoader-ами считается разными классами с точки зрения JVM. Про "своё" соединение тут тоже не к месту. Вы три отдельных темы спутали в один процесс. 1. Загрузка класса в JVM это один процесс. 2. Регистрация Driver в DriverManager это другой процесс. 3. Управление содеинениями - это тоже отдельный вопрос. Эти трое вообще не пересекаются, не надо их смешивать. faustgreen 4). Чем отличается загрузка класса Class.forName(String name); от new Driver();? Class.forname - эта динамическая загрузка (run-time) и мы можем вынести имя драйвера в файл свойств, например, для того чтобы при необходимости сменить драйвер через конфигурацию? В Java вся загрузка динамическая (runtime). Но направление мысли верное. Таким образом избегается статическая зависимость от драйвера. faustgreen 5). Если создать класс со статическим блоком инициализации и поместить туда загрузку драйвера, то он опять же зарегистрируется в DriverManager и будет доступен пока на него есть ссылка (При этом это произойдет только 1 раз ? И в какой момент?)? Драйвера уже имеют блок статический инициализации. Поэтому разницы особой нет. Это произойдет только один раз сколько бы вы Class.forName() не вызывали. Пока только не удалим драйвер из DriverManager вручную. faustgreen Если так то в статическом блоке мы же не можем пробросить исключение в случае чего, как быть с этим ? Это первый звоночек. Конечно, будет обычный ExceptionInInitializerError. Но вам бы я порекомендовал просто взять за аксиому что статика это зло. Она убивает полиморфизм и даёт глобальную видимость. С одной стороны вы можете просто следовать этому совету. Но с другой стороны, смело делайте статику и тогда вы прочувствуете на собственном опыте все её "прелести". Будет проще понять. Правда, если проект маленький, есть шанс не прочувствовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 09:19 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
mad_nazgulfaustgreen, ИМХО посмотрите в сторону Spring. Там можно ч/з Spring-JDBC можно работать с JDBC ч\з DI. в спринг-ЖДБС кстати, коннекшины рулятся непосредственно спрингом. Суть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 10:55 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
andreykaTУан стэп ахеад - и мы приходим к хиберу. Вообще нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 11:06 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
andreykaTСуть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу. ты пердлагаешь с 1-го по 5-ый класс в школе не посещать и сдать экстерном? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 11:09 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Это произойдет только один раз сколько бы вы Class.forName() не вызывали. Пока только не удалим драйвер из DriverManager вручную. Хотя, если разрегать драйвер и вызывать только Class.forName(), то он повторно не зарегается. Статическая инициализация повторно не вызывается. А вот newInstance() может повлиять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 11:12 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
faustgreen, смотри. Здесь читается попытка написать свой менеджер соединений (достаточно general-задачка) и в то-же время пароли и логины и ip хардкодятся что само по себе противоречит первому пункту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 11:29 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПредлагаю проследовать в гугл с вопросом "singleton antipattern" А есть тынц, где аргументированно раскрывают эту тему? Я вот честно искал (и раньше, и сейчас), находится какое-то невнятное мычание дескать так делать нехорошо, это не #trueoop и т.д. и т.п. Например, есть у меня настройки приложения, я делают синглетон, т.к. хочу быть уверенным в том, что откуда я к ним не обращусь это будут одни и те же настройки, что здесь плохого? Не говоря о различных перформансных штуках, синглетон не плодит мусор, статик методы прекрасно оптимизируются HotSpot'ом (как минимум безболезненный инлайнинг). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 13:56 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
just_vladimirА есть тынц, где аргументированно раскрывают эту тему? Неа. Давно было. Основных проблем две. 1) Ты никогда не можешь быть уверен что у тебя синглтон всегда таким останется. Вот взять код ТС. Когда у него в ТЗ появится требования обращаться к двум разным БД, то его замечательный код резко станет бесполезным. Либо мы его копипастим для новой БД. Либо рефакторим из синглтона в обычный экземпляр. 2) public static getInstance() метод имеет глобальную видимость. И это побуждает вызывать его не только там где это действительно нужно, а и вообще везде где это можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 14:43 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Blazkowicz1) Ты никогда не можешь быть уверен что у тебя синглтон всегда таким останется. Вот взять код ТС. Когда у него в ТЗ появится требования обращаться к двум разным БД, то его замечательный код резко станет бесполезным. Либо мы его копипастим для новой БД. Либо рефакторим из синглтона в обычный экземпляр. Эмм... Ну допустим, представил себе такое, тогда появится у него какая-нибудь условно фабрика, которую будем просить - хочу работать с базой 1, хочу работать с базой 2, при этом у нас всего будет 2 инстанса, для каждой БД по своему экземпляру. Blazkowicz2) public static getInstance() метод имеет глобальную видимость. И это побуждает вызывать его не только там где это действительно нужно, а и вообще везде где это можно. Ну это звучит в стиле "Дай дураку стеклянныйЗаставь дурака молиться, он и лоб расшибет", что мешает мне через DI прикручивать обращения, там где этого не стоит делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 15:05 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
just_vladimirчто мешает мне через DI прикручивать обращения, там где этого не стоит делать? Когда у тебя DI, тебе метод getInstance() нафиг не нужен. И твой синглтон легко превращается в не синглтон без всякого рефакторинга. В коде ТС так просто не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 15:08 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКогда у тебя DI, тебе метод getInstance() нафиг не нужен. И твой синглтон легко превращается в не синглтон без всякого рефакторинга. В коде ТС так просто не получится. А в вашей личной практике, на сколько часто меняете синглетон на прототайп у бинов, то есть не проставляете изначально, а так, что жило-было приложение, там был синглетон бин, а потом раз, требования изменились и пришлось поставить прототайп? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 15:35 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
just_vladimirА в вашей личной практике, на сколько часто меняете синглетон на прототайп у бинов При чем тут scope из Spring IoC. На практике, ситуация, когда сегодня был синглтон, а завтра - уже нет, встречалась не редко. В принципе, на каждом проекте, где разработка занимает больше года. just_vladimirто есть не проставляете изначально, а так, что жило-было приложение, там был синглетон бин, а потом раз, требования изменились и пришлось поставить прототайп? Речь вообще не о спринге. Prototype тут вообще не при чем. Нужен был второй экземпляр со своим id. То что у него scope в Spring называется singleton, к проблеме в коде автора никакого отношения не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 15:40 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, у ТС вообще нет упоминаний про синглетон, он хочет класс со статическими методами, вполне себе нормальное желание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 15:47 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
just_vladimirу ТС вообще нет упоминаний про синглетон, он хочет класс со статическими методами, вполне себе нормальное желание. Это обычный синглтон, только без полиморфизма. Нормальное желание сделать что-то своё пусть и через жопу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 15:51 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Petro123andreykaTСуть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу. ты пердлагаешь с 1-го по 5-ый класс в школе не посещать и сдать экстерном? Мне кажется, что особо нет смысл изучать старословянский алфавит перед тем, как перейти к современному :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 16:12 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
andreykaT, )) class = new Class - это не старославянский супротив DI )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 16:22 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Спасибо за информацию, сейчас все буду разбирать. Пароли жестко прописанные в коде - это временно, для теста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 16:34 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
Blazkowiczjust_vladimirу ТС вообще нет упоминаний про синглетон, он хочет класс со статическими методами, вполне себе нормальное желание. Это обычный синглтон, только без полиморфизма. Нормальное желание сделать что-то своё пусть и через жопу. Звучит как - все что написано в процедурном стиле это синглтон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 18:57 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
just_vladimirBlazkowiczпропущено... Это обычный синглтон, только без полиморфизма. Нормальное желание сделать что-то своё пусть и через жопу. Звучит как - все что написано в процедурном стиле это синглтон. Это вообще не процедурный стиль. Тут класс с состоянием под одну роль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 19:28 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭто вообще не процедурный стиль. Тут класс с состоянием под одну роль. Я вот в упор не вижу здесь наличия состояния, а то что формально это java класс, то в данном случае по сути это не более чем своего рода неймспейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2016, 06:25 |
|
||
|
JDBC создание и закрытие соединений в отдельном классе
|
|||
|---|---|---|---|
|
#18+
andreykaTв спринг-ЖДБС кстати, коннекшины рулятся непосредственно спрингом. Суть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу. Вот как раз с точностью до наоборот. Обычно стараюсь перейти с хибера на JdbcTemplate. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2016, 06:53 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39238030&tid=2124048]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 400ms |

| 0 / 0 |
