Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Linq2Sql要为每个存储过程调用创建一个新连接并保持其打开状态?_C#_Sql Server_Linq_Sql Server 2005_Linq To Sql - Fatal编程技术网

C# 为什么Linq2Sql要为每个存储过程调用创建一个新连接并保持其打开状态?

C# 为什么Linq2Sql要为每个存储过程调用创建一个新连接并保持其打开状态?,c#,sql-server,linq,sql-server-2005,linq-to-sql,C#,Sql Server,Linq,Sql Server 2005,Linq To Sql,这以前没有发生过,所以我假设是我做了什么导致了这一切,但我看不出可能是什么 我已经针对SQLServer2005数据库设置了linq2sql。我只使用存储过程 我的大多数过程都工作正常,但这一特定的更新过程有时会连续触发几百次(克隆头记录的详细信息) 这会导致超时,运行脚本查看打开的连接会显示我的应用程序连接处于休眠状态并占用空间 有什么想法、建议吗 My datacontext设置为服务类中的静态变量: private static WarehouseSystemDataContext dc

这以前没有发生过,所以我假设是我做了什么导致了这一切,但我看不出可能是什么

我已经针对SQLServer2005数据库设置了linq2sql。我只使用存储过程

我的大多数过程都工作正常,但这一特定的更新过程有时会连续触发几百次(克隆头记录的详细信息)

这会导致超时,运行脚本查看打开的连接会显示我的应用程序连接处于休眠状态并占用空间

有什么想法、建议吗

My datacontext设置为服务类中的静态变量:

private static WarehouseSystemDataContext dc
{
    get
    {
        // It is being passed a closed SqlConnection object
        WarehouseSystemDataContext _dc = 
            new WarehouseSystemDataContext(Constants.getWarehouseSystemConn());
        _dc.ObjectTrackingEnabled = false;
        _dc.CommandTimeout = 600;

        return _dc;
    }
}

每次引用datacontext时,您都在创建一个新连接

private static WarehouseSystemDataContext _dc
private static WarehouseSystemDataContext dc
{
    get
    {
        if(_dc == null)
        {
        // It is being passed a closed SqlConnection object
        _dc = new WarehouseSystemDataContext(Constants.getWarehouseSystemConn());
        _dc.ObjectTrackingEnabled = false;
        _dc.CommandTimeout = 600;
        }
        return _dc;

    }
}

每次引用datacontext时,您都在创建一个新连接

private static WarehouseSystemDataContext _dc
private static WarehouseSystemDataContext dc
{
    get
    {
        if(_dc == null)
        {
        // It is being passed a closed SqlConnection object
        _dc = new WarehouseSystemDataContext(Constants.getWarehouseSystemConn());
        _dc.ObjectTrackingEnabled = false;
        _dc.CommandTimeout = 600;
        }
        return _dc;

    }
}

不用说,我假设您总是使用
块将
dc
的消费者包围在
中?(
使用(foo.dc){…}
)我通常不会。我以前的理解是linq2sql为您管理打开和关闭连接。为了解决这个问题,我添加了一个using块,但仍然不走运。linq2sql有时会正确地管理状态,有时则不会。当您完全迭代一个结果集时,它将在最后关闭它。我发现,当使用
.Single
时,它不会。也就是说,连接在GC'd时仍然会被处理掉,但这有时会在足够长的时间后发生,从而导致问题。我假设您总是使用
块将
dc
的消费者包围在
中,这是不言而喻的?(
使用(foo.dc){…}
)我通常不会。我以前的理解是linq2sql为您管理打开和关闭连接。为了解决这个问题,我添加了一个using块,但仍然不走运。linq2sql有时会正确地管理状态,有时则不会。当您完全迭代一个结果集时,它将在最后关闭它。我发现,当使用
.Single
时,它不会。也就是说,连接仍然会在GC'd时被处理掉,但这有时会在足够长的时间后发生,导致问题。为什么?因为它是静态的,我不是每次都使用相同的DataContext吗?应该由谁来管理自己的连接?完成后不应该关闭它们吗?@IronicMuffin,在你的问题中,实例不是静态的,在这里你是对的,我现在看到了错误。通过您的设置和using语句,我现在得到了一个ObjectDisposedException…您需要每次创建一个新的DataContext并将其包装在using语句中,或者拥有一个静态对象并在应用程序关闭时进行处理。不要将静态对象包装在using中。@IronicMuffin,如果使用的是静态数据上下文,请注意不要将
ObjectTrackingEnabled
设置为true。这是为什么?因为它是静态的,我不是每次都使用相同的DataContext吗?应该由谁来管理自己的连接?完成后不应该关闭它们吗?@IronicMuffin,在你的问题中,实例不是静态的,在这里你是对的,我现在看到了错误。通过您的设置和using语句,我现在得到了一个ObjectDisposedException…您需要每次创建一个新的DataContext并将其包装在using语句中,或者拥有一个静态对象并在应用程序关闭时进行处理。不要将静态对象包装在using中。@IronicMuffin,如果使用静态数据上下文,请注意不要将
ObjectTrackingEnabled
设置为true。