Memcache или просто статический экземпляр для каждого экземпляра приложения? - PullRequest
1 голос
/ 18 января 2011

У меня есть несколько сложный объект в моем веб-приложении, потребуется некоторое время, чтобы все его атрибуты стали сериализуемыми, чтобы я мог вставить его в memcache.

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

public class MyServlet {
    private static SpaceShuttle mShuttle;

    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws IOException 
    { 
        // If the static instance isn't already around in this
        // application instance, build it.
        if (mShuttle == null) {
            // Create it once.
            mShuttle = complexProcessOfCreatingASpaceShuttle();
        }

        // Use it.
        mShuttle.liftOff();
        ...
    }   
}

Я думаю, что memcache будет здесь полезен, поскольку разные экземпляры приложения могут совместно использовать один и тот же объект (я думаю?), Но в качестве временного исправления, по крайней мере, экземпляры приложения могут совместно использовать статический экземпляр на протяжении всей жизни.

SpaceShuttle является неизменяемым / только для чтения, поэтому нет опасности синхронизации (я думаю?).

Множество неизвестных здесь, не знаю, как внутренне работает движок приложения. Должен ли я просто попытаться сделать сериализуемым весь SpaceShuttle?

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Это зависит от того, должен ли объект SpaceShuttle совместно использовать состояние между экземплярами. При работе на движке приложения, ваше приложение может иметь от 0 до нескольких экземпляров, работающих в любой момент времени. Каждый экземпляр будет выглядеть как собственная JVM. (В каждом экземпляре / JVM также могут быть запущены несколько потоков.) Так что, если вашему объекту не нужно делиться состоянием с другими экземплярами, у вас все будет хорошо, и если вы сохраните его, вы спасете свое приложение от инициализировать его для каждого запроса.

Если все ваши объекты космического челнока должны быть синхронизированы друг с другом (поскольку они представляют некое глобальное состояние приложения), то вам потребуется какой-то механизм для их синхронизации, что может быть столь же раздражающим, как попытка поместить их в memcache для начала.

При этом, может быть, вы можете поместить часть космического корабля в memcache. Возможно, вы можете записать его части в memcache, а затем получить их при инициализации конкретного экземпляра?

0 голосов
/ 18 января 2011

Нет. Это проблема, которую я вижу слишком часто, особенно в веб-приложениях Java - использование постоянных статических переменных невозможно масштабировать. Если вам трудно сериализовать весь объект SpaceShuttle, возможно, вы можете разбить проблему и сериализовать ее части?

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