powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / DataSource Singletone, обновить данные в классе
8 сообщений из 8, страница 1 из 1
DataSource Singletone, обновить данные в классе
    #39013329
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не представляю как изменить данные в моем датасорсе, который синглтон.
Суть такая, что в интерфейсе(Swing) можно поменять настройки, допустим путь до БД, при этом нужно сразу же обновить список пользователей (по нажатию кнопки) в комбобоксе, который лежит рядом, используя датасорсе.
Список берется, естественно, из уже другой базы.
Получается, нужно как-то пересоздать датасорсе, но как?
Или вообще нужно использовать другой подход?

Спасибо.

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

    private static final long serialVersionUID = 1L;
    private ConnectionParams connectionParams = null;
    private static String DRIVER = "";
    private static String URL = "";
    private static String USERNAME = "";
    private static String PASSWORD = "";
    private final DataSource dataSource;
    public static final MyDataSource INSTANCE = new MyDataSource();

    private void checkFileWithConnectionParamsAndSetIt() {
        try {
            Path p = Paths.get(System.getProperty("user.home"), "ph3/settings/ConnectionParams.ser");
            File file = new File(p.toString());
            file.getParentFile().mkdirs();
            file.createNewFile();
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
            connectionParams = (ConnectionParams) in.readObject();
            DRIVER = connectionParams.getDRIVER();
            URL = "jdbc:postgresql://" + connectionParams.getURL();
            USERNAME = connectionParams.getUSERNAME();
            PASSWORD = connectionParams.getPASSWORD();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public MyDataSource() {
        checkFileWithConnectionParamsAndSetIt();
        dataSource = setupDataSource();

    }

    public DataSource getDataSource() {
        return dataSource;
    }

    private static synchronized DataSource setupDataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(DRIVER);
        ds.setUrl(URL);
        ds.setUsername(USERNAME);
        ds.setPassword(PASSWORD);
        ds.setMaxTotal(100);
        ds.setMaxConnLifetimeMillis(5000);
        ds.setMaxIdle(30);
        ds.setTestOnBorrow(true);
        ds.setMinEvictableIdleTimeMillis(-1);
        ds.setTimeBetweenEvictionRunsMillis(5000);
        ds.setValidationQuery("select id from users");
        ds.setTestWhileIdle(true);
        ds.setValidationQueryTimeout(2);
        System.out.println("connected ds");
        return ds;
    }

    public static void shutdownDataSource(DataSource ds) throws SQLException {
        BasicDataSource bds = (BasicDataSource) ds;
        bds.close();
    }

    public static void main(String[] args) {
        MyDataSource mds = INSTANCE;
    }

}

...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39013340
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пересоздать:
Код: java
1.
2.
this.dataSource = new BasicDataSource();
...



Использовать PropertyChangeSupport/PropertyChangeListener, чтобы подписывать UI на событие изменения dataSource

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class MyGuiControl implements PropertyChangeListener{
...
myDataSourceSingleton.addProportyChangeListener(this);
...

@Override
public void propertyChange(PropertyChangeEvent evt){
  if("dataSource".equals(evt.getPropertyName())){
     reloadGuiControlDataFromDataSource();
  }
}
}
...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39013353
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicИли вообще нужно использовать другой подход?
смотря для чего программа.
Если она изначально "менеджер БД", тогда пересоздавать и учитывать ВСЕ события на горячую (дорого).
По простому, при смене БД - перегрузить всё приложение.
...Если у вас юзвери работяги, а не программисты по БД.
Иначе надо делать не синглетон, а напр. на каждое окно свой экземпляр.
...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39014251
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Пока использовал простое пересоздание.

А когда будет 3-5-10 и т.д. пересозданий, что, в принципе, маловероятно, то старые датаСорсы со временем сами отомрут?
Точнее, при пересоздании вижу висящие подключения к БД. И они не помирают :)
Как быть?

В частности есть метод, которые возвращает список пользователей системы, в него и добавил пересоздание, но что-то не то... :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   
private MyDataSource pool = MyDataSource.INSTANCE;

public List<Users> getAllUsers() throws Exception {
        String sql = "select " + columnsListForSQL + " from users";
        usersList.clear();
        pool = new MyDataSource();
        try (Connection c = pool.getDataSource().getConnection()) {
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        usersList.add(rsToUser(rs));
                    }
                    return usersList;
                }
            }
        }
    }
...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39014255
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

А этот метод кто-то другой писал?

Код: java
1.
2.
3.
4.
  public static void shutdownDataSource(DataSource ds) throws SQLException {
        BasicDataSource bds = (BasicDataSource) ds;
        bds.close();
  }



Надо закрывать старый DataSource это закроет все его активные соединения. Лучше это даже делать после успешного теста нового DataSource, тогда возможность откатиться ещё останется.
...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39014259
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicВ частности есть метод, которые возвращает список пользователей системы, в него и добавил пересоздание, но что-то не то... :

Что за бред. Есть метод "которые возвращает список пользователей". Зачем он вызывает какие-то левые операции типа "пересоздания"?
...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39014279
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

shutdownDataSource
я уже попробовал, это не сработало, подключения так и висели(видимо как-то не так использовал), писал его не я, да. Этот метод был в примерах, когда я искал, как писать подобный метод.
Сейчас убрал из него статик и использовал так, но подключения все-равно висят...

pool.shutdownDataSource(pool.getDataSource());


по поводу того, куда я "воткнул" пересоздание, это пока просто для теста на висящие подключения, так сказать.
Правильно будет вывести его в отдельный паблик метод, вызывать перед вызовом getAllUsers() ?
...
Рейтинг: 0 / 0
DataSource Singletone, обновить данные в классе
    #39014321
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решил забить на эту тему с пересозданием.
Сделал как сказали выше, при нажатии кнопки проверки приложение перезапускается, и всегда один датасорсе, в итоге :)

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


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