代码之家  ›  专栏  ›  技术社区  ›  Jason

节点mssql临时表丢失-请求错误:无效的对象名称“#MyTestable”

  •  0
  • Jason  · 技术社区  · 7 年前

    我正在使用节点mssql并从docker连接到2017 sql server。

    问题

    在我的剧本中,我把

    var test = await dbRequest().batch("SELECT * FROM #myTestTable");

    偶尔,我会发现错误 RequestError: Invalid object name '#myTempTable' .所以我在sql上放了一些手表。ConnectionPool以确定导致错误的条件。事实证明,在大多数执行行中,都是池。水塘可用变量为1,如下所示。

    enter image description here

    每当错误发生时,在进入下一行之前,请使用pool。水塘可用值将为0,因此:

    enter image description here

    如果在跑步前发生这种情况 var test=await dbRequest()。批次(“从#myTestTable中选择*);

    它将以失败告终 RequestError:无效的对象名称“#MyTestable”

    我试过的

    我试着通过发送一个池配置到乏味的 {min: 100, max: 1000, log: true} ,但不幸的是,它似乎被忽视了( https://www.npmjs.com/package/mssql#connection-pools )

    var sqlServerProperty = {
        user: '',
        password: '',
        server: '192.168.1.13',
        database: 'CCTDB',
        pool: {min: 1, 
            max: 100, 
            idleTimeoutMillis: 30000}
    };
    

    我也试过一个泳池。request()并从中运行所有dbRequests。没有骰子!

    感谢您的帮助!

    dbRequest()看起来像什么?

    // the entire script is wrapped in an async function
            var pool = new sql.ConnectionPool(sqlServerProperty);
            await pool.connect();
            var dbRequest = ( () => { return pool.request() });
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Alexander Volok    7 年前

    该错误消息只是一个信号,表明初始会话(或连接)已关闭,新会话已启动。临时表具有会话的生存期。为了解决这个问题,请确保您的逻辑可以保留打开的连接,直到不再需要临时表

    我不是nodejs方面的专家,但速度很快 research 说明:

    有一个明确的方法可以做到这一点——只需初始化与 水塘最小选项设置为1 (或更高) .这意味着,至少 池中至少有一个活动连接。数字越大意味着越多 并发活动连接。

    你试过类似的东西吗?:

    pool: {min: 20, 
            max: 100, 
            idleTimeoutMillis: 30000}
    

    在这种情况下,将建立更多的连接,因此在某个时间点有更多的连接可用,并且您的会话关闭的可能性将降低,因为它将被其他东西使用

        2
  •  1
  •   Brandon    7 年前

    为了确保系列中的所有批处理都在同一连接下执行,还可以使用事务: https://www.npmjs.com/package/mssql#transaction

    请注意,在提交之前,事务将锁定记录,这可能会导致数据库阻塞。