【问题标题】:Delete session from database after it expired?过期后从数据库中删除会话?
【发布时间】:2012-02-02 03:44:38
【问题描述】:

这可能是一个愚蠢的问题,但我想知道每 15 分钟从我的数据库中删除所有过期的“会话”是否是个好主意?

还是直接放在那里?会话在 X 分钟后过期,它不再有用了,好像只是占用空间?

【问题讨论】:

    标签: c# sql-server session


    【解决方案1】:

    如果你的桌子是这样的

    SessionId datatype,
    SessionLastTouch datetime
    

    然后在注册新会话时,在写入(会话问题或触摸)表后进行一些清理,如下所示:

    delete from YourSessionsRegister WHERE SessionLastTouch < DATEADD(min, -15, GETDATE())
    

    但是

    可能更好的方法是根据一些时间表清理会话寄存器 - 以减少高峰时段的数据库负载 - 只需创建作业,它每晚或某事清理寄存器。像这样

    【讨论】:

      【解决方案2】:

      当我的团队在 .NET 应用程序中部署 SQL Server 会话状态时,我们只需使用 SQL Server 代理创建一个作业,以每晚(或以某个适当的时间间隔)清理过期的会话。

      除非您有大量流量,否则您可以在方便的时候执行此操作,而不必担心会立即删除未使用的会话,但清理干净绝对是个好主意。

      【讨论】:

      • 谢谢!是的,最好在非高峰期进行清理。顺便说一句,删除记录时数据库会自行收缩吗?
      • 如果数据库性能对您很重要,您应该避免在生产数据库上运行 DBCC SHRINKFILE。缩小数据库文件意味着当它们再次增长时,文件不连续,这会增加磁盘查找。此外,增长文件的过程相当昂贵。
      【解决方案3】:

      如果您使用标准 SQL Server 会话状态,则会自动为您删除旧会话。在删除旧条目之前,会话不会过期,因为提供者不会主动监控会话表中的 Expires 列。

      安装/配置实用程序创建一个 SQL 代理作业,该作业每 60 秒调用一次DeleteExpiredSessions 存储过程。这意味着需要运行 SQL 代理才能使会话到期工作并清理表。

      【讨论】:

      • 嗨@RickNZ。这是一种可怕的行为,我们刚刚在我们的系统中注意到了这种行为并且很痛!您是否知道有任何修复或替代 SQL 提供程序以更符合预期的方式运行,而不是依赖于从数据库中物理删除的会话条目?
      • 我不知道有任何开源替代 SQL 提供程序。这不是标准提供程序的唯一问题,所以我经常为大型项目建议的是编写自己的替代提供程序。我自己做过这个;所涉及的工作量并没有您想象的那么大,而且性能提升可能很大。
      猜你喜欢
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2017-03-16
      • 2022-11-10
      • 2011-11-22
      • 1970-01-01
      相关资源
      最近更新 更多