大家讨论使用以下存储Session方案 - Nodejs相关

大家讨论使用以下存储Session方案 - Nodejs相关

首先希望大家不要争议使用什么数据库保存Session更好。假如使用SQLSERVER2008来保存的话如何才能达到最高执行速度。

本人思路如下:首先有人问题困扰本人很久,就是如何使用sqlserver来保存Session,这里感谢本站的youxiachai,通过修改mysql保存session方案,原理很简单就是用户每次链接网站更新用户最近一次访问时间。使用sql语句更新表内容,再定时清理过期的Session。

可惜的SQLSERVER的计划任务没有mysql创建那么方便,又不想去开启SQLSERVER计划任务,于写了一大堆SQL代码。为保证执行速度与逻辑,决定使用存储过程。当访客打开网页时执行这个带参数储过程,更新sessions表。

MSSQL.csql(‘exec onsession ?,?,?’, [sid,uid,session], function (err) { callback(err); })

执行存储过程onsession,uid就是登录用户的ID,如何用户登录就能够知道用户ID,保存在Session表中,为了方便当跟踪当前在线用户。

目前碰到的问题是当用户首次打开速度有点慢。

提问: 这种方案是可行? 如何测试这种方案的性能?


6 回复

大家讨论使用以下存储Session方案 - Nodejs相关

首先希望大家不要争议使用什么数据库保存Session更好。假如使用SQL Server 2008来保存的话,如何才能达到最高执行速度。

思路分析

本人的思路如下:首先有人提出问题困扰了我很久,那就是如何使用SQL Server来保存Session。这里特别感谢本站的youxiachai,他通过修改MySQL保存session方案的原理,即用户每次访问网站时更新用户最近一次访问时间。使用SQL语句更新表内容,再定时清理过期的Session。

可惜的是,SQL Server的计划任务没有MySQL那样方便,我不想开启SQL Server的计划任务,于是写了一大堆SQL代码。为了保证执行速度和逻辑,我决定使用存储过程。当访客打开网页时,执行这个带参数的存储过程,更新sessions表。

const MSSQL = require('mssql');

MSSQL.connect({
    server: 'your_server',
    database: 'your_database',
    user: 'your_user',
    password: 'your_password'
}).then(pool => {
    return pool.request()
        .input('sid', MSSQL.VarChar, 'your_session_id')
        .input('uid', MSSQL.Int, 'your_user_id')
        .execute('onsession', function(err, result) {
            if (err) {
                console.error('Error executing stored procedure:', err);
            } else {
                console.log('Stored procedure executed successfully');
            }
            pool.close();
        });
}).catch(err => {
    console.error('Database connection error:', err);
});

当前遇到的问题

目前遇到的问题是,当用户首次打开页面时速度有点慢。这可能是由于连接数据库和执行存储过程需要一定的时间。为了提高性能,可以考虑以下几个方面:

  1. 连接池:使用连接池管理数据库连接,避免每次请求都重新建立连接。
  2. 缓存:对于不经常变化的数据,可以考虑使用缓存机制减少数据库查询次数。
  3. 异步处理:确保所有数据库操作都是异步的,以避免阻塞主线程。

测试性能的方法

  1. 基准测试工具:使用如JMeterLoadRunner等工具进行压力测试,模拟大量并发用户访问,观察系统的响应时间和吞吐量。
  2. 日志记录:在关键位置添加日志记录,统计每次请求的耗时,找出瓶颈所在。
  3. 性能监控:使用SQL Server Management Studio中的性能监视器,监控CPU、内存和磁盘I/O等资源的使用情况。

结论

这种方案是可行的,但需要优化数据库连接和执行存储过程的效率。通过合理利用连接池、缓存和异步处理,可以显著提升系统的整体性能。

希望这些信息能帮助大家更好地理解和优化使用SQL Server保存Session的方案。


你每次建立一个DB连接,当然慢喽, 还是执行SP, 更慢。。。。。显然用这种关系型数据库保存session太划不来, 要么memory要么用redis之类键值数据库。用Redis的话你都不用定时清理, 设置超时时间TTL就可以了

有没有办法解决这个问题(DB链接)

##解决上面链接问题的话可以用连接池,像你说的那样先不讨论使用哪种数据库来保存session的话,我是这样做的:先把session保存到内存中,然后采用一种机制来把session存储到数据库,我是十分钟去检查一下哪些session在十分钟内没有更新过,没有更新过的就写会数据库,至于这个时间间隔你要自己去把握,甚至你可以采取别的更复杂的机制去写会数据库。

nodejs 配合链接池怎么实践

对于您提出的使用SQL Server 2008来保存Session并希望提高执行速度的需求,可以采用存储过程的方式来进行优化。以下是关于您的问题的详细解答:

这种方案是否可行?

是的,使用存储过程来更新Session数据是一种可行的方法。通过存储过程,您可以将复杂的逻辑封装起来,并且减少网络通信的开销,从而提高性能。

如何测试这种方案的性能?

  1. 基准测试:可以使用像JMeter或LoadRunner这样的工具模拟多个并发用户请求,然后观察系统的响应时间和吞吐量。
  2. 性能分析:使用SQL Server Profiler或者SQL Server Management Studio中的查询性能分析器来监控存储过程的执行时间,查看是否有性能瓶颈。
  3. 索引优化:确保在sessions表上正确地设置了索引,特别是用于查找和更新的字段(如sid)。
  4. 事务管理:如果存储过程中包含多个操作,考虑使用合适的事务管理策略,以确保数据一致性。

示例代码

假设您的存储过程onsession是这样的:

CREATE PROCEDURE onsession
    @sid NVARCHAR(255),
    @uid INT,
    @session NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION;
    
    -- 更新session信息
    UPDATE sessions 
    SET last_accessed = GETDATE(), session_data = @session 
    WHERE sid = @sid;

    -- 清理过期的Session
    DELETE FROM sessions 
    WHERE last_accessed < DATEADD(HOUR, -1, GETDATE()) AND sid <> @sid;

    COMMIT TRANSACTION;
END

在Node.js中调用存储过程的代码可能如下所示:

const { Pool } = require('mssql');

const pool = new Pool({
    user: 'your_user',
    password: 'your_password',
    server: 'your_server',
    database: 'your_database',
    options: {
        encrypt: true // 使用加密连接
    }
});

async function updateSession(sid, uid, session, callback) {
    try {
        await pool.request()
            .input('sid', sql.NVarChar, sid)
            .input('uid', sql.Int, uid)
            .input('session', sql.NVarChar(sql.MAX), session)
            .execute('onsession');
        callback(null);
    } catch (err) {
        callback(err);
    }
}

// 调用示例
updateSession('some_session_id', 1, 'session_data', (err) => {
    if (err) console.error('Error updating session:', err);
    else console.log('Session updated successfully.');
});

总结

这种方式可以有效地管理Session数据,并且通过合理的优化,可以提高系统的性能。不过,请注意实际部署前进行充分的测试,确保系统在高负载下也能稳定运行。

回到顶部