连接池 – 一个进程 – 多个线程

2024-01-18

我对连接池的理解是;如果连接字符串完全相同,则我们重用该连接而不是建立新连接。

我的问题是我正在创建许多线程用于并行处理。在这个“虚拟”程序中,我创建了 500 个线程并让 ThreadPool 函数处理这些线程。

步骤是:

  1. 每个线程都会用 SQL 创建一个更新表。 (注明更新的时间戳)

  2. 然后线程休眠 1 到 10 秒(随机)。

  3. 最后,线程在 SQL 中进行另一次更新(说明结束时间的时间戳)

  4. 然后线程退出

    class Program
    {
        static void Main(string[] args)
        {
            int numberOfThreads = 150;
    
            ThreadPool.SetMinThreads(numberOfThreads, numberOfThreads);
            ThreadPool.SetMaxThreads(numberOfThreads, numberOfThreads);
    
            List<Int64> chunkList = new List<Int64>();
    
            int maxNumberOfChunks = 500;
            for (int i = 1; i < maxNumberOfChunks; i++)
            {
                chunkList.Add(i);
            }
    
            foreach (Int64 chunk_id in chunkList)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadWorker), new arguments { chunk_id = chunk_id });
            }
            Console.ReadLine();
    
        }
        static void ThreadWorker(Object stateInfo)
        {
            arguments arguments = (arguments)stateInfo;
    
            Console.WriteLine("Chunk # : {0} is set to START", arguments.chunk_id);
            UpdateSQLdb(arguments.chunk_id, DateTime.Now, null, null, "START", null, null);
    
            Random random = new Random();
            int mseconds = random.Next(1, 10) * 1000;
            System.Threading.Thread.Sleep(mseconds);
            Console.WriteLine("Chunk # : {0} is sleeping for {1} sec.", arguments.chunk_id, mseconds);
    
            Console.WriteLine("Chunk # : {0} ist set to END", arguments.chunk_id);
            UpdateSQLdb(arguments.chunk_id, null, DateTime.Now, null, "END", null, null);
        }
        struct arguments
        {
            public Int64 chunk_id;
        }
    
        static void UpdateSQLdb(Int64 CHUNK_ID, DateTime? START_TS = null, DateTime? END_TS = null, Enum CHUNK_STATUS = null, string error_messages = null, byte? NEW_CALCULATION_ATTEMPTS = null, byte? NEW_POSTPROCESS_ATTEMPTS = null)
        {
            using (SqlConnection conn = new SqlConnection("Data Source=C55S01;Initial Catalog=MCS_BATCH;Integrated Security=SSPI;Asynchronous Processing=True")) //Timeout=60;Max Pool Size=200;Pooling=True;
            {
                int result = -1;
                conn.Open(); //<-- Each time I open a connection. It creates a new instead of reusing one from the ConnectionPool
    
                try
                {
                    using (SqlCommand cmd = new SqlCommand("TEST.UpdateSQL", conn))
                    {
                        cmd.CommandTimeout = 300; 
                        cmd.CommandType = System.Data.CommandType.StoredProcedure;
    
                        cmd.Parameters.Add("@CHUNK_ID", SqlDbType.BigInt, 15).Value = CHUNK_ID;
                        cmd.Parameters.Add("@START_TS", SqlDbType.DateTime2, 7).Value = START_TS;
                        cmd.Parameters.Add("@END_TS", SqlDbType.DateTime2, 7).Value = END_TS;
                        cmd.Parameters.Add("@ERR_MESSAGE", SqlDbType.VarChar).Value = error_messages;
                        cmd.Parameters.Add("@ReturnValue", System.Data.SqlDbType.Int, 4).Direction = System.Data.ParameterDirection.ReturnValue;
    
                        try
                        {
                            result = cmd.ExecuteNonQuery();
    
                            int return_value = (int)cmd.Parameters["@ReturnValue"].Value;
                            if (return_value != 0)
                            {
                                Console.WriteLine("1. Error in running TEST.UpdateSQL, return value is : {0}", cmd.Parameters["@ReturnValue"].Value);
                            }
                        }
                        catch (SqlException ex)
                        {
                            UpdateSQLdb(CHUNK_ID, null, DateTime.Now, null, ex.Message.ToString(), null, null);
                            Console.WriteLine("2. Error executing TEST.UpdateSQL : {0}", ex);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("3.Error in TEST.UpdateSQL : {0}", ex);
                    throw;
                }
                if (conn.State == ConnectionState.Open)
                {
                    Console.WriteLine("Closing connection....");
                    conn.Close();
                }
                conn.Dispose();
            }
        }
    }
    

    }

我的问题是我得到了System.InvalidOperationException 未处理 (超时已过期。从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小。)

我监控了SQL服务器上的连接数,它很快就达到了100个连接(这是池中默认的最大连接数)

如果尝试将这些参数添加到连接字符串中:超时=60"最大池大小=200;池化=True;

但这只会将问题推迟到稍后阶段,因为连接池将达到 200 并且在某个时刻会达到超时。

问题:为什么要一遍又一遍地创建连接,而不是重用连接池中的连接?

任何提示、技巧或建议都将受到高度赞赏。


它正在完全按照您的要求进行操作。它正在使用池中的连接,但您给了它太多的工作。如果您有 500 个线程和 200 个连接,则每个线程不能有连接。您可能应该拥有与线程一样多的连接。

如果您还有更多工作要做(所有 500 个线程都忙),那么您必须向使用者返回错误,或者以其他方式限制应用程序的输入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接池 – 一个进程 – 多个线程 的相关文章

  • 如何在Jenkins上更改工作空间并建立记录根目录?

    我希望将 Jenkins 的数据写入驱动器 E 因为这是服务器上的大型驱动器 Jenkins 本身安装在 C 上 我怎么做 我看到的默认配置是 工作区根目录 ITEM ROOTDIR 工作区 构建记录根目录 ITEM ROOTDIR 构建
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包
  • Javascript/jQuery 外部高度()

    Does idOfLememt outerHeight 对所有浏览器产生相同的结果 IE7 有什么不同吗 只要去http api jquery com outerHeight http api jquery com outerHeight
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • Android 的代码覆盖率[重复]

    这个问题在这里已经有答案了 可能的重复 Android测试代码覆盖率 Eclipse https stackoverflow com questions 3282702 android test code coverage eclipse
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • Maven2继承

    如果我有一个父 pom 并且想将其继承到多个项目 我通常通过添加到项目顶部来做到这一点
  • 纯旧 PHP 对象 (POPO) 一词的确切含义是什么?

    我想了解一下波波 我搜索了 popo 发现它代表 Plain Old Php Object 但我不确定 Plain Old Php Object 的确切含义 我想知道什么是 popo 以及在哪里使用它 谢谢 普通旧 在此处插入语言 对象是一
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • JavaScript 中“键”的类型是什么?

    当我失去焦点并开始思考一个愚蠢的问题时 我遇到了这样的时刻 var a b value b 的类型是什么 我的意思不是 值 的类型 而是标记为 b 的实际键 背景 当我必须创建一个字符串键时 我开始想知道这一点 var a b value
  • 从 Teradata sql Assistant 将结果导出到 Excel 工作表

    我想通过在 Teradata SQL Assistant 中运行查询将结果导出到 Excel 工作表中 我使用了复制粘贴 但没有用 提前致谢 如果您将答案返回到 SQL Assistant 您应该能够从 文件 菜单中选择 保存答案集 然后
  • 如何在 Symfony 4 中为测试环境设置数据库

    我对如何在 symfony 4 中为测试环境设置数据库感到困惑 我曾经在配置测试 ymlsymfony 3 及以下版本中的文件 最佳做法是什么 我应该重新创建一个学说 yaml文件输入配置 包 测试 该文档提到如何通过编辑 phpunit
  • 尝试了解天蓝色云服务中的负载平衡

    我正在维护一个天蓝色的云服务 它有 1 个 Web 角色和几个辅助角色 该网络角色有多个实例 当我从资源中打开云服务时 我可以看到服务端点和公共IP地址 我想了解这个蔚蓝云服务中的流量负载是如何平衡的 我搜索了负载均衡器 但在订阅中找不到它
  • 将 read.csv 与符号链接文件一起使用

    我正在尝试做什么 我的源文件非常大 我想避免将其复制到其他文件夹中 我决定创建一个指向大文件的符号链接并想使用read csv读取文件 文件夹结构 项目1 数据 源文件 csv 项目2 数据 别名到源文件 csv 什么地方出了错 读取源文件
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • 如何使 spring @retryable 可配置?

    我有这段代码 Retryable maxAttempts 3 stateful true include ServiceUnavailableException class exclude URISyntaxException class
  • jquery读取嵌套的json

    我有以下 json 如下所示 我正在尝试读取值 TOP1 TOP2 我有点不确定该怎么做 我正在使用以下内容 但这只会给我一个包含 TOP1 和 TOP2 嵌套对象的对象 如何获取 TOP1 和 TOP2 值 getJSON http lo
  • 将 TArray 类型转换为 X 数组是否安全?

    今天我发现了一个编译器错误 QC 108577 http qc embarcadero com wc qcmain aspx d 108577 以下程序无法编译 program Project1 APPTYPE CONSOLE proced
  • 系统找不到JavaApplicationLauncher

    我正在运行 Mac OS X 版本 12 0 1 也称为 Monterey 我已经安装了 MultiWii 程序来控制我正在构建的无人机 本教程逐步介绍下载 解压 甚至适用于 MacOS 的特殊 chmod 指令 然而 当我尝试运行 Mul
  • 读取、读取部分读取

    我似乎无法在文档中找到有关此内容的信息 The read系统调用文档说它读取的数据可能少于指定的数据 做read尝试阅读几次 我知道fread是一个包装器read 当我调用fread 它是否有可能多次从流中读取 直到它变为 0 或读取指定的
  • 如何围绕轮廓绘制矩形?

    我刚刚开始使用 opencv 我正在尝试制作一个程序 在沙子上的岩石图片周围放置方块 该函数的文档here http docs opencv org modules imgproc doc structural analysis and s
  • 如何将 Vec> 移动到 Vec>>

    我有一个Vec
  • Python 中使用回溯记录异常

    如何记录 Python 异常 try do something except How can I log my exception here complete with its traceback Use logging exception
  • 弹性容器中的等高行

    如您所见 list items在第一个row有相同的height 但第二个项目row有不同的heights 我希望所有物品都有统一的height 有什么方法可以在不付出的情况下实现这一目标固定高度并且只使用flexbox 这是我的code
  • 向上滚动时折叠工具栏图像消失

    我正在尝试实现一个带有大标题图像的折叠工具栏 我希望图像开始时非常大 并且它有效 并且不完全崩溃 这也有效 问题是 当工具栏达到最小可折叠高度时 图像会消失 并褪色为应用程序的主要颜色 我希望图像即使在折叠时也保持可见 另外 后退按钮与图片
  • 可观察集合替换项目

    我有一个ObservableCollection 我可以从集合中添加和删除项目 但我无法替换集合中的现有项目 有一种方法可以替换项目并将其反映在我的绑定组件上 System Collections Specialized NotifyCol
  • TPL 数据流:为什么 EnsureOrdered = false 会破坏此 TransformManyBlock 的并行性?

    我正在研究 TPL 数据流管道 并注意到与排序 并行性相关的一些奇怪行为TransformManyBlocks 也可能适用于其他块 这是我要重现的代码 NET 4 7 2 TPL Dataflow 4 9 0 class Program s
  • 如何删除单元格中第一个空格之后的所有字符?

    我有一个城市名称列表 后跟它们所在的州 所有这些都在 Excel 的一列中 如何删除第一个空格之后的所有内容 以便城市名称成为单元格中唯一保留的内容 示例 A1 约翰逊德克萨斯州 应该只是 A1 约翰逊 我假设你想要一个 VBA 解决方案
  • 使用 vscode 扩展 API 更改文件 EOL

    我可以在 VSCode 中默默地更改行尾顺序吗 像这样的事情 vscode commands executeCommand workbench action editor changeEOL LF 您可以将此行添加到您的用户首选项设置中 C
  • 应用按键后捕获 HTML 文本输入按键?

    完全是新手问题 所以请耐心等待 当 HTML 文本输入控件中发生按键时 有两个事件似乎对管理按键很有用 onKeyPress 和 onChanged onKeyPress 在按下按键后 但在将操作应用于控件的文本之前触发 仅当焦点从控件中移
  • 使用 webdriver 查找元素的最佳且最快的方法是什么? By.XPath 或 By.ID 还是其他?为什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用 webdriver 查找元素的最佳且最快的方法是什么 By XPath 或 By ID 还是其他 为什么 我在很多地方都读到 XPath
  • 替换字符串中的字符,而不使用字符串replace()方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个字符串 String originalString This car is my car 我想用 自行车 替换 汽车 而不使用字符
  • 使用 ExecutorService 将任务确定性分配给线程

    给定 Executor 服务具有固定的线程池 是否可以保证任务到线程的确定性分配 更准确地说 假设只有两个线程 即 pool thread 0 和 pool thread 1 并且有 2 个要执行的任务的集合 我希望实现的是前一个线程始终执
  • 将音频缓冲区从 44100 重新采样到 16000

    我有 data uri 格式的音频数据 然后我将此 data uri 转换为缓冲区 现在我需要新采样率的缓冲区数据 当前音频数据为 44 1khz 我需要 16khz 的数据 如果我记录了使用 RecordRTC API 录制音频 如果我以
  • 连接池 – 一个进程 – 多个线程

    我对连接池的理解是 如果连接字符串完全相同 则我们重用该连接而不是建立新连接 我的问题是我正在创建许多线程用于并行处理 在这个 虚拟 程序中 我创建了 500 个线程并让 ThreadPool 函数处理这些线程 步骤是 每个线程都会用 SQ