powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC создание и закрытие соединений в отдельном классе
25 сообщений из 39, страница 1 из 2
JDBC создание и закрытие соединений в отдельном классе
    #39237810
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу создать класс, который будет загружать драйвер и выдавать соединения с бд, а также закрывать их.
Код: 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.
public class DataSource {
	
	// constructor
	DataSource() throws ClassNotFoundException{
		String driverName = "com.mysql.jdbc.Driver";
		
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			System.out.println("Can't load driver!");
			throw e;
		}
	}
	
	public Connection getConnection() throws SQLException{
		
		String url = "jdbc:mysql://localhost:3306/world";
		String password = "password";
		String login = "root";
		
		Connection con = null;		

		try {
			con = DriverManager.getConnection(url, login, password);
		} catch (SQLException e) {
			System.out.println("Error getting connection!");
			throw e;
		} 
		
		return con;
	}
	
	public void closeConnection(Connection con) throws SQLException{
		try {
			con.close();
		} catch (SQLException e) {
			System.out.println("Can't close connection!");
			throw e;
		}
	}
}



При этом хочу, чтобы методы были статическими и не нужно было бы создавать экземпляр класса.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
...

method () {
    Connection con = Datasource.getConnection();
    Statement st = con.createStatement();
    ....
}

...



Пару вопросов:

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 раз ? И в какой момент?)? Если так то в статическом блоке мы же не можем пробросить исключение в случае чего, как быть с этим ?
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39237824
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,
посмотри java8, и куча хотелок отпадет за ненадобностью
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39237829
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
достаточно один раз сделать
Class.forName(driverName);

потом, внужном месте
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
try (Connection con = DriverManager.getConnection(Base, Base_login, Base_password);
                CallableStatement proc = ....
            rs = proc.executeQuery();
            rs.next();
            
        } catch (SQLException ex) {
           
        }


всё будет закрыто автоматом
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39237837
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,

ИМХО посмотрите в сторону Spring.
Там можно ч/з Spring-JDBC можно работать с JDBC ч\з DI.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39237894
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreenХочу создать класс, который будет загружать драйвер и выдавать соединения с бд, а также закрывать их.
Какая от него польза по сравнению с javax.sql.DataSource ?

faustgreenПри этом хочу, чтобы методы были статическими и не нужно было бы создавать экземпляр класса.

Это ущербное желание. Таким образом вы создадите себе методы работы с БД глобальной видимости и будете использовать их в любом классе проекта, совершенно не заботясь о такой ерунде как coupling и cohesion. Почитайте о проблеме глобальных переменных.

faustgreen
Код: java
1.
2.
3.
4.
5.
method () {
    Connection con = Datasource.getConnection();
    Statement st = con.createStatement();
    ....
}


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. Но вам бы я порекомендовал просто взять за аксиому что статика это зло. Она убивает полиморфизм и даёт глобальную видимость. С одной стороны вы можете просто следовать этому совету. Но с другой стороны, смело делайте статику и тогда вы прочувствуете на собственном опыте все её "прелести". Будет проще понять. Правда, если проект маленький, есть шанс не прочувствовать.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238015
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulfaustgreen,

ИМХО посмотрите в сторону Spring.
Там можно ч/з Spring-JDBC можно работать с JDBC ч\з DI.
в спринг-ЖДБС кстати, коннекшины рулятся непосредственно спрингом. Суть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238027
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTУан стэп ахеад - и мы приходим к хиберу.
Вообще нет.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238030
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTСуть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу.
ты пердлагаешь с 1-го по 5-ый класс в школе не посещать и сдать экстерном?
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238034
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Это произойдет только один раз сколько бы вы Class.forName() не вызывали. Пока только не удалим драйвер из DriverManager вручную.
Хотя, если разрегать драйвер и вызывать только Class.forName(), то он повторно не зарегается. Статическая инициализация повторно не вызывается. А вот newInstance() может повлиять.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238068
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen, смотри. Здесь читается попытка написать свой менеджер соединений (достаточно general-задачка)
и в то-же время пароли и логины и ip хардкодятся что само по себе противоречит первому пункту.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238230
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПредлагаю проследовать в гугл с вопросом "singleton antipattern"
А есть тынц, где аргументированно раскрывают эту тему? Я вот честно искал (и раньше, и сейчас), находится какое-то невнятное мычание дескать так делать нехорошо, это не #trueoop и т.д. и т.п. Например, есть у меня настройки приложения, я делают синглетон, т.к. хочу быть уверенным в том, что откуда я к ним не обращусь это будут одни и те же настройки, что здесь плохого?
Не говоря о различных перформансных штуках, синглетон не плодит мусор, статик методы прекрасно оптимизируются HotSpot'ом (как минимум безболезненный инлайнинг).
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238295
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirА есть тынц, где аргументированно раскрывают эту тему?

Неа. Давно было. Основных проблем две.
1) Ты никогда не можешь быть уверен что у тебя синглтон всегда таким останется. Вот взять код ТС. Когда у него в ТЗ появится требования обращаться к двум разным БД, то его замечательный код резко станет бесполезным. Либо мы его копипастим для новой БД. Либо рефакторим из синглтона в обычный экземпляр.

2) public static getInstance() метод имеет глобальную видимость. И это побуждает вызывать его не только там где это действительно нужно, а и вообще везде где это можно.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238330
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz1) Ты никогда не можешь быть уверен что у тебя синглтон всегда таким останется. Вот взять код ТС. Когда у него в ТЗ появится требования обращаться к двум разным БД, то его замечательный код резко станет бесполезным. Либо мы его копипастим для новой БД. Либо рефакторим из синглтона в обычный экземпляр.
Эмм... Ну допустим, представил себе такое, тогда появится у него какая-нибудь условно фабрика, которую будем просить - хочу работать с базой 1, хочу работать с базой 2, при этом у нас всего будет 2 инстанса, для каждой БД по своему экземпляру.

Blazkowicz2) public static getInstance() метод имеет глобальную видимость. И это побуждает вызывать его не только там где это действительно нужно, а и вообще везде где это можно.
Ну это звучит в стиле "Дай дураку стеклянныйЗаставь дурака молиться, он и лоб расшибет", что мешает мне через DI прикручивать обращения, там где этого не стоит делать?
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238331
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirчто мешает мне через DI прикручивать обращения, там где этого не стоит делать?
Когда у тебя DI, тебе метод getInstance() нафиг не нужен. И твой синглтон легко превращается в не синглтон без всякого рефакторинга. В коде ТС так просто не получится.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238375
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczКогда у тебя DI, тебе метод getInstance() нафиг не нужен. И твой синглтон легко превращается в не синглтон без всякого рефакторинга. В коде ТС так просто не получится.
А в вашей личной практике, на сколько часто меняете синглетон на прототайп у бинов, то есть не проставляете изначально, а так, что жило-было приложение, там был синглетон бин, а потом раз, требования изменились и пришлось поставить прототайп?
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238386
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirА в вашей личной практике, на сколько часто меняете синглетон на прототайп у бинов
При чем тут scope из Spring IoC.
На практике, ситуация, когда сегодня был синглтон, а завтра - уже нет, встречалась не редко. В принципе, на каждом проекте, где разработка занимает больше года.

just_vladimirто есть не проставляете изначально, а так, что жило-было приложение, там был синглетон бин, а потом раз, требования изменились и пришлось поставить прототайп?
Речь вообще не о спринге. Prototype тут вообще не при чем. Нужен был второй экземпляр со своим id. То что у него scope в Spring называется singleton, к проблеме в коде автора никакого отношения не имеет.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238394
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
у ТС вообще нет упоминаний про синглетон, он хочет класс со статическими методами, вполне себе нормальное желание.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238400
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirу ТС вообще нет упоминаний про синглетон, он хочет класс со статическими методами, вполне себе нормальное желание.
Это обычный синглтон, только без полиморфизма. Нормальное желание сделать что-то своё пусть и через жопу.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238424
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123andreykaTСуть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу.
ты пердлагаешь с 1-го по 5-ый класс в школе не посещать и сдать экстерном?
Мне кажется, что особо нет смысл изучать старословянский алфавит перед тем, как перейти к современному :)
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238445
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
))
class = new Class - это не старославянский супротив DI
))
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238459
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за информацию, сейчас все буду разбирать. Пароли жестко прописанные в коде - это временно, для теста.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238569
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczjust_vladimirу ТС вообще нет упоминаний про синглетон, он хочет класс со статическими методами, вполне себе нормальное желание.
Это обычный синглтон, только без полиморфизма. Нормальное желание сделать что-то своё пусть и через жопу.
Звучит как - все что написано в процедурном стиле это синглтон.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238586
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirBlazkowiczпропущено...

Это обычный синглтон, только без полиморфизма. Нормальное желание сделать что-то своё пусть и через жопу.
Звучит как - все что написано в процедурном стиле это синглтон.
Это вообще не процедурный стиль. Тут класс с состоянием под одну роль.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238717
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЭто вообще не процедурный стиль. Тут класс с состоянием под одну роль.
Я вот в упор не вижу здесь наличия состояния, а то что формально это java класс, то в данном случае по сути это не более чем своего рода неймспейс.
...
Рейтинг: 0 / 0
JDBC создание и закрытие соединений в отдельном классе
    #39238720
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTв спринг-ЖДБС кстати, коннекшины рулятся непосредственно спрингом. Суть роль программера - это лишь городить запросы и маппинг сущностей. :) Уан стэп ахеад - и мы приходим к хиберу.

Вот как раз с точностью до наоборот.
Обычно стараюсь перейти с хибера на JdbcTemplate. :-)
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC создание и закрытие соединений в отдельном классе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]