Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序级上下文缓存的设计思想(类似于web中的会话/应用程序上下文)_Java_Caching - Fatal编程技术网

Java 应用程序级上下文缓存的设计思想(类似于web中的会话/应用程序上下文)

Java 应用程序级上下文缓存的设计思想(类似于web中的会话/应用程序上下文),java,caching,Java,Caching,我们有一个web应用程序,它涉及创建一些重实用程序对象(在内存性能方面)。它的用途可以在任何应用层上使用。这些实用程序对象是特定于用户的。因此,理想情况下,应该在用户登录时创建这些对象,将它们缓存在“某处”,并在需要时重用它们 现在可用的选项是会话、应用程序。但并非所有层级都可以使用这些功能。一种方法是将它们传递给后续层。但这将违反关注点分离方法,其他层需要了解web层 另一种方法是不要使用静态实用程序类来缓存这些对象。差不多 MyUtilObject myObject = MyUtilCach

我们有一个web应用程序,它涉及创建一些重实用程序对象(在内存性能方面)。它的用途可以在任何应用层上使用。这些实用程序对象是特定于用户的。因此,理想情况下,应该在用户登录时创建这些对象,将它们缓存在“某处”,并在需要时重用它们

现在可用的选项是会话、应用程序。但并非所有层级都可以使用这些功能。一种方法是将它们传递给后续层。但这将违反关注点分离方法,其他层需要了解web层

另一种方法是不要使用静态实用程序类来缓存这些对象。差不多

MyUtilObject myObject = MyUtilCache.getMyUtilObject(userName);
在内部,由HashMap(可能还有软引用)之类的东西进行备份。这些对象将在用户注销或会话到期时清除

这是我们正在使用的

JBoss,Struts1.2,Spring。同一台计算机上的所有层(在单个运行时)


请分享您的想法/方法。

您所需要的只是一个所有层都通用的界面。该实现可以由
会话支持,并在需要时注入到任何地方。

您所需要的只是一个对所有层都通用的接口。该实现可以由
会话支持,并在需要时注入

创建一些重实用程序对象

详细说明当用户登录时,在一段时间内存储了什么样的重物

HttpSession中的数据越小越好。对于用户来说,典型的web应用程序会话持续几秒钟或几分钟。它主要应该包含授权、用户偏好、连接信息和状态。它不应该包含从当前页面到下一页都有用的数据。当然,您可以存储太多的数据,因为会话堆是限制。但是如果你长时间储存,可能会有比赛条件。如果此请求需要数据,请保留在HttpRequest中。否则,您将使用第二级缓存,例如EHCACHE、*MEMCACHE*或TerraCotta,应用策略,例如直到会话过期,使此缓存可用于所有页面。每个页面之间还传递一个唯一的id,该id确定缓存信息

另一种方法是不要使用静态实用程序类来缓存这些 物体

静态类对所有用户都是通用的。如何拥有特定于用户的静态类

创建一些重实用程序对象

详细说明当用户登录时,在一段时间内存储了什么样的重物

HttpSession中的数据越小越好。对于用户来说,典型的web应用程序会话持续几秒钟或几分钟。它主要应该包含授权、用户偏好、连接信息和状态。它不应该包含从当前页面到下一页都有用的数据。当然,您可以存储太多的数据,因为会话堆是限制。但是如果你长时间储存,可能会有比赛条件。如果此请求需要数据,请保留在HttpRequest中。否则,您将使用第二级缓存,例如EHCACHE、*MEMCACHE*或TerraCotta,应用策略,例如直到会话过期,使此缓存可用于所有页面。每个页面之间还传递一个唯一的id,该id确定缓存信息

另一种方法是不要使用静态实用程序类来缓存这些 物体


静态类对所有用户都是通用的。如何拥有特定于用户的静态类。

为什么不在需要时序列化/反序列化对象。如果此时需要对象,请将其反序列化,并在会话结束时再次将其序列化

为什么不在需要时序列化/反序列化对象。当此时需要对象反序列化并在会话关闭时再次序列化它们时

您可以使用LinkedHashMap作为LRU缓存,以防止它变得太大。@PeterLawrey是的,我正在考虑。谢谢你的建议。顺便说一句,四十个问题?我总共问了17个问题!我错了,你有156个答案供其他感兴趣的人参考。你可以使用LinkedHashMap作为LRU缓存,以防止它变得太大。@PeterLawrey是的,我正在考虑这个问题。谢谢你的建议。顺便说一句,四十个问题?我总共问了17个问题!我错了,你有156个答案给任何其他感兴趣的人。不知道为什么你需要重物的“细节”。任何在其生命周期内占用大量资源的物体都是重的。静态类指的是容器类,而不是实际的用户特定数据。我问的是您存储的信息类型,如加密用户名,以及您存储的对象的大小。举个例子/类比,比如说数据库连接对象,这是无法共享的。我创建它一次,它在用户会话之前保持有效,并在注销/会话到期时关闭。会话中的数据库连接对象,若连接失效,用户将无法执行任何操作。如果你突然尝试运行一些并行的东西,一切都会崩溃。@Santhosh:你是在开发内部web应用程序,还是在开发公共使用的web应用程序。不知道你为什么需要重物的“细节”。任何在其生命周期内占用大量资源的物体都是重的。静态类指的是容器类,而不是实际的用户特定数据。我问的是您存储的信息类型,如加密用户名,以及您存储的对象的大小。举个例子/类比,比如说数据库连接对象,这是无法共享的。我创建它一次,它在用户会话之前保持有效,并在注销/会话到期时关闭。会话中的数据库连接对象,如果连接变得过时怎么办,