Connection Pool

Thread Pool์— ์ด์–ด์ง€๋Š” ๊ธ€์ด๋‹ค.

Source code

https://github.com/teamsmiley/gitbook-sample/tree/main/ThreadTest

entity framework sample code

๋‚˜๋Š” mysql๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. test๋””๋น„๋ฅผ ๋งŒ๋“ค๊ณ  blogํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ๋‹ค ํ•ญ๋ชฉ์€ url์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

dotnet add package Pomelo.EntityFrameworkCore.MySql --version 6.0.2
vi ValuesController.cs
using var connection = new MySqlConnection("server=192.168.1.21;User ID=root;Password=root;database=test;");
connection.Open();

using var command = connection.CreateCommand();
command.CommandText = "DO SLEEP(10);SELECT Url FROM Blogs;";

using var reader = command.ExecuteReader();
while (reader.Read())
{
  var url = reader.GetString(0);
  System.Console.WriteLine($"blog url {url}");
}

// Thread.Sleep(1000000); // Sleep for 10 seconds
Console.WriteLine("Thread completed. go back to the pool.");

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  locust๋ฅผ ์‹คํ–‰ํ•˜์ž๋งˆ์ž ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

que๊ฐ€ ๊ณ„์† ์˜ฌ๋ผ๊ฐ„๋‹ค.

๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ dbcontext๋Š” connection pool์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

https://learn.microsoft.com/en-us/ef/core/performance/advanced-performance-topics?tabs=with-di%2Cexpression-api-with-constant#dbcontext-pooling

AddDbContextPool๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ connection pool์€ 1024๊ฐœ์˜ ํ’€์„ ๋งŒ๋“ ๋‹ค. ์ด๊ฒƒ์€ ์„ค์ •์„ ํ†ตํ•ด์„œ ๋ณ€๊ฒฝํ• ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ mysql์˜ max_connection ๊ฐฏ์ˆ˜๋ณด๋‹ค ๋งŽ์œผ๋ฉด thread๊ฐ€ ์ฃฝ๋Š”๊ฒƒ์„ ์•Œ์ˆ˜์žˆ๋‹ค

SHOW VARIABLES LIKE '%connect%';SHOW STATUS LIKE 'Threads_connected';

102๊ฐœ ์ด์ƒ์˜ ์ปค๋„ฅ์…˜์„ ์•ˆ๋ฐ›๋Š”๊ฑธ ์•Œ์ˆ˜ ์žˆ๋‹ค.

api๋Š” error๋ฅผ ๋ณด๋‚ธ๋‹ค.

api๋ฅผ ๋ฉˆ์ถ”์ž.

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ๊ฐฏ์ˆ˜๋Š” ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค.

์ด๊ฒƒ์€ mysql์˜ wait_timeout์ด 8์‹œ๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 8์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ค„์–ด๋“ค๋ ค๋‚˜.

๊ฒฐ๊ณผ์ ์œผ๋กœ connect์„ ๊ณ„์† ๋Š˜๋ฆฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ๋””๋น„๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผํ•˜๋Š”๊ฒฝ์šฐ๊นŒ์ง€ ์ƒ๊ธธ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์ž.

// command.CommandText = "DO SLEEP(1000);SELECT Url FROM Blogs;";
command.CommandText = "SELECT Url FROM Blogs;";

๋ฌธ์ œ์—†์ด ๋ชจ๋“ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ๊ณ  connect๋„ ๋งŽ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค

๊ฒฐ๋ก ์€ ์ฟผ๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์ปค๋„ฅ์…˜์ด ์ž๋™์œผ๋กœ ๋Š์–ด์ง€๋Š”๊ฑธ ์•Œ์ˆ˜์žˆ๋‹ค.

์ปค๋„ฅ์…˜ ํ’€์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปค๋„ฅ์…˜์„ ์žฌ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ณ  ์ปค๋„ฅ์…˜์„ ๋” ๋นจ๋ฆฌ ์–ป์„์ˆ˜ ์žˆ๋‹ค.

ํผํฌ๋จผ์Šค

๋‘๋ฐฐ ์ด์ƒ์˜ ์ปค๋„ฅ์…˜ ๋งบ๋Š” ์†๋„ ํ–ฅ์ƒ์„ ์–ป์„์ˆ˜ ์žˆ๋‹ค.

todo

๋‹ค์Œ์€ redis๋ฅผ ํ•ด๋ณด์ž.

Last updated

Was this helpful?