powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Объединение sql запросов в один класс - упрощение (Обновлено)
79 сообщений из 79, показаны все 4 страниц
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632103
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не кидать тапками.

Я создавал тему подобную уже. Но не хочется писать там ибо много сообщений.

Я постараюсь описать все от а до я что бы не было кучи лишних вопросов и прочего, одним словом срача.

Итак. Я не использую никакие фреймворки, ОРМ и прочее - все пишется ручками (используются либы). Почему так? Поясняю - Проект начинал писаться без этого всего и сейчас, когда он уже почти готов и в нем просто дофига функционала, переписывать никто не будет ибо а) нет на это времени и б) нет средств. По сему, пожалуйста, не надо про это писать. Я знаю как сейчас делается, но причину по которой переделываться не будет я озвучил.


Есть класс DataSource (Синглтон). Предоставляется библиотекой Commons dbcp2. Служит для пула подключений (при старте приложения создаётся 10 подключений к бд и хранятся в BasicDataSource).


Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
public class DataSource {

	private static final DataSource INSTANCE = new DataSource();

	private final BasicDataSource basicDataSource = new BasicDataSource();

	private DataSource() {

		try {

            basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");

            basicDataSource.setUrl("jdbc:mysql://localhost:3306/db");

            basicDataSource.setUsername("root");

            basicDataSource.setPassword("root");

            basicDataSource.setInitialSize(10);

            basicDataSource.setMaxWaitMillis(180000);

            basicDataSource.setDefaultAutoCommit(true);

            basicDataSource.setPoolPreparedStatements(true);

            basicDataSource.setConnectionProperties("useUnicode=true;characterEncoding=utf8");

            QueryRunner queryRunner = new QueryRunner(basicDataSource);

			queryRunner.update("SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';");
			queryRunner.update("SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';");

		} catch (Exception e) {
			
		}

	}

	public static DataSource getInstance() {
		return INSTANCE;
	}

	public BasicDataSource getDataSource() {
		return basicDataSource;
	}

	public static JSONObject getDbResultObject(ResultSet rs) throws SQLException {
		JSONObject result = new JSONObject();
		int index = 0;
		while(rs.next()) {
			result.put(index, getDbRow(rs));
			index++;
		}
		return result;
	}

	public static JSONArray getDbResultArray(ResultSet rs) throws SQLException {
		JSONArray result = new JSONArray();
		while(rs.next()) {
			result.add(getDbRow(rs));
		}
		return result;
	}

	public static JSONObject getDbSingleRow(ResultSet rs) throws SQLException {
		return rs.next()? getDbRow(rs): new JSONObject();
	}

	private static JSONObject getDbRow(ResultSet rs) throws SQLException {
		JSONObject result = new JSONObject();
		ResultSetMetaData meta = rs.getMetaData();
		for(int i=0;i<meta.getColumnCount();i++) {
			Object obj = rs.getObject(i+1);
			if(obj instanceof Time) {
				String date = TIME_FORMAT.format((java.util.Date) obj);
				result.put(meta.getColumnLabel(i+1), date);
			} else if(obj instanceof Timestamp) {
				String date = DATE_TIME_FORMAT.format((java.util.Date) obj);
				result.put(meta.getColumnLabel(i+1), date);
			} else if(obj instanceof java.util.Date) {
				String date = DATE_FORMAT.format((java.util.Date) obj);
				result.put(meta.getColumnLabel(i+1), date);
			} else {
				result.put(meta.getColumnLabel(i+1), rs.getObject(i+1)==null?"":obj);
			}
		}
		return result;
	}

}




Далее.

Есть классы в которых прописаны запросы к бд. Это не синглтоны.
Их всего 3:
DataBaseUser(Запрос которые отвечают за пользователя),
DataBaseAdmin(Запросы которые относятся к внутреннему функционалу проекта),
DataBaseChat (Запросы которые относятся к чату)

Я специально разделил эти запросы: Все запросы относятся только к той области где они применяются. К примеру DataBaseChat обслуживает чат.

Код DataBaseAdmin:

Код: 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.
public class DataBaseAdmin {

    private QueryRunner queryRunner;
    
    public DataBaseUser(BasicDataSource basicDataSource) {
        this.queryRunner = new QueryRunner(basicDataSource);
    }

    // Примеры запросов
    public JSONArray userGetPayments(int userId, boolean paid, boolean active, boolean wait, boolean finish, boolean activate) throws SQLException {
        return getQueryRunner().query("SELECT p.*, s.id AS site_id, url FROM payments AS p LEFT JOIN site AS s ON s.id=p.site_id WHERE p.user_id = ? AND p.paid = ? AND active = ? AND wait = ? AND finish = ? AND (activate = ?  OR activate = ?);", new ResultSetHandler<JSONArray>() {
            public JSONArray handle(ResultSet rs) throws SQLException {
                return DataSource.getDbResultArray(rs);
            }
        }, userId, paid, active, wait, finish, activate, !activate);
    }

    public JSONObject userGetInfo(int userId) throws SQLException {
        return getQueryRunner().query(SqlCore.SQL_USER_INFO_GET, new ResultSetHandler<JSONObject>() {
            public JSONObject handle(ResultSet rs) throws SQLException {
                return DataSource.getDbSingleRow(rs);
            }
        }, userId);
    }

    public int paymentAdd(Payment pm) throws SQLException {
        return getQueryRunner().insert(SqlCore.SQL_PAYMENT_ADD, new ScalarHandler<Long>(), pm.getUserId(), pm.getSiteId(), pm.getRateId(), pm.getStart(), pm.getEnd(), pm.isPaid(), pm.isActive(), pm.isWait(), pm.isFinish(), pm.isActivate()).intValue();
    }

    public boolean paymentUpdate(Payment pm) throws SQLException {
        return getQueryRunner().update(SqlCore.SQL_PAYMENT_UPDATE, pm.getUserId(), pm.getSiteId(), pm.getRateId(), pm.getStart(), pm.getEnd(), pm.isPaid(), pm.isActive(), pm.isWait(), pm.isFinish(), pm.isActivate(), pm.isError(), pm.getMessage(), pm.getId())>0;
    }

}



Остальные два класса похожи конструктором и полем - все остальное разное.

Тут прописаны все запросы. В каждой выборке могут быть своя обработка результата. Запросы бывают 3 типов: QUERY, INSERT, UPDATE.
Сами запросы я делаю при помощи библиотеки Commons DbUtils - QuerryRunner. Ему передаётся BasicDataSource из которого достаётся Connection.

Использование этих классов:

Код: java
1.
2.
3.
4.
BasicDataSource BDS = Core.getDataSource();

DataBaseUser dbUser = new DataBaseUser(BDS);
DataBaseAdmin dbAdmin = new DataBaseAdmin(BDS);



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

Код: java
1.
BDS.getConnection().close();



Вот такая вот система. Знаю не очень удобно и красиво.
Теперь вопрос.

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

Код: java
1.
2.
3.
4.
5.
 DataBase db = new DataBase(getDataSource());

 db.getDbUser().getUserIdByHash(user.getHash())

 db.close();



Пример самого класса DataBase:

Код: 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.
public class DataBase {

    private DataBaseUser dbUser;
    private DataBaseAdmin dbAdmin;
    private DataBaseChat dbChat;

    private QueryRunner queryRunner;

    public DataBase(BasicDataSource basicDataSource) {

        queryRunner = new QueryRunner(basicDataSource);

        dbUser = new DataBaseUser(queryRunner);
        dbAdmin = new DataBaseAdmin(queryRunner);
        dbChat = new DataBaseChat(queryRunner);

    }

    public DataBaseUser getDbUser() {
        return dbUser;
    }

    public DataBaseAdmin getDbAdmin() {
        return dbAdmin;
    }

    public DataBaseChat getDbChat() {
        return dbChat;
    }

    public void close() throws SQLException {
        queryRunner.getDataSource().getConnection().close();
    }

}



Может есть более элегантный вариант?

Спасибо за внимание!
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632126
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
что ты делаешь с json, которые тебе возвращают твои запросы?
кто формирует запросы?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632129
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяTsyklop,
что ты делаешь с json, которые тебе возвращают твои запросы?
кто формирует запросы?

JSON перегоняю в объект посредством Gson . Знаю может это не совсем ахти. но пока что так. Пытался сделать аля ОРМ.

Формирует их QuerryRunner - по сути он делает PrepareStatment, подставляет переданные параметры в знаки ? в строке запроса. Ну а ResultSetHandler служит для обработки результата запроса.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632139
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
конечная цель полученных данных?
отправка клиентк? объект это что?
зачем столько преобразований?

запрос на получении откудп приходит? от клиента?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632171
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
Никакого смысла в объединении класса по работе с чатом с классом Users нету.
И ты так членораздельно и не объяснил зачем это нужно.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632202
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopJSON перегоняю в объект посредством Gson я бы сразу делал из результсета объект (хотя надо знать что это за объект и для чего он нужен, может это шаг пропустить)
и почему не сделать так
три класса
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public class dbAdmin | dbUser | dbChat{


 public XObject (......){
      try (Connection con = dataSource.getConnection();
             Statement st = con.createStatement()){
            st.executeQuery("Select ....;");
           
         .... результсет в объект...

        } catch (SQLException | IOException ex) {
           ..................
        }
 return объект;
}

public YObject (..){...}



}


а в синглтоне dataSource...
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632207
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяTsyklop,
конечная цель полученных данных?
отправка клиентк? объект это что?
зачем столько преобразований?

запрос на получении откудп приходит? от клиента?

Не только. Смотря какой запрос приходит то и делается. Нужен объект для работы с ним вот и вытягиваю. Не обязательно он отдаётся клиенту
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632208
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
За меня это все делает QuerryRunner в каждом по сути запросе.
Можно как-то сделать с QuerryRunner, что бы как-то обобщить все.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632209
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123И ты так членораздельно и не объяснил зачем это нужно
а говорил, что живешь давно ;)
понятно зачем - хочется создавать один объект вместо трех, иметь один "супер" класс.

ТС - зачем создавать еще одну тему о том же самом? ты думаешь набегут другие, которые тебе что-то присоветуют? не набегут - тут только мы. А если бы набежали, то начали советовать все тоже самое, на 5ти страницах. Можно сделать только либо так, как ты уже написал, либо скинуть все обратно в один файл. Какой магии ты еще в этом месте ожидаешь?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632212
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpashaТС - зачем создавать еще одну тему о том же самом? ты думаешь набегут другие, которые тебе что-то присоветуют? не набегут - тут только мы. А если бы набежали, то начали советовать все тоже самое, на 5ти страницах. Можно сделать только либо так, как ты уже написал, либо скинуть все обратно в один файл. Какой магии ты еще в этом месте ожидаешь?

первый пост читали? я объяснил почему я создал новую тему.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632215
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopпервый пост читали? я объяснил почему я создал новую тему
я обычно читаю и даже иногда понимаю написанное. Объяснение - курам насмех, тема - исчерпана. Если собираешься продолжать в подобном ключе, будешь очень быстро послан нахер
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632219
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaМожно сделать только либо так, как ты уже написал, либо скинуть все обратно в один файл
+1))
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
//либо 
контекстПодсистемы = new Подсистема_A();
контекстПодсистемы.Работаем()
...
контекстПодсистемы = new Подсистема_B();
контекстПодсистемы.Работаем()
//либо
контекст = new Подсистема А+B
контекст.Работаем()


chpashaпонятно зачем - хочется создавать один объект вместо трех, иметь один "супер" класс.
я бы понял, если бы он до этого не разделил всё на 3 класса))
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632220
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaОбъяснение - курам насмех, тема - исчерпана. Если собираешься продолжать в подобном ключе, будешь очень быстро послан нахер
+1
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632223
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopпервый пост читали? я объяснил почему я создал новую тему.
Но понятнее, ведь, не стало. Конструкторы не нужны. Нужны синглтоны и Dependency Injection.

Смотрите вот ваш код:

Код: java
1.
2.
3.
4.
5.
DataBase db = new DataBase(getDataSource());

 db.getDbUser().getUserIdByHash(user.getHash())

 db.close()



Код нарушает SRP, потому что в нем инфраструктура смешана с бизнес-логикой.

Инфраструктура
Код: java
1.
2.
3.
DataBase db = new DataBase(getDataSource());
db.get...
db.close()


Её не должно быть в каждом методе где вы пытаетесь использова DbUser или другой аналогичный класс.
Бизнес-логика:
Код: java
1.
dbUser.getUserIdByHash(user.getHash());



Чтобы ваш код превратить в чистую бизнес-логику, нужно инфраструктуру вынести в общий код.
Например это можнo реализовать через Proxy. Или паттерн Template method. Лучше через Proxy чтобы было меньше шума.

С другой стороны прокси у вас нужен только чтобы закрывать Connection. Так как вместо создания DataBase на каждый пук имеет смысл перейти на скиглтоны и инъкцию их экземпляров.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632224
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123я бы понял, если бы он до этого не разделил всё на 3 класса
он их разделил ровно по одной причине - стало много методов :)
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632225
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopЗа меня это все делает QuerryRunner в каждом по сути запросе.он делает не всё, непонятно, что...
оставляя тебе проблему с закрытием конекта.
у тебя куча классов/методов....
я предлагаю только оставить 3. в которых методы будут возвращать конечный нужный объект.
избавишься от медленного преобразования в json, и от преобразования json в объект.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632226
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopГде мне нужно обратиться к базе я создаю экземпляры классов у которых есть методы. Вызываю нужные методы. После окончания работы с бд я выполняю возврат подключения в пул:

Код: java
1.
BDS.getConnection().close();



Вот это вообще жуть. В приложении, сложнее Hello world вероятность того, что потекут коннекшены близка к 100%. Connection - от autocloseable - сделай хотя бы через try with resources, или делай все обращения через helper, который принимает лямбду, в которую передается connection, а все манипуляции с connection выполнять в helper'е.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632227
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
а с чего вы взяли что это я использую везде? и с чего вы взяли что создаётся новое подключение? я как бы описал откуда берется подключение и т.д.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632229
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяон делает не всё, непонятно, что...
оставляя тебе проблему с закрытием конекта.
у тебя куча классов/методов....
я предлагаю только оставить 3. в которых методы будут возвращать конечный нужный объект.
избавишься от медленного преобразования в json, и от преобразования json в объект.

почему же не понятно. он делает по сути то же Вы и пишете а мне отдаёт ResultSet, а я прохожусь в цикле по каждому найденному элементу и записываю в коллекцию. все.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632230
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Локшин Марк
Вот это вообще жуть. В приложении, сложнее Hello world вероятность того, что потекут коннекшены близка к 100%. Connection - от autocloseable - сделай хотя бы через try with resources, или делай все обращения через helper, который принимает лямбду, в которую передается connection, а все манипуляции с connection выполнять в helper'е.[/quot]

я написал что это возврат конекшена в пул, а не его закрытие.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632233
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тема закрыта.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632234
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaPetro123я бы понял, если бы он до этого не разделил всё на 3 класса
он их разделил ровно по одной причине - стало много методов :)
ну и я бы разделил если он не врёт, и это 3 разные подсистемы. По крупному.
Обратное объединение нелогично).
Не будет ни сущностей, ни классов, ни подсистем.
Если только так:
Код: java
1.
база.Подсистема.МетодПодсистемы()


но выгода сомнительна.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632241
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
а с чего вы взяли что это я использую везде?

Ну, это вы такой код привели - не я.

Tsyklopи с чего вы взяли что создаётся новое подключение?
Буквоед? С точки зрения кода запуска запроса всё равно создаётся новое физическое подключение или создаётся новый Connection proxy со старым подключением. Если нужно вызывать Connection.close(), который где-то этот самый Connection создался.

Tsyklop я как бы описал откуда берется подключение и т.д.
Всё что вы пишете я прочитал и прокомментировал. Но вам плевать. Вы просто игнорируете то чего не понимаете и продолжаете писать одно и тоже разными словами из поста в пост.

Вы нигде ниразу не объяснили в чем именно проблема. Единственное ваше объяснение - хочу объединить 3 в 1 чтобы было как шампунька. На мои два вопроса "зачем" - вы ниразу не удосужились ответить.

Замечательно что вы немного упростили код, но, похоже, это потолок. Нужно дальше учиться.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632245
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopя написал что это возврат конекшена в пул, а не его закрытие.
С точки зрения кода, который его использует разницы нет. Но, вы как девочка готовы спорить о любой ерунде, которую вам пишут вместо того чтобы сконцентрироваться на проблеме и способах её решения.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632255
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczС точки зрения кода, который его использует разницы нет. Но, вы как девочка готовы спорить о любой ерунде, которую вам пишут вместо того чтобы сконцентрироваться на проблеме и способах её решения.

я ни с кем не спорю. я слушаю всех и говорю как работает у меня.

Не создается новое подключение, а берется из пула подключений.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632259
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopНе создается новое подключение, а берется из пула подключений.
Не создаётся новое физическое подключение, но создаётся новое пулированое. Иначе вам бы метод close() не нужен был в принципе. Перестаньте ерунду нести.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632263
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczTsyklopНе создается новое подключение, а берется из пула подключений.
Не создаётся новое физическое подключение, но создаётся новое пулированое. Иначе вам бы метод close() не нужен был в принципе. Перестаньте ерунду нести.
да ёпть. давайте Вы поставите эту либу и сами посмотрите. Я говорю как есть... как это работает. в пуле уже есть 10 подключений которые подключены к бд. Берется какое-то из них и используется, а close() возвращает подключение в пул свободных.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632267
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopпочему же не понятно. он делает по сути то же Вы и пишете а мне отдаёт ResultSet, а я прохожусь в цикле по каждому найденному элементу и записываю в коллекцию. все.вот именно - по сути, только по сути..
но оставляет тебе головняк с коннекшеном.
и в добавок - у тебя куча промежуточных классов.
почему не сделать сразу из результсета нужно?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632268
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё вы по мелочам спорите?
В прикладном коде то всё равно.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632272
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopда ёпть. давайте Вы поставите эту либу и сами посмотрите. Я говорю как есть... как это работает. в пуле уже есть 10 подключений которые подключены к бд. Берется какое-то из них и используется, а close() возвращает подключение в пул свободных.

а я бы прислушался к

BlazkowiczНе создаётся новое физическое подключение, но создаётся новое пулированое. Иначе вам бы метод close() не нужен был в принципе. Перестаньте ерунду нести.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632278
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяа я бы прислушался к
BlazkowiczНе создаётся новое физическое подключение, но создаётся новое пулированое. Иначе вам бы метод close() не нужен был в принципе. Перестаньте ерунду нести.

Нет. Вот гайд который это описывает.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632281
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopда ёпть. давайте Вы поставите эту либу и сами посмотрите. Я говорю как есть... как это работает. в пуле уже есть 10 подключений которые подключены к бд. Берется какое-то из них и используется, а close() возвращает подключение в пул свободных.
Вы пытаетесь объяснить работу connection pool-а человеку с опытом программирования на Java более 15 лет. Продолжайте игнорировать то чего не понимаете и обязательно придёте к успеху. Пишите очевидное отрицая деталей и ваш код сразу станет лучше. Удачи.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632282
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopНет. Вот гайд который это описывает.
По-моему он нас тупо тролит.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632285
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczПо-моему он нас тупо тролит.

да в чем же тролю? поясните...не пойму.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632286
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я нашел гайд по циклам в Java. Циклы мы ещё не обсуждали по-моему. Это же не так сложно как прокси.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632288
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopда в чем же тролю? поясните...не пойму.
Я готов поставить пару тыр на то что все отметившиеся в этой и в вашей предыдущей теме прекрасно знают и понимаю работу пула соединений. Поэтому ваши попытки объяснять более опытным коллегам прописные истины выглядят уморительно.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632289
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВот я нашел гайд по циклам в Java. Циклы мы ещё не обсуждали по-моему. Это же не так сложно как прокси.
поясните пожалуйста... что не так Я делаю?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632291
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помню году так в 2004-м двое парней забегают в комнату и с глазами по 5 копеек объявляют, что в Java, оказывается один и тот же класс загруженый разными ClassLoader-ами это два разных класса! Сенсация! Было примерно так же забавно.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632297
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopпоясните пожалуйста... что не так Я делаю?
- Игнорируете вопрос "зачем" вы хотите объединять классы. Вы считаете что это упрощение. Но обычно, упрощение заключается в разделении на модули, пакеты классы и методы, а не в объединении.
- Спорите по комментариям, которые к вашему коду прямого отношения не имеют.
- Спорите с теми кто вам указывает на то что ваши объяснения не достаточно понятны. Хотя что тут спорить? Игнорируйте коментарии не по сути вопроса.
- Не задаёте вопросов по тем советам которые вам уже дали. Приятно видеть что вы уже немного зарефакторили код, но количество копипасты всё ещё можно уменьшить.
- Приводите недостаточно кода чтобы объяснить проблему.
- Упираетесь в ваш способ "объединения" как единственный способ решения проблемы, в то время как проблему вы не обрисовали и альетернативные её решения не рассмотрели.
Ну, и продолжать можно долго.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632317
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
я не знаю какой код еще привести в пример. Могу лично Вам скинуть проект гляните...
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632323
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopя не знаю какой код еще привести в пример. Могу лично Вам скинуть проект гляните...

Вот вы привели код

Код: java
1.
2.
3.
DataBase db = new DataBase(getDataSource());
db.getDbUser().getUserIdByHash(user.getHash())
db.close();



Я его екстраполирую и делаю вывод, что остальные методы выглядят так же

Код: java
1.
2.
3.
DataBase db = new DataBase(getDataSource());
db.getDbAdmin().insertNewUserRecord(user.)
db.close();



Из чего я делаю вид, что инфраструктура у вас переиспользуется копипастой. Вы же отвечаете, что это не так, но не приводите, как у вас выглядят два разных использования двух разных методов.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632334
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczИз чего я делаю вид, что инфраструктура у вас переиспользуется копипастой. Вы же отвечаете, что это не так, но не приводите, как у вас выглядят два разных использования двух разных методов.

извиняюсь. Вот кусок кода как я использую такое:

Код: 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.
DataBase db = new DataBase(getDataSource());

                    User user = getUser(SESSION);

                    user.setHash(COOKIES.getValue(NAME_USER_HASH));

                    if (!user.getHash().isEmpty()) {

                        user.setId(db.getDbUser().getUserIdByHash(user.getHash()));

                        if (user.getId() > 0) {

                            user.update(db.getDbUser().getUserFullInfo(user.getId()));

                            user.getAuth().setAuth();

                            COOKIES.create("/", NAME_USER_HASH, user.getHash(), COOKIES_AGE_MONTH);

                            user.setLastVisit(new LastVisit(getCurrentDate(), TIME_FORMAT.format(Calendar.getInstance().getTime())));

                            db.getDbUser().updateAuth(user.getId(), UTILS.getClientIpAddress(), user.getHash(), user.getLastVisit().getDate(), user.getLastVisit().getTime());

                            if (user.getSite() != null && user.getSite().getId()>0) {
                                user.setSite(new Site(db.getDbAdmin().siteGetFullInfo(user.getId(), user.getSite().getId())));
                            }

                            user.setChat(new Chat());

                        } else {
                            user = new User();
                        }

                    } else {
                        user = new User();
                    }

                    user.getDeviceType().setWeb();

                    String token = HASHES.generateToken(UTILS.getRequest());

                    COOKIES.create("/", NAME_TOKEN, token, COOKIES_AGE_SESSION);

                    SESSION.set(NAME_TOKEN, token);

                    SESSION.set(NAME_SERVER_ACCESS, true);

                    SESSION.set(NAME_USER, user);

                    //BDS.getConnection().close();
                    db.close();



DataBase я писал в первом посте. Со всем остальным работа по аналогии.

У меня есть некая модель UserModel которая обрабатывает запросы и отдаёт результат. То бишь все приходит на один контроллер Server. Этот Server смотрит на какую модель пришел запрос(пример запроса /Server/user/login. Тут будет вызвана модель UserModel и у неё вызван метод login), передаёт в неё все данные касательно запроса (параметры и т.д.) она уже обращается к базе, делает что нужно и возвращает ответ в Server ну а тот отдаёт клиенту.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632337
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,код который я привел это не модель а фильтр, когда человек заходит на страницу. Я проверяю его данные и т.д.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632376
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если user в сессии, то зачем тут DAO
new DataBase()
?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632390
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС почти написал свою ОРМ.
Осталось написать объект гетКонтекстСессион и кэш первого уровня.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632393
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Если user в сессии, то зачем тут DAO
new DataBase()
?
Проверить реально ли юзер авторизован. Сессия разрушается через 30 минут бездействия. Если юзер зашел на страницу а сессии нет то нужно проверить юзера и заполнить объект данными. Даже если сессия есть то все равно выполняется проверка хэша авторизации который в куках. Если юзер не авторизован или хэш не валидный его выбрасывает на главную.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632398
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123ТС почти написал свою ОРМ.
Осталось написать объект гетКонтекстСессион и кэш первого уровня.

что это?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632414
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

Отлично. У нас есть более полный, но всё ещё один единственный метод. Остаётся не понятным что именно упростит наличие 3x DataBase классов или одного?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632419
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczTsyklop,
Отлично. У нас есть более полный, но всё ещё один единственный метод. Остаётся не понятным что именно упростит наличие 3x DataBase классов или одного?

В коде который я привел есть уже класс DataBase который включет в себя все три моих класса с запросами. Я их объеденил в один что бы не создавать по три объекта там где мне нужна бд. При том моём подходе (когда было 3 объекта) была бага что для каждого класса берется новый конекшн из пула, а не один. То бишь для каждого объекта брался свой коннекшн из пула - это не есть правильно. Обертка DataBase делает один конекшн для всех трех объектов.

Я сейчас все переделываю.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632420
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, Перехожу на другой пул от Tomcat.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632428
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

Ваша проблема это следствие того что вы берете Connection из DataSource в одном месте, а закрываете совершенно в другом. Хороший код должен следовать правилу - взял, закрыл в этом же методе в блоке finally:

Код: java
1.
2.
3.
try(Connection c = dataSource.getConnection()) {
   doMyQueries(c);
}



У вас этого нет.

DataSource у вас один единственный. А вы его зачем-то помещаете в кучу разных переменных без особой на то надобности. И соответсвенно путаетесь.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632432
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopЯ сейчас все переделываю.
А вот если бы инфраструктура работы с БД была бы отделена от бизнес-транзакций, то переделывали бы только инфрастуктуру а не всё.

- Вы можете методы своего Server выделить в интерфейс?
- Вы можете написать Proxy с этим интерфейсом, так чтобы InvocationHandler, который бы для всех таких методов создавал Database, потом делегировал бы вызов настоящему объекту Server, и после этого бы уже закрывал ваш Database?
- Вы можете передать Database из InvocationHanlder-а в Server через параметры или ThreadLocal?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632433
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopСессия разрушается через 30 минут бездействия.
это параметр и его можно менять самому.
TsyklopЕсли юзер зашел на страницу а сессии нет
нет. Сессия всегда есть. Только будет новая и в сесии не будет объекта User

TsyklopДаже если сессия есть то все равно выполняется проверка хэша авторизации который в куках
я спросил зачем тебе DAO который работает с базой!!!!!
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632437
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopТо бишь для каждого объекта брался свой коннекшн из пула - это не есть правильно.
кто сказал такую ересь?
У MS рекомендации - на одну форму-окно один коннект.
Т.е. если 5 форм висят в памяти то будет 5 коннектов.
И нет проблем.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632439
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopТо бишь для каждого объекта брался свой коннекшн из пула - это не есть правильно
попытайся обосновать почему это не правильно
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632440
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наконец то мы добрались до сути всех топиков Tsyklop.
У него было 3 коннекта на 3 класса и он решил что это непорядок. Надо объединить 3 класса.
Перфекционист - что возьмёшь))
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632441
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123TsyklopСессия разрушается через 30 минут бездействия.
это параметр и его можно менять самому.причём менять динамически в коде, продлять на некоторое время, к примеру 5мин, и можно поставить слушатель окончания сессии - если сессия закончилась на сервере - с помощью ws послать сообщение клиенту(браузеру) и он перейдёт на страницу входа. т.е. скроет от посторонних всё что юзер делал.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632444
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
разумеется. Ты видишь его фильтр выше который вызывается на каждый F5 странички.
Разве не видно, что нафига там запрос в базу. Это ведь тормоза!
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632448
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123У него было 3 коннекта на 3 класса и он решил что это непорядок
просто каша в голове от всего на свете, плюс отсутствие минимальных базовых знаний. Это нормально. Ненормально упрямство и нежелание вникнуть в советы. Могу только присоединиться к совету о прочтении книжек Мартина и Фаулера.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632451
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaНенормально упрямство и нежелание вникнуть в советы
по моему опыту, упрямцы такого рода (задиристые) не становятся профи в программистах.
Удачи аффтару!
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632478
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopПроверить реально ли юзер авторизован. Сессия разрушается через 30 минут бездействия. Если юзер зашел на страницу а сессии нет то нужно проверить юзера и заполнить объект данными. Даже если сессия есть то все равно выполняется проверка хэша авторизации который в куках. Если юзер не авторизован или хэш не валидный его выбрасывает на главную.

Прошу прощения, но зачем?!
Чем вам стандартные библиотеки/фреймворки/приложения не угодили?
Тем более стандартный сервер приложений/сервлетов все это умеет "из коробки"
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632481
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulПрошу прощения, но зачем?!
Чем вам стандартные библиотеки/фреймворки/приложения не угодили?
ему некогда с ними разбираться


ТС - теперь ты видишь, к чему приводят повторы? Страниц столько же, одни и те же вопросы обсасываются снова и снова
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632507
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgulПрошу прощения, но зачем?!
Чем вам стандартные библиотеки/фреймворки/приложения не угодили?
Тем более стандартный сервер приложений/сервлетов все это умеет "из коробки"

читайте первый пост темы. Там я об этом написал.

Что он умеет из коробки? проверить если ли юзер в бд? проверить авторизован ли он? и т.д. Если реально такое есть, без фреймворков, то покажите пожалуйста. очень интересно.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632508
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpashaPetro123У него было 3 коннекта на 3 класса и он решил что это непорядок
просто каша в голове от всего на свете, плюс отсутствие минимальных базовых знаний. Это нормально. Ненормально упрямство и нежелание вникнуть в советы. Могу только присоединиться к совету о прочтении книжек Мартина и Фаулера.

Каких базовых знаний не хватает? огласите список пожалуйста.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632515
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczTsyklopЯ сейчас все переделываю.
А вот если бы инфраструктура работы с БД была бы отделена от бизнес-транзакций, то переделывали бы только инфрастуктуру а не всё.

- Вы можете методы своего Server выделить в интерфейс?
- Вы можете написать Proxy с этим интерфейсом, так чтобы InvocationHandler, который бы для всех таких методов создавал Database, потом делегировал бы вызов настоящему объекту Server, и после этого бы уже закрывал ваш Database?
- Вы можете передать Database из InvocationHanlder-а в Server через параметры или ThreadLocal?

в Server нет методов. это просто контроллер который передаёт запрос в модель - то бишь создает объект модели и передаёт в неё все данные.

Вот мой Server:

Код: 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.
@WebServlet(name = "WebServer", urlPatterns = {"/Server/*"})
public class WebServer extends HttpServlet {

    private static final Logger LOGGER = LogManager.getLogger(WebServer.class);

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        WebRequest UTILS = null;
        WebSession SESSION = null;

        Answer answer = new Answer();

        try {

            UTILS = new WebRequest(request, response);

            SESSION = UTILS.getSession();

                switch (UTILS.getCmd(1)) {
                    case Core.CONTROLLER_USER:
                        answer.setAnswer(Controller.user(answer, UTILS));
                        break;
                    case Core.CONTROLLER_CHAT:
                        answer.setAnswer(Controller.chat(answer, UTILS));
                        break;
                    default:
                        answer.setError(DEFAULT_MESSAGE_404);
                        break;
                }

        } catch (Exception e) {
            answer.setError(DEFAULT_MESSAGE_SERVER_ERROR);
            LOGGER.error("SERVER ERROR", e);
        }

        response.getWriter().write(answer.toString());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}



Controller:

Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
public class Controller {

    private static final Logger LOGGER = LogManager.getLogger(Controller.class);

    public static Answer user(Answer answer, WebRequest utils) {

            try {

                UserModel model = new UserModel(utils, answer);

                if (model.isReady()) {
                    if(model.getUser().getDeviceType().isWeb() || model.getUser().getDeviceType().isMobile()) {
                        switch (utils.getCmd(2)) {
                            case "login":
                                answer.setAnswer(model.execute(UserAction.ACTION_LOGIN));
                                break;
                            case "register":
                                answer.setAnswer(model.execute(UserAction.ACTION_REGISTER));
                                break;
                            case "logout":
                                answer.setAnswer(model.execute(UserAction.ACTION_LOGOUT));
                                break;
                            ...
                            default:
                                answer.setError(DEFAULT_MESSAGE_404);
                                break;
                        }
                    } else {
                        answer.setError("Доступ запрещен. Код deviceType");
                    }
                } else {
                    answer.setAnswer(model.getAnswer());
                }
            } catch (SQLException e) {
                LOGGER.error("ERROR", e);
                answer.setError("Ошибка базы данных. Попробуйте позже");
            } catch (ParseException e) {
                LOGGER.error("ERROR", e);
                answer.setError("Ошибка базы данных. Попробуйте позже");
            } catch (Exception e) {
                LOGGER.error("ERROR", e);
                answer.setError(DEFAULT_MESSAGE_ERROR);
            }

        return answer;
    }

    public static Answer chat(Answer answer, WebRequest utils) {

       
            try {

                ChatModel model = new ChatModel(utils, answer);

                if (model.isReady()) {

                    switch (utils.getCmd(2)) {
                        case "login":
                            answer.setAnswer(model.execute(ChatAction.LOGIN));
                            break;
                         ...
                        default:
                            answer.setError(DEFAULT_MESSAGE_404);
                            break;
                    }

                } else {
                    answer.setAnswer(model.getAnswer());
                }

            } catch (Exception e) {
                LOGGER.error("ERROR", e);
                answer.setError(DEFAULT_MESSAGE_ERROR);
            }

        return answer;

    }

}



Далее все передаётся в модель. Пример метода login:

Код: 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.
private void login() throws Exception {
        if (!getUser().getAuth().isAuth() && (getUser().getDeviceType().isWeb() || getUser().getDeviceType().isMobile())) {

            ValidateUser validateUser = new ValidateUser(getAnswer(), getUser());

            validateUser.validateLogin(getUtils().getParam("email"), getUtils().getParam("password"));

            if (validateUser.isValid()) {

                getUser().setPassword(getHashes().hashPassword(getUser().getEmail(), getUser().getPassword()));

                getUser().update(getDbUser().getUserFullInfo(getUser().getEmail(), getUser().getPassword()));

                if (getUser().getId() > 0) {

                    if (getDbUser().checkUserConfirm(getUser().getId(), getUser().getEmail())) {

                        getUser().setHash(getHashes().generate(150));

                        if (getUser().getDeviceType().isWeb() || (getUser().getDeviceType().isMobile() && (getUser().isAdmin() || getUser().isOperator()))) {

                            if (getDbUser().addAuth(getUser().getId(), getUtils().getClientIpAddress(), getUser().getHash(), getCurrentDate(), TIME_FORMAT.format(Calendar.getInstance().getTime()))) {

                                getUser().getAuth().setAuth();

                                if (getUser().getDeviceType().isMobile()) {
                                    getAnswer().add("token", getUser().getHash());
                                    getAnswer().add("data", getUser().toString());
                                } else {
                                    getCookies().create("/", Core.NAME_USER_HASH, getUser().getHash(), COOKIES_AGE_MONTH);
                                }

                                getAnswer().setSuccess("Вы успешно авторизовались");

                            } else {
                                getAnswer().setError("Ошибка авторизации. Попробуйте позже");
                            }
                        } else {
                            getAnswer().setError("Нет доступа к этой операции");
                        }
                    } else {

                        ConfirmRegister cr = new ConfirmRegister(getUser().getId(), getDbUser().getConfirmRegisterToken(getUser().getId()), getUtils().getDomain());

                        getEmailSender().send("Подтверждение регистрации",
                                new MailBuilder(getGlobal().getHtml((getUser().isAdmin() ? "admin" : getUser().isOperator() ? "operator" : "user") + "-registration"))
                                        .replace("fullName", getUser().getFullName())
                                        .replace("url", cr.toString()).build()
                                , getUser().getEmail());

                        getAnswer().setError("Подтвердите Ваш E-Mail. Письмо выслано на Вашу почту.");
                    }

                } else {
                    getAnswer().setError("E-Mail или пароль не верны");
                }

            } else {
                getAnswer().setAnswer(validateUser.getAnswer());
            }

        } else {
            getAnswer().setError("Нет доступа или вы уже авторизованы");
        }
    }
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632520
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopКаких базовых знаний не хватает? огласите список пожалуйста
как писать хороший код (Clean code , Robert Martin) и как организовывать архитектуру приложения (Patterns of Enterprise Application Architecture, Martin Fowler) . Наверное имеет смысл именно в таком порядке
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632543
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123У MS рекомендации - на одну форму-окно один коннект.
Т.е. если 5 форм висят в памяти то будет 5 коннектов.
И нет проблем.
В формах работают по-очереди. А здесь 3 класса могут сохранять все одновременно - если будут 3 разных коннекта, они не будут видеть изменений сделанных из 2-х других классов, при должном умении можно самого себя задедлочить, не ясно как передавать FK между ними и в каком порядке коммитить эти транзакции чтобы не упасть, а самое главное нельзя будет реализовать транзакционное изменение данных хотя бы 2-мя этими классами, если данные меняются ими 2-мя без распределенных транзакций.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632545
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркВ формах работают по-очереди.это что то новое.
Расшифруйте что за очередь? ГУИ?
Дак могут и потоки быть.

Локшин МаркА здесь 3 класса могут сохранять все одновременно - если будут 3 разных коннекта, они не будут видеть изменений сделанных из 2-х других классов
конечно. Т.к. у него рукописный ОРМ. Зачем?
Вместо ОРМ всё пустить в один ворота-коннект?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632548
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Маркесли будут 3 разных коннекта, они не будут видеть изменений сделанных из 2-х других классов
а вы знаете что в пуле тоже не видны изменения? )))
По вашему убрать пул?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632549
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марки в каком порядке коммитить эти транзакции чтобы не упасть
вы не читали тред - у него автокоммит
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632550
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Расшифруйте что за очередь? ГУИ?
Дак могут и потоки быть.

Это означает, что данные меняются формами независимо друг от друга.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632554
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123а вы знаете что в пуле тоже не видны изменения? )))
По вашему убрать пул?
Не нужно в каждый менеджер совать свой коннекшен, не важно откуда его брать - напрямую с драйвера или с коннекшен пула.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632555
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркPetro123Расшифруйте что за очередь? ГУИ?
Дак могут и потоки быть.

Это означает, что данные меняются формами независимо друг от друга.
как захочу.
Хочу передам коннект. Захочу создам новый.
Вы чего испугались то? Я не пойму?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632556
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНе нужно в каждый менеджерслово менеджер придумали вы.
И детские страхи только у вас.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632562
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк,
все ваши посты про транзакци и не имеют смысла при автокоммите. Это к автору топика.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632573
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Локшин МаркНе нужно в каждый менеджерслово менеджер придумали вы.
Который тут называется классом.
Petro123И детские страхи только у вас.
В больнице тазепам закончился?
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632581
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Локшин Марк,
все ваши посты про транзакци и не имеют смысла при автокоммите. Это к автору топика.
В этом топике автор нигде не указывал, что он работает с автокоммитом. Если нам важна целостность данных в базе, то это первое, что нужно отключить.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632597
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркPetro123Локшин Марк,
все ваши посты про транзакци и не имеют смысла при автокоммите. Это к автору топика.
В этом топике автор нигде не указывал, что он работает с автокоммитом. Если нам важна целостность данных в базе, то это первое, что нужно отключить.
да. Де-юры вы правы. он указал в прошлом топике.
И да, я тоже всегда выкл автокоммит.
Но это OFFTOP.
...
Рейтинг: 0 / 0
Объединение sql запросов в один класс - упрощение (Обновлено)
    #39632689
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpashaкак писать хороший код (Clean code , Robert Martin) и как организовывать архитектуру приложения (Patterns of Enterprise Application Architecture, Martin Fowler) . Наверное имеет смысл именно в таком порядке
Мил человек спасибо большое. Начал читать первую книгу.
...
Рейтинг: 0 / 0
79 сообщений из 79, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Объединение sql запросов в один класс - упрощение (Обновлено)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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