Используя переменную класса для кэширования данных БД, будет ли это распространяться среди пользователей веб-приложения? - PullRequest
0 голосов
/ 27 февраля 2012

Я знаю, что это фундаментальный вопрос о статических переменных Java, но я хотел бы получить официальный ответ, возможно, указатель на правильную документацию.

Я использую статическую переменную для кэширования результатов из базы данных.Вопрос в том, будут ли эти результаты предоставлены всем пользователям веб-приложения?

Вот мой код:

private static TreeMap<String,String> cachedOwners = null;
public static TreeMap<String,String> fetchOwners( ) 
        throws Exception
{
    if ( Owners.cachedOwners != null )
    {
        return Owners.cachedOwners;
    }

    DBHandler db = DBHandler.getInstance( );
    Owners.cachedOwners = db.fetchCAROwners( );
    return Owners.cachedOwners;
}

Теперь, основываясь на моих тестах, работах по кэшированию и статической переменной "cachedOwners"является общим для всех пользователей приложения.

Как это случилось?Я думал, что статическая переменная связана только с сеансом пользователя.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Да!

Существует не только одна официальная документация, потому что есть две стороны вместе

  1. наследование загрузчика классов
  2. Порядок загрузки классов java-веб-сервера

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

т.е. если у вас есть singeton.jar с

static int org.me.Test.born=System.currentTimeMillis();

и файл singleton.jar находится в

  • tomcat / lib,
  • tomcat / webapps / webapp1 / WEB-INF / libs /
  • и tomcat / webapps / webapp2 / WEB-INF / libs /

только "tomcat / lib" будет определять родимое поле, потому что / lib-classloader будет загружен первым.

0 голосов
/ 27 февраля 2012

Статические переменные не содержат состояния сеанса пользователя. Это исключительно методы, которые не связаны с продолжительностью жизни объекта. Это означает, что вы можете получить доступ к этим статическим переменным из любой точки вашего кода. Это имеет некоторые недостатки, например, трудно тестировать статические методы, потому что состояние может обслуживать несколько тестов. Я не рекомендую вам использовать статические переменные для кэшей!

Пожалуйста, проверьте эту документацию Oracle о разнице между статическими и классными членами: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...