1 Best Practice 1 Do not store large object graphs in HttpSession
大型的应用需要使用持久化HttpSessions,而这会耗费一定的系统资源。一个HttpSession无论什么时候使用都必须由servlet读无论什么时候需要更新也都是由servlet来写。在此过程中包括序列化数据并且从数据库中对它进行读、写。在大多数的应用中,每个servlet只是需要整个session中的一小部分数据而已。然而通过在HttpSession中存储一个大对象来使用数据大额话,应用就会强迫WebSphere Application Server每次都处理整个HttpSession对象。
WebSphere Application Server有一个配置选项来优化使用持久化HttpSession的性能。关于此项配置的详细内容会在WebSphere Application Server的文档中进行讨论。同样的还有办法就是可以选择把整个servlet对象的状态数据对象存储在HttpSession中。1
请不要忘记在使用完HttpSession对象之后要明确的将其置为无效。具体细节可以在实践2Release HttpSessions when finished中找到。
在WebSphere Application Server中配置持久化session的时候需要使用专用的数据源(data source)。为了避免持久化session对JDBC的connections产生争夺,不要去重用一个应用的数据源或者WebSphere Application Server的资源。
图1a中比较了一个使用不同大小对象的应用的例子,随着存储在HttpSession中存储的对象的大小的增加,系统的吞吐量降低,这个影响在很大程度上是数据的序列华消耗了系统的资源。
JDBC alternative to Using HttpSession Data for Storing Servlet State Data
在大多数系统中每个servlet只是需要整体应用的数据的一部分,将一个对象存储在HttpSession中的一个方法是使用JDBC,可以在每个servlet使用JDBC来分隔和维护应用的数据。
一个JDBC解决方案的例子是将每个servlet中各自需要的数据分隔为不同的行,将分隔为行的数据放在系统应用维护的数据源中。对于这些行(每个servlet需要的数据)的主键作为一个单独的attribute存储在HttpSession中。
图1b中展示了这种方法的代码:
图1c展示了分隔servlet中的数据和使用JDBC来维护一个作为单独对象的HttpSession中的servlet数据对性能的提高:
JDBC Alternative – Cleanup Issues
上面的方法中提到需要把数据存储在数据库中,当这些数据用完后就需要一个机制来清除这些数据,下面说明了两个比较好的方法:
(1)、周期性脱机:
(2)、HttpSessionBindingListener.