powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Play 1.4 и реконнект к БД
16 сообщений из 41, страница 2 из 2
Play 1.4 и реконнект к БД
    #39318079
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно, конечно, но простейший способ наступить на грабли - сделать "что-нибудь" в статическом блоке.
Код статического блока отработает в процессе загрузки класса, которая обязательно будет при развёртывании контекста и, если "что-нибудь" кинет исключение - контейнер напишет то, с чего началась ветка.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318278
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczdimonz80Хотя, судя по всему, не поможет. Пили свою инициализацию коннекшн пула. Пример в первой ссылке
Почему не поможет? Вроде то что нужно. Залочит все потоки, пока Оракл не подымется. Разве нет?

Play сам по себе не нуждается в сервлет-контейнере и сам обеспечивает взаимодействие с HTTP при помощи jBoss Netty. У плея есть понятие "приложения" то есть т.е. некоторый контекст, через который обеспечивается основной функционал. Для приложения есть механизм плагинов, обеспечивающих доп функционал. Плагин реализует интерфейс PlayPlugin, в том числе и функцию onApplicationStart, которая выполняется при старте пириложения. Взаимодействие с БД реадизовано через плагин ( см тут DBPlugin
При старте приложения выполняется DBPlugin.onApplicationStart() который дергает DB.setConfigurations() который дергает DBConfig.configure() в котором то и происходит попытка зацепиться за БД и инициализация пула соединений


Приложение опционально может быть запаковано в WAR и размещено в сервлет-контейнере (как у автора). Тогда все описанное выше безобразие происходит при инициализации сервлета

Под спойлером DBConfig.configure() - виновник торжества. Пытается прицепиться дважды стачало просто через Connection, потом черер пул.


Код: 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.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
  /**
     * Detects changes and reconfigures this dbConfig. Returns true if the
     * database was configured (Config info present. An exception is throwns if
     * the config process fails.
     */
    protected boolean configure() {

        // prefix used before all properties when loafing config. default is
        // 'db'
        String propsPrefix;
        if (defaultDbConfigName.equals(dbConfigName)) {
            propsPrefix = "db";
        } else {
            propsPrefix = "db_" + dbConfigName;
        }

        boolean dbConfigured = false;

        if (changed(propsPrefix)) {
            try {

                // We now know that we will either config the db, or fail with
                // exception
                dbConfigured = true;

                Properties p = Play.configuration;

                if (datasource != null) {
                    destroy();
                }

                boolean isJndiDatasource = false;
                String datasourceName = p.getProperty(propsPrefix, "");

                // Identify datasource JNDI lookup name by 'jndi:' or 'java:'
                // prefix
                if (datasourceName.startsWith("jndi:")) {
                    datasourceName = datasourceName.substring("jndi:".length());
                    isJndiDatasource = true;
                }

                if (isJndiDatasource || datasourceName.startsWith("java:")) {

                    Context ctx = new InitialContext();
                    datasource = (DataSource) ctx.lookup(datasourceName);

                } else {

                    // Try the driver
                    String driver = p.getProperty(propsPrefix + ".driver");
                    try {
                        Driver d = (Driver) Class.forName(driver, true, Play.classloader).newInstance();
                        DriverManager.registerDriver(new ProxyDriver(d));
                    } catch (Exception e) {
                        throw new Exception("Driver not found (" + driver + ")");
                    }

                    // Try the connection
                    Connection fake = null;
                    try {
                        if (p.getProperty(propsPrefix + ".user") == null) {
                            fake = DriverManager.getConnection(p.getProperty(propsPrefix + ".url"));
                        } else {
                            fake = DriverManager.getConnection(p.getProperty(propsPrefix + ".url"), p.getProperty(propsPrefix + ".user"),
                                    p.getProperty(propsPrefix + ".pass"));
                        }
                    } finally {
                        if (fake != null) {
                            fake.close();
                        }
                    }

                    ComboPooledDataSource ds = new ComboPooledDataSource();
                    ds.setDriverClass(p.getProperty(propsPrefix + ".driver"));
                    ds.setJdbcUrl(p.getProperty(propsPrefix + ".url"));
                    ds.setUser(p.getProperty(propsPrefix + ".user"));
                    ds.setPassword(p.getProperty(propsPrefix + ".pass"));
                    ds.setAcquireIncrement(Integer.parseInt(p.getProperty(propsPrefix + ".pool.acquireIncrement", "3")));
                    ds.setAcquireRetryAttempts(Integer.parseInt(p.getProperty(propsPrefix + ".pool.acquireRetryAttempts", "10")));
                    ds.setAcquireRetryDelay(Integer.parseInt(p.getProperty(propsPrefix + ".pool.acquireRetryDelay", "1000")));
                    ds.setCheckoutTimeout(Integer.parseInt(p.getProperty(propsPrefix + ".pool.timeout", "5000")));
                    ds.setBreakAfterAcquireFailure(
                            Boolean.parseBoolean(p.getProperty(propsPrefix + ".pool.breakAfterAcquireFailure", "false")));
                    ds.setMaxPoolSize(Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxSize", "30")));
                    ds.setMinPoolSize(Integer.parseInt(p.getProperty(propsPrefix + ".pool.minSize", "1")));
                    ds.setInitialPoolSize(Integer.parseInt(p.getProperty(propsPrefix + ".pool.initialSize", "1")));
                    ds.setMaxIdleTimeExcessConnections(
                            Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxIdleTimeExcessConnections", "0")));
                    ds.setIdleConnectionTestPeriod(
                            Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxIdleConnectionTestPeriod", "10")));
                    ds.setMaxIdleTime(Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxIdleTime", "0")));
                    ds.setTestConnectionOnCheckin(
                            Boolean.parseBoolean(p.getProperty(propsPrefix + ".pool.testConnectionOnCheckin", "true")));
                    ds.setTestConnectionOnCheckout(
                            Boolean.parseBoolean(p.getProperty(propsPrefix + ".pool.testConnectionOnCheckout", "false")));
                    ds.setDebugUnreturnedConnectionStackTraces(
                            Boolean.parseBoolean(p.getProperty(propsPrefix + ".pool.debugUnreturnedConnectionStackTraces", "false")));
                    ds.setLoginTimeout(Integer.parseInt(p.getProperty(propsPrefix + ".pool.loginTimeout", "0")));
                    ds.setMaxAdministrativeTaskTime(Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxAdministrativeTaskTime", "0")));
                    ds.setMaxConnectionAge(Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxConnectionAge", "0")));
                    ds.setMaxStatements(Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxStatements", "0")));
                    ds.setMaxStatementsPerConnection(
                            Integer.parseInt(p.getProperty(propsPrefix + ".pool.maxStatementsPerConnection", "0")));
                    ds.setNumHelperThreads(Integer.parseInt(p.getProperty(propsPrefix + ".pool.numHelperThreads", "3")));
                    ds.setUnreturnedConnectionTimeout(
                            Integer.parseInt(p.getProperty(propsPrefix + ".pool.unreturnedConnectionTimeout", "0")));

                    if (p.getProperty(propsPrefix + ".testquery") != null) {
                        ds.setPreferredTestQuery(p.getProperty(propsPrefix + ".testquery"));
                    } else {
                        String driverClass = JPAPlugin.getDefaultDialect(propsPrefix, ds.getDriverClass());

                        /*
                         * Pulled from
                         * http://dev.mysql.com/doc/refman/5.5/en/connector-j-
                         * usagenotes-j2ee-concepts-connection-pooling.html Yes,
                         * the select 1 also needs to be in there.
                         */
                        if (driverClass.equals("play.db.jpa.MySQLDialect")) {
                            ds.setPreferredTestQuery("/* ping */ SELECT 1");
                        }
                    }

                    // This check is not required, but here to make it clear
                    // that nothing changes for people
                    // that don't set this configuration property. It may be
                    // safely removed.
                    if (p.getProperty("db.isolation") != null) {
                        ds.setConnectionCustomizerClassName(DBConfig.PlayConnectionCustomizer.class.getName());
                    }

                    datasource = ds;
                    url = ds.getJdbcUrl();
                    Connection c = null;
                    try {
                        c = ds.getConnection();
                    } finally {
                        if (c != null) {
                            c.close();
                        }
                    }
                    Logger.info("Connected to %s", ds.getJdbcUrl());

                }

                destroyMethod = p.getProperty(propsPrefix + ".destroyMethod", "");

            } catch (Exception e) {
                datasource = null;
                Logger.error(e, "Cannot connected to the database" + getConfigInfoString() + " : %s", e.getMessage());
                if (e.getCause() instanceof InterruptedException) {
                    throw new DatabaseException("Cannot connected to the database" + getConfigInfoString() + ". Check the configuration.",
                            e);
                }
                throw new DatabaseException("Cannot connected to the database" + getConfigInfoString() + ", " + e.getMessage(), e);
            }
        }

        return dbConfigured;
    }




Решить проблему можно 3 способами: сложным, простым и очень простым.

Сложный: пересобрать свой собственный Play с нужными правками и с ним пересобрать WAR
Простой: выкинуть play.db.DB и запилить ru.migelle.DB с инициализацией пула как вам надо (как примерно сделать есть под спойлером) + добавить ленивость. И зарефакторить play.db.DB -> ru.migelle.DB
Очень простой: уже советовали изменить приоритет/зависимости загрузки сервисов. что там у вас: init.d, systemd, windows, что-то еще?
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318288
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimonz80Простой: выкинуть play.db.DB и запилить ru.migelle.DB с инициализацией пула как вам надо (как примерно сделать есть под спойлером) + добавить ленивость. И зарефакторить play.db.DB -> ru.migelle.DB
Спасибо. Стало немного понятно куда копать. Буду пробовать.
dimonz80Очень простой: уже советовали изменить приоритет/зависимости загрузки сервисов. что там у вас: init.d, systemd, windows, что-то еще?
Это не подходит, т.к. томкэт с ораклом живут на разных машинах.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318349
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80Простой: выкинуть play.db.DB
ещё проще - выкинусть весь фреймворк. Который лезет в базу без единой строчки кода по вызову.
А потом при неудавшейся попытке не повторяет попытку инициализации. Хотя в его пуле вроде бы эта возможность есть.
Если уж разрабы решили сделать AutoConnect, то надо было сделать это свойство для новичков возле инициализации драйвера.
Чтобы его можно было сменить.
И третье, обеспечить возможность работать без пула.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318354
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123dimonz80Простой: выкинуть play.db.DB
ещё проще - выкинусть весь фреймворк. Который лезет в базу без единой строчки кода по вызову

convention over configuration. Использовать встроенные примочки для БД никто не заставляет. Хошь, делай свой пул. Делов то.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318358
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80Petro123пропущено...
ещё проще - выкинусть весь фреймворк. Который лезет в базу без единой строчки кода по вызову
convention over configuration. Использовать встроенные примочки для БД никто не заставляет. Хошь, делай свой пул . Делов то.
Оценивать что данный фреймворк по данной фиче - Г., мне тоже никто не мешает.
Ешо позиционировали как Супер фреймворк для новичков.
...
Ты не ответил. Почему он валится при отсутствии коннекта и нужно перегружать?
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318361
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80convention over configuration
зато умные слова мы писать умеем.
Удачи аффтару!
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318449
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123dimonz80пропущено...

convention over configuration. Использовать встроенные примочки для БД никто не заставляет. Хошь, делай свой пул . Делов то.
Оценивать что данный фреймворк по данной фиче - Г., мне тоже никто не мешает.
Ешо позиционировали как Супер фреймворк для новичков.
...
Ты не ответил. Почему он валится при отсутствии коннекта и нужно перегружать?

Валится при старте вот поэтому

валится когда недоступен только оракл вот тоэтому
Код: java
1.
2.
ds.setTestConnectionOnCheckout(
                            Boolean.parseBoolean(p.getProperty(propsPrefix + ".pool.testConnectionOnCheckout", "false")));



можно в application.conf прописать db.default.pool.testConnectionOnCheckout=false. Но проблемы полностью не решит, тк есть еще случай когда ребутается и оракл и томкат и томкат поднимается быстрее оракла.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318455
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторможно в application.conf прописать db.default.pool.testConnectionOnCheckout=false.

Затупил! Надо так
Код: java
1.
 db.default.pool.testConnectionOnCheckout=true
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318467
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80Но проблемы полностью не решит, тк есть еще случай когда ребутается и оракл и томкат и томкат поднимается быстрее оракла.
2 вопроса:
- У меня выше сайт на JNDI в GlassFish. Если оракл стартует позже АппСервер....или выпал из сети на пол часа, а потом появился. То нужно ли мне будет перегружать Веб приложение?
(я позже протестирую)
- Тот же самый вопрос при использовании банального JSP+jdbc
....
Тот случай выше что вы привели - СТАНДАРТНЫЙ случай для веб приложений.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318479
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123dimonz80Но проблемы полностью не решит, тк есть еще случай когда ребутается и оракл и томкат и томкат поднимается быстрее оракла.
2 вопроса:
- У меня выше сайт на JNDI в GlassFish. Если оракл стартует позже АппСервер....или выпал из сети на пол часа, а потом появился. То нужно ли мне будет перегружать Веб приложение?
(я позже протестирую)
- Тот же самый вопрос при использовании банального JSP+jdbc
....
Тот случай выше что вы привели - СТАНДАРТНЫЙ случай для веб приложений.

Скорее всего нет. Поток свалится с эксепшном, а сервер приложений будет жить спокойно дальше.
Чего доказать-то пытаешься? Что древняя версия Play не очень? Ну Ок. Убелил.

Я разбирал конкретный случай для конкретной версии конкретного фреймворка со ссылкой на исходники, из которой вроде как понятно, почему при старте валится приложение если нет соединения с БД.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318487
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80Скорее всего нет. Поток свалится с эксепшном, а сервер приложений будет жить спокойно дальше.
ОК. Без Play работает всё отлично.
dimonz80Чего доказать-то пытаешься? Что древняя версия Play не очень? Ну Ок. Убелил.
Работа программиста такая. Программа должна работать как себе представляет программист.
Чтобы тем на 2 страницы не было.
Ничего личного)
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318498
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123dimonz80Скорее всего нет. Поток свалится с эксепшном, а сервер приложений будет жить спокойно дальше.
ОК. Без Play работает всё отлично.
dimonz80Чего доказать-то пытаешься? Что древняя версия Play не очень? Ну Ок. Убелил.
Работа программиста такая. Программа должна работать как себе представляет программист.
Чтобы тем на 2 страницы не было.
Ничего личного)

Пытался помочь, не выходя за рамки вводных данных. Работаем с тем, что есть, как говорится.
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318509
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80,
а в последней версии там как с этим? Не в курсе?
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318529
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123dimonz80,
а в последней версии там как с этим? Не в курсе?

При старте тоже отваливается если БД недоступна))) Если БД пропадает после старта, то ничего страшного. Ругается ексепшнами пока не переконнектится.

Собственный пул делается в пару строк. Для доп базы на Pervasive SQL, ктоторая переодически бывает в отключке сделал вот так ( на скале правда)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
    import play.api.db.Databases
    import play.api.Play.current
   
   // параметры берем из application.conf
    val driverClass = current.configuration.getString("pervasive.driver").getOrElse("com.pervasive.jdbc.v2.Driver")
    val url = current.configuration.getString("pervasive.url").getOrElse("jdbc:pervasive://localhost:1583/DB;encoding=cp866")

    lazy val PervasiveDB = Databases(driverClass, url, "default", Map("hikaricp.connectionTestQuery" -> "select 1"))



Используется так же как и обычный play.api.db.DB

Код: java
1.
2.
3.
4.
5.
6.
7.
  PervasiveDB.withConnection { implicit connection =>
     ........
  }

  PervasiveDB.withTransaction { implicit connection =>
     ........
  }
...
Рейтинг: 0 / 0
Play 1.4 и реконнект к БД
    #39318560
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80,
OK
спс.
Удачи!
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Play 1.4 и реконнект к БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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