Tomcat 7 持久会话管理器过早地从商店加载
Tomcat 7 Persistent Session Manager prematurely loads from Store
我们正在尝试在 elasticbeanstalk 环境 运行 单个服务器中为 tomcat 7 配置 dynamodb session manager。
我们可以看到会话数据被定期备份到 dynamodb,但偶尔旧的会话数据(对于同一会话)正在从 dynamodb 加载回来。在我们的应用程序中,这通过加载您正在查看的上一个项目(该项目存储在会话中)来体现。 JSESSIONID cookie 保持不变,客户端保持相同的会话。如果我们关闭会话管理器,问题就解决了。
这是我们context.xml
的内容
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Manager
className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
Table="SessionTable"
RegionId="eu-west-1"/>
</Context>
我们已尝试将 maxIdleBackup 和 maxIdleSwap 设置为 tomcat 7 docs 中定义的较高数字,但无济于事。
如果我们将 maxIdleBackup 和 maxIdleSwap 设置为零,那么错误会减少,因为会话数据会更频繁地备份到 dynamodb,但这并不能解决问题。
是什么导致 tomcat 从商店加载会话数据?我的理解是,如果它根本不可用(即客户端点击不同的 tomcat),则只应从商店加载它。
我相信您在 issue #6
中提到的实现的异步性质(以及对粘性会话的隐含需求)感到痛苦
如果您不使用粘性会话,我建议您使用同步 Redis approach
最后我们使用了JDBCStore,没有这个问题。如果有更多时间,我希望以后再回到这个问题。
我们正在尝试在 elasticbeanstalk 环境 运行 单个服务器中为 tomcat 7 配置 dynamodb session manager。
我们可以看到会话数据被定期备份到 dynamodb,但偶尔旧的会话数据(对于同一会话)正在从 dynamodb 加载回来。在我们的应用程序中,这通过加载您正在查看的上一个项目(该项目存储在会话中)来体现。 JSESSIONID cookie 保持不变,客户端保持相同的会话。如果我们关闭会话管理器,问题就解决了。
这是我们context.xml
的内容<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Manager
className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
Table="SessionTable"
RegionId="eu-west-1"/>
</Context>
我们已尝试将 maxIdleBackup 和 maxIdleSwap 设置为 tomcat 7 docs 中定义的较高数字,但无济于事。
如果我们将 maxIdleBackup 和 maxIdleSwap 设置为零,那么错误会减少,因为会话数据会更频繁地备份到 dynamodb,但这并不能解决问题。
是什么导致 tomcat 从商店加载会话数据?我的理解是,如果它根本不可用(即客户端点击不同的 tomcat),则只应从商店加载它。
我相信您在 issue #6
中提到的实现的异步性质(以及对粘性会话的隐含需求)感到痛苦如果您不使用粘性会话,我建议您使用同步 Redis approach
最后我们使用了JDBCStore,没有这个问题。如果有更多时间,我希望以后再回到这个问题。