2011-01-18 2 views
1

У меня есть несколько сложный объект в моем веб-приложении, это займет некоторое время, чтобы сделать все его атрибуты сериализуемыми, чтобы я мог вставить его в memcache.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?

Благодаря

+0

еще один комментарий - вы определенно хотите изучить настройки запросов на нагрев, чтобы ваш объект-челнок был создан до того, как какой-либо пользователь будет обслуживаться определенным экземпляром (http://code.google.com/appengine/docs/java/ config/appconfig.html # Warming_Requests) –

+0

У меня возникла аналогичная проблема. Использование любой базы данных Lite не может быть и речи: http://stackoverflow.com/questions/4663071/a-read-only-relational-database-on-google-app-engine – speedplane

ответ

3

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

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

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

-1

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

+1

Это зависит от того, что делает общий объект. если это просто огромная таблица поиска какого-то рода или что-то, что меняется только один раз в день, то это, вероятно, просто отлично. Каждый экземпляр приложения может иметь свою собственную копию объекта. –

+0

Привет, да, это похоже на большую таблицу поиска, которая никогда не меняется после загрузки. Несколько потоков могут обращаться к нему без каких-либо проблем, его состояние никогда не меняется. – user291701

Смежные вопросы