Google App Engine сбрасывает пул подключений при горячем развертывании - PullRequest
0 голосов
/ 12 декабря 2018

У нас есть стандартное приложение GAE, развернутое на экземпляре F4 с подключением Java8 к базе данных CloudSQL PG.Мы настраиваем класс PostgresPool implements ServletContextListener, изначально создавая пул соединений из 10 соединений.При развертывании все работает так, как и ожидалось, и мы можем видеть созданные подключения, но когда мы обновляем приложение, мы ожидаем, что либо продолжим использовать существующий пул, либо уничтожим существующий пул и создадим новый, но мы только получимдополнительные 10 открытых соединений, и мы должны вручную перезапустить экземпляр базы данных или удалить предыдущие версии.Я понимаю, что пул соединений создается на ServletContext, и кажется, что новое развертывание создает свой собственный новый ServletContext, поэтому код не обнаруживает предыдущий пул, чтобы закрыть его.Какова была бы лучшая практика здесь, зная, что GAE, кажется, не вызывает метод contextDestroyed?Что нужно сделать, чтобы убедиться, что у нас нет сотен незанятых соединений?Вот фрагмент нашего кода, в основном contextInitialized и contextDestroyed (не уверен, вызывается ли он в App Engine)

private static ServletContext servletContext = null;

@Override
public void contextInitialized(ServletContextEvent sce) {
    servletContext = sce.getServletContext();
    DataSource pool = (DataSource) servletContext.getAttribute(POOL_NAME);
    try
    {
        if (pool == null || pool.getConnection() == null) {
            pool = createConnectionPool();
            servletContext.setAttribute(POOL_NAME, pool);
        }
    }
    catch(SQLException ex)
    {
        ex.printStackTrace();
    }
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    HikariDataSource pool = (HikariDataSource) servletContext.getAttribute(POOL_NAME);
    if (pool != null) {
        pool.close();
    }
    servletContext = null;
}
...