ASP 간의 연결 풀 문제를 해결하려면 어떻게 해야 합니까?NET 및 SQL 서버?
최근 며칠 동안 웹 사이트에 이 오류 메시지가 너무 많이 표시되었습니다.
"시간 제한이 만료되었습니다.풀에서 연결을 얻기 전에 경과한 시간 초과 기간입니다.모든 풀링된 연결이 사용 중이고 최대 풀 크기에 도달했기 때문에 이러한 문제가 발생했을 수 있습니다."
우리는 한동안 우리의 코드에서 아무것도 변경하지 않았습니다.코드를 수정하여 닫히지 않은 열린 연결을 확인했지만 이상이 없습니다.
어떻게 해결해야 하나요?
이 풀을 편집해야 합니까?
이 풀의 최대 연결 수를 편집하려면 어떻게 해야 합니까?
트래픽이 많은 웹 사이트의 권장 값은 얼마입니까?
업데이트:
IIS에서 무언가를 편집해야 합니까?
업데이트:
활성 연결 수는 15개에서 31개 사이이며 SQL 서버에 구성된 최대 허용 연결 수가 3200개 이상이거나 31개가 너무 많거나 ASP에서 무언가를 편집해야 한다는 것을 알게 되었습니다.NET 구성?
대부분의 경우 연결 풀링 문제는 연결 누출과 관련이 있습니다.응용프로그램이 데이터베이스 연결을 정확하고 일관되게 닫지 않을 수 있습니다.연결을 열어 두면 연결이 차단된 상태로 유지됩니다.NET 가비지 컬렉터는 해당 가비지 컬렉터를 호출하여 닫습니다.Finalize()
방법.
정말로 연결을 닫고 있는지 확인하려고 합니다.예를 들어, 다음 코드는 다음 코드 사이의 코드일 경우 연결 누출을 유발합니다..Open
그리고.Close
예외를 발생시킵니다.
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
올바른 방법은 다음과 같습니다.
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
또는
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
함수가 클래스 메서드에서 연결을 반환할 때 로컬로 캐시하고 호출해야 합니다.Close
과 같은 다음과 같은 코드를 사용하여 연결이 누출됩니다.
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
에서 첫번호출연결입니다반환된서에째▁fromion▁returned▁to다▁the로 연결이 반환되었습니다.getConnection()
닫히지 않습니다.이 줄은 연결을 닫는 대신 새 연결을 만들고 닫으려고 합니다.
사용하는 경우SqlDataReader
는또.OleDbDataReader
그것들을 닫아요.연결 자체를 닫는 것이 효과적인 것처럼 보이더라도 데이터 판독기 개체를 사용할 때 개체를 명시적으로 닫도록 추가적인 노력을 기울여야 합니다.
MSDN/SQL Magazine의 "연결 풀이 오버플로되는 이유" 기사에서는 많은 세부 정보를 설명하고 몇 가지 디버깅 전략을 제안합니다.
- 려달을 합니다.
sp_who
또는sp_who2
는 이한시저프다는정반다의 합니다.sysprocesses
모든 작업 프로세스에 대한 상태 및 정보를 표시하는 시스템 테이블입니다.일반적으로 연결당 하나의 SPID(서버 프로세스 ID)가 표시됩니다.연결 문자열에서 응용 프로그램 이름 인수를 사용하여 연결 이름을 지정한 경우 작업 중인 연결을 쉽게 찾을 수 있습니다. - SQL Server와 SQL SQL Profiler 파일
TSQL_Replay
열려 있는 연결을 추적하는 템플릿입니다.Profiler에 익숙하다면 sp_who를 사용하여 폴링하는 것보다 이 방법이 더 쉽습니다. - 성능 모니터를 사용하여 풀 및 연결을 모니터링합니다.저는 이 방법에 대해 잠시 논의하겠습니다.
- 코드의 성능 카운터를 모니터링합니다.루틴을 사용하여 카운터를 추출하거나 새 항목을 사용하여 연결 풀의 상태와 설정된 연결 수를 모니터링할 수 있습니다.NET 성능 카운터 컨트롤.
설치 시.NET Framework v4.6.1 이 변경으로 인해 원격 데이터베이스에 대한 연결이 즉시 시간 초과되기 시작했습니다.
매개 합니다.TransparentNetworkIPResolution
연결 문자열에서 false로 설정합니다.
Server=myServerName;Database=myDataBase;Trusted_Connection=참;투명 네트워크IP 해결=거짓
사용량이 많이 늘지 않은 이상, 밀린 업무만 있을 가능성은 거의 없어 보입니다.IMO, 가장 가능성이 높은 옵션은 어떤 것이 연결을 사용하고 있고 연결을 즉시 해제하지 않는 것입니다.사용하시겠습니까?using
모든경 ? 아니면 (을 통해)아니면 (어떤 메커니즘을 통해) 연결을 해제합니까?
연결 또는 데이터 판독기를 닫기 전에 닫히지 않은 데이터 판독기와 response.redirects를 확인했습니까?리디렉션 전에 연결을 닫지 않으면 연결이 열린 상태로 유지됩니다.
저희 웹사이트에서도 가끔 이런 문제가 발생합니다.우리의 경우의 범인은 우리의 통계/지수가 시대에 뒤떨어져 있다는 것입니다.이로 인해 이전에 빠르게 실행되던 쿼리가 느려지고 시간이 초과됩니다.
쿼리의 영향을 받는 테이블에서 통계를 업데이트하거나 인덱스를 다시 작성하여 도움이 되는지 확인합니다.
하지만 또 다른 이유는 제 경우에 발생했습니다, 사용 때문입니다.async
/await
다음과 같은 오류 메시지가 표시됩니다.
System.잘못된 작동예외: '시간 제한이 만료되었습니다.풀에서 연결을 얻기 전에 경과한 시간 초과 기간입니다.이는 풀링된 모든 연결이 사용 중이고 최대 풀 크기에 도달했기 때문에 발생했을 수 있습니다.'
무슨 일이 일어났는지(그리고 어떻게 해결했는지)에 대한 간략한 개요만 말씀드리면 앞으로 다른 사람들에게 도움이 될 것으로 기대됩니다.
원인 찾기
이 모든 것은 ASP에서 발생했습니다.NET Core 3.1 웹 프로젝트는 Dapper와 SQL Server를 사용하지만, 저는 그것이 그런 종류의 프로젝트와는 독립적이라고 생각합니다.
먼저 SQL 연결을 가져오는 중앙 기능이 있습니다.
internal async Task<DbConnection> GetConnection()
{
var r = new SqlConnection(GetConnectionString());
await r.OpenAsync().ConfigureAwait(false);
return r;
}
저는 이 기능을 다음과 같은 수십 가지 방법으로 사용하고 있습니다.
public async Task<List<EmployeeDbModel>> GetAll()
{
await using var conn = await GetConnection();
var sql = @"SELECT * FROM Employee";
var result = await conn.QueryAsync<EmployeeDbModel>(sql);
return result.ToList();
}
보시다시피, 저는 새로운 제품을 사용하고 있습니다.using
(곱슬곱슬한없진괄술는가호▁without진){
,}
), .), 연결의 폐기는 다음과 같습니다.
그래도 풀에서 더 이상 사용할 수 있는 연결이 없다는 오류가 발생했습니다.
나는 내 애플리케이션을 디버깅하기 시작했고 예외가 발생하면 애플리케이션이 중지되도록 했습니다.중지되었을 때 처음에 Call Stack 창을 살펴보았지만, 이 창에는 System 내부의 일부 위치만,Data.SqlClient는 제게 실질적인 도움이 되지 않았습니다.
다음으로 작업 창을 살펴보았는데, 훨씬 더 도움이 되었습니다.
말 그대로 수천 통의 전화가 걸려왔습니다.GetConnection
메서드가 "대기 중" 또는 "예약됨" 상태에 있습니다.
작업 창에서 해당 행을 두 번 클릭하면 콜 스택 창을 통해 코드의 관련 위치가 표시됩니다.
이것은 제가 이 행동의 진짜 이유를 찾는 데 도움이 되었습니다.그것은 아래의 코드로 되어 있었습니다(완전성을 참조하십시오.
[Route(nameof(LoadEmployees))]
public async Task<IActionResult> LoadEmployees(
DataSourceLoadOptions loadOption)
{
var data = await CentralDbRepository.EmployeeRepository.GetAll();
var list =
data.Select(async d =>
{
var values = await CentralDbRepository.EmployeeRepository.GetAllValuesForEmployee(d);
return await d.ConvertToListItemViewModel(
values,
Config,
CentralDbRepository);
})
.ToListAsync();
return Json(DataSourceLoader.Load(await list, loadOption));
}
위의 컨트롤러 작업에서 먼저 다음과 같은 작업을 수행했습니다.EmployeeRepository.GetAll()
데이터베이스 테이블 "직원"에서 모델 목록을 가져옵니다.
다음 각 결과 의 각 행에 대해 다시 했습니다.EmployeeRepository.GetAllValuesForEmployee(d)
.
성능 측면에서는 매우 나쁘지만 비동기 컨텍스트에서는 연결 풀 연결을 적절하게 해제하지 않고 다 먹어 치우는 방식으로 동작합니다.
해결책
외부 SQL 쿼리의 내부 루프에서 SQL 쿼리를 제거하여 해결했습니다.
하다면 하나.JOIN
s는 단일 SQL 쿼리에서 데이터베이스의 모든 데이터를 가져옵니다.
배운 교훈
에 SQL 쿼리를 쿼리를 사용할 는 SQL 를 많이 사용하지 마십시오.async
/await
.
시간 초과 문제를 해결하기 위해 시도할 수도 있습니다.
을 추가하지 httpRuntime에 합니다.<system.web>
꼬리표를 달다
<sytem.web>
<httpRuntime maxRequestLength="20000" executionTimeout="999999"/>
</system.web>
그리고.
연결 문자열을 다음과 같이 수정합니다.
<add name="connstring" connectionString="Data Source=DSourceName;Initial Catalog=DBName;Integrated Security=True;Max Pool Size=50000;Pooling=True;" providerName="System.Data.SqlClient" />
최종 사용 시
try
{...}
catch
{...}
finaly
{
connection.close();
}
및 풀 할 수 .MinPoolSize=xyz
및/는MaxPoolSize=xyz
연결 문자열에 있습니다.그러나 이 문제의 원인은 다른 것일 수 있습니다.
저도 같은 문제를 안고 있었고, 출처를 찾는 데 도움이 된 것을 공유하고 싶었습니다.연결 문자열에 응용프로그램 이름을 추가한 다음 SQL Server에 대한 열려 있는 연결을 모니터링합니다.
select st.text,
es.*,
ec.*
from sys.dm_exec_sessions as es
inner join sys.dm_exec_connections as ec on es.session_id = ec.session_id
cross apply sys.dm_exec_sql_text(ec.most_recent_sql_handle) st
where es.program_name = '<your app name here>'
한 회사에서 타사 데이터 계층을 사용할 때도 이 문제가 발생했습니다.NET 응용 프로그램.문제는 레이어가 연결을 제대로 닫지 않았다는 것입니다.
우리는 레이어를 버리고 레이어를 직접 만들었습니다. 레이어는 항상 닫히고 연결을 폐기합니다.그 이후로 더 이상 오류가 발생하지 않습니다.
제 경우에는 DataReader 개체를 닫지 않았습니다.
using (SqlCommand dbCmd = new SqlCommand("*StoredProcedureName*"))
using (dbCmd.Connection = new SqlConnection(WebConfigurationAccess.ConnectionString))
{
dbCmd.CommandType = CommandType.StoredProcedure;
//Add parametres
dbCmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = ID;
.....
.....
dbCmd.Connection.Open();
var dr = dbCmd.ExecuteReader(); //created a Data reader here
dr.Close(); //gotta close the data reader
//dbCmd.Connection.Close(); //don't need this as 'using' statement should take care of this in its implicit dispose method.
}
게시된 솔루션 외에도.
각각 공통 GetRS를 여러 번 호출하는 1000페이지의 레거시 코드를 처리할 때 다음과 같은 문제를 해결하는 또 다른 방법이 있습니다.
기존 공통 DLL에서 CommandBehavior를 추가했습니다.연결 닫기 옵션:
static public IDataReader GetRS(String Sql)
{
SqlConnection dbconn = new SqlConnection(DB.GetDBConn());
dbconn.Open();
SqlCommand cmd = new SqlCommand(Sql, dbconn);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
그런 다음 각 페이지에서 데이터 판독기를 닫기만 하면 연결도 자동으로 닫혀 연결 누출이 방지됩니다.
IDataReader rs = CommonDLL.GetRS("select * from table");
while (rs.Read())
{
// do something
}
rs.Close(); // this also closes the connection
이는 주로 응용프로그램에서 연결이 닫히지 않았기 때문입니다.연결 문자열에 "MinPoolSize" 및 "MaxPoolSize"를 사용합니다.
(...) {}을(를) 사용하여 복잡한 레거시 코드를 작업하는 경우.불가능합니다 - 저처럼 - 잠재적으로 연결이 누출되었을 때(설정된 시간 초과 후 닫히지 않음) 연결 생성의 콜 스택을 확인하는 방법을 위해 이 SO 질문에 게시한 코드 조각을 확인하는 것이 좋습니다.이를 통해 누출의 원인을 쉽게 발견할 수 있습니다.
SQL 연결을 너무 많이 인스턴스화하지 마십시오.하나 또는 두 개의 연결을 열고 모든 다음 SQL 작업에 사용합니다.
그럴 때 조차도Dispose
예외가 던져지는 연결에서.
파티가 꽤 늦은 시간이었지만, 저는 최근에 이런 오류를 겪었습니다. 그리고 제가 이 문제를 검색하는 것을 발견한 것은 연결 유출 외에는 어떤 것도 제게 통찰력을 주지 못했습니다. 그건 제 문제가 아니었습니다.
다른 사람에게 도움이 될 수도 있는 경우를 대비해, 문제와 해결책, 그리고 다른 곳에서는 찾을 수 없었기 때문에 제가 도중에 발견한 몇 가지 도움이 되는 것들에 대해 설명하겠습니다.
제 경우, 기본적인 문제는 문자열인 키 열에 대한 모델 속성에 주석을 달지 않았기 때문입니다.예를 들어,
public class InventoryItem
{
public string StateCode {get;set;}
public string CompanyId {get;set;}
public int Id {get;set;}
// more properties removed for simplicity
}
DbContext에서 키 열을 복합 키로 구성했습니다.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<InventoryItem>().HasKey(x => new { x.StateCode, x.CompanyId, x.Id });
}
SQL 테이블 정의
CREATE TABLE [Example].[InventoryItem] (
[Id] INT NOT NULL,
[StateCode] VARCHAR (2) NOT NULL,
[CompanyId] VARCHAR (50) NOT NULL,
CONSTRAINT [PK_InventoryItems] PRIMARY KEY CLUSTERED ([StateCode] ASC, [CompanyId] ASC, [Id] ASC)
)
C# 코드 쿼리
public List<InventoryItem> GetAllCompanyInventory(string stateCode, string companyId)
{
using (var context = ContextFactory.CreateContext())
{
return await context.InventoryItems.Where(x => x.StateCode == stateCode && x.CompanyId == companyId).ToListAsync().ConfigureAwait(false);
}
}
는 " ", stateCode" companyId로 .NVARCHAR(450)
그리고 쿼리는 다음을 사용했습니다.CONVERT_IMPLICIT
이로 인해 시스템에서 인덱스를 올바르게 사용할 수 없게 되었습니다.CPU와 작업 시간이 100%로 떨어졌고, 이는 연결 풀 문제로 이어졌습니다.이러한 속성에 주석을 추가한 후 CPU가 5%를 넘지 않았고 다시는 연결 풀 문제가 발생하지 않았습니다.다음은 이 문제를 식별하는 데 도움이 된 몇 가지 사항입니다.
수정 사항은 이러한 속성에 주석을 다는 것이었습니다.
public class InventoryItem
{
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "varchar(2)")]
public string StateCode {get;set;}
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "varchar(50)")]
public string CompanyId {get;set;}
public int Id {get;set;}
// more properties removed for simplicity
}
제가 이 변경을 한 후에 서버가 거의 절전 모드로 전환되었습니다.훨씬 적은 수의 연결을 보여주고 거의 모두가 자고 있는 sp_를 실행하고 있습니다.
도중에 누군가가 다음과 같이 언급했습니다.sp_who
연결이 활성화되었는지 확인합니다.로컬에서 호스트 이름과 실행 상태를 나열하는 모든 코드를 실행하기 시작하자마자 연결 수가 0에서 최대 허용 수로 이동하는 것을 볼 수 있었습니다.그래서 저는 제 코드에 오류가 있다고 생각했습니다. 하지만 말 그대로 우리가 문맥을 만드는 모든 장소는 사용하는 문장에 의해 적절하게 포장되었습니다.정신이 나갔습니다.그런 다음 저는 이것이 실제 문제가 아니라 증상일 수도 있다는 생각으로 전환했습니다.그래서 문제를 찾는 길로 인도합니다.
저는 이 기사가 결국 SQL 문으로 이어져 무슨 일이 일어나고 있는지 식별하는 데 정말 도움이 되는 것을 발견했습니다.
SELECT TOP 20
(total_logical_reads/execution_count) AS avg_logical_reads,
(total_logical_writes/execution_count) AS avg_logical_writes,
(total_physical_reads/execution_count) AS avg_phys_reads,
(total_worker_time/execution_count) AS avg_cpu_over_head,
total_logical_reads, total_logical_writes, total_physical_reads,
total_worker_time, execution_count, total_elapsed_time AS Duration,
plan_generation_num AS num_recompiles,
statement_start_offset AS stmt_start_offset,
(SELECT SUBSTRING(text, statement_start_offset/2 + 1,
(CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(MAX),text)) * 2
ELSE statement_end_offset
END - statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text,
(SELECT query_plan FROM sys.dm_exec_query_plan(plan_handle)) AS query_plan
FROM sys.dm_exec_query_stats a
--JUST CHANGE THE ORDER BY TO GET THE OTHER RESOURCES
ORDER BY (total_logical_reads + total_logical_writes)/execution_count DESC
여기서 저는 문제가 있는 질의 텍스트와 질의 계획을 얻을 수 있었습니다.저는 출력 중 일부는 약 3억 개의 다른 무거운 쿼리와 비교하여 총 작업 시간이 40억 개 이상이라는 것을 알아차렸습니다.이러한 초고작업 시간은 검색 술어에 인덱스 키가 정확히 포함되어 있기 때문에 예상되지 않았습니다.실제 쿼리 계획을 살펴보면 다음과 같은 몇 가지를 확인할 수 있었습니다.
- 읽을 예상 행 수가 매우 높음(예: 실행당 예상 행 수가 1개인 경우 1,000만 개 초과)
- 사용
CONVERT_IMPLICIT
- 다른 인덱스를 만들 것을 권장하지만, 효과적으로 이미 가지고 있던 인덱스(간체 예를 사용하여 설명하기에는 다소 복잡하지만 실제 인덱스에는 더 많은 열이 있으며 변환을 피하기 위해 처음 두 개의 열을 생략했습니다.)
이 기사는 제가 검색하는 정확한 키를 사용하는 색인이 있는데도 제 예상 행 수가 왜 이렇게 많은지 이해하는 데 도움이 되었습니다.
이 기사는 CONVERT_를 이해하는 데 도움이 되었습니다.검토 중인 쿼리 계획의 암시적 호출입니다.
위의 글이 이 게시물에 언급되어 있어서 찾았습니다.
이것은 기본값을 nvarchar에서 varchar로 변경하는 방법을 알아내는 데 도움이 되었습니다.
이로 인해 연결 풀 시간 초과 문제가 발생한 이유는 아직 확실하지 않습니다.저는 한 번에 하나의 주 코드와 회사 ID를 실행하는 몇 가지 테스트를 실행했지만 여전히 거의 즉시 이 오류에 도달했습니다.일단 주석을 달도록 변경하면, 많은 요청을 동시에 처리해도 모든 것이 해결됩니다.
내 코드에 있는 이 문제.제가 극복한 몇 가지 예시 코드를 아래 오류에 붙여넣겠습니다.풀에서 연결을 얻기 전에 경과한 시간 초과 기간입니다. 풀링된 모든 연결이 사용 중이고 최대 풀 크기에 도달했기 때문에 이 문제가 발생했을 수 있습니다.
String query = "insert into STATION2(ID,CITY,STATE,LAT_N,LONG_W) values('" + a1 + "','" + b1 + "','" + c1 + "','" + d1 + "','" + f1 + "')";
//,'" + d1 + "','" + f1 + "','" + g1 + "'
SqlConnection con = new SqlConnection(mycon);
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = query;
cmd.Connection = con;
cmd.ExecuteNonQuery();
**con.Close();**
매번 연결을 닫으려고 합니다.그 전에는 이것 때문에 close connect를 사용하지 않았습니다.클로즈 스테이트먼트를 추가한 후 이 오류를 극복했습니다.
저는 같은 문제에 직면하고 있었습니다. 몇 시간 동안 조사한 결과 VPN 없이 게스트 네트워크에 연결되어 있다는 것을 알았기 때문에 VPN을 설정하면 효과가 있었습니다.
AWS EC2 인스턴스에 대한 정확한 오류 로그도 받았습니다.
알파 애플리케이션을 배포하고 있을 뿐이므로(실제 사용자는 없음) 연결 누출이 없었고 Activity Monitor(액티비티 모니터)를 통해 확인했습니다.sp_who
데이터베이스에 대한 연결이 없습니다.
제 문제는 AWS와 관련된 문제였습니다. 더 구체적으로는 Security Groups와 관련이 있습니다.특정 보안 그룹만 데이터베이스를 호스팅한 RDS 서버에 액세스할 수 있습니다.를 사용하여 RDS 서버에 대한 올바른 EC2 인스턴스에 액세스할 수 있도록 authorize-security-group-ingress 명령을 사용하여 입력 규칙을 추가했습니다.--source-group-name
할 수 이했습니다.입력 규칙이 추가되었습니다. AWS UI에서 확인할 수 있었지만 이 오류가 발생했습니다.
AWS UI에서 입력 규칙을 제거한 다음 수동으로 추가했을 때 갑자기 예외가 사라지고 앱이 작동하고 있었습니다.
사용:
finally
{
connection.Close();
connection.Dispose();
SqlConnection.ClearPool();
}
이 문제는 제가 전에 마주친 적이 있습니다.결국 방화벽의 문제가 되었습니다.방화벽에 규칙을 추가했습니다.나는 항구를 열어야 했습니다.1433
SQL 서버가 서버에 연결할 수 있도록 합니다.
예, 구성을 변경할 수 있는 방법이 있습니다.전용 서버에 있고 SQL 연결만 더 필요한 경우 다음 지침에 따라 두 연결 문자열의 "최대 풀 크기" 항목을 업데이트할 수 있습니다.
- 원격 데스크톱을 사용하여 서버에 로그인
- 내 컴퓨터(Windows - E)를 열고 C:\inetpub\vhosts[domain]\httpdocs로 이동합니다.
- web.config 파일을 두 번 클릭합니다.파일 구조가 확장명을 숨기도록 설정된 경우 웹으로 나열될 수 있습니다.그러면 Visual Basic 또는 유사한 편집기가 열립니다.
연결 문자열을 찾으십시오. 이 문자열은 아래 예제와 유사합니다.
"이름 추가="SiteSqlServer" connectionString="server=(local);database=dbname;uid=dbuser;pwd=dbpassword;풀링=true;연결 수명=120;최대 풀 크기=25;"
5.최대 풀 크기=X 값을 필요한 풀 크기로 변경합니다.
- web.config 파일을 저장하고 닫습니다.
연결 풀에 대한 올바른 설정을 설정해야 합니다.이는 제가 다음 기사에서 설명한 것처럼 매우 중요합니다. https://medium.com/ @dewanwaqas/confircations-that-up-sql-server-and-neted-ed044e53b60 애플리케이션의 성능이 크게 향상됩니다.
저의 경우 데이터베이스에서 값을 가져오려는 getProperty에서 무한 루프가 발생하여 수백 개의 SQL 연결을 계속 열었습니다.
문제를 재현하려면 다음을 수행합니다.
while (true)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
}
처음에는 이것이 내 문제라고 생각하지 않았지만 이 목록을 살펴보니 내 문제가 무엇인지 다루지 않았습니다.
제 문제는 엔티티 프레임워크를 사용하여 동일한 레코드를 여러 번 작성하려고 시도하는 버그가 있다는 것이었습니다.이런 짓을 해서는 안되었습니다. 제 벌레였죠.당신이 쓰고 있는 데이터를 보세요.SQL이 레코드를 작성하느라 바빴던 것 같습니다. 아마도 시간 초과를 잠그고 만들었을 것입니다.연속적으로 여러 번 기록을 작성하려는 코드 영역을 수정한 후 오류가 사라졌습니다.
페이지를 언로드할 때 데이터베이스 서버에 연결을 닫도록 지시해야 합니다.
protected void Page_Unload(object sender, EventArgs e) {
if (qryCnn != null)
qryCnn.Close();
}
Entity Framework를 사용하는 저는 사용 명세서를 단순화할 수 있다는 지적 조언을 잘못 이해했습니다.사용 명세서를 모두 삭제하여 잘못 단순화했습니다.
ie
using (var db = new MyDbContext()){}
으로 단순화합니다.
using var db = new MyDbContext();
것은 아니다.
var db = new MyDbContext();
EntityFramework의 경우 연결 오버로드의 경우일 수 있습니다.연결 문자열을 수정하면 연결 문자열에 이 필드를 추가할 수 있습니다.
=> Max Pool Size=200
예:
<add name="DataProvider" connectionString="Data Source=.;Initial Catalog=dbname;User ID=dbuser;Password=dbpassword;Max Pool Size=200" providerName="System.Data.SqlClient" />
코드의 연결이 유출되었습니다.를 사용하여 닫기를 인증할 수 있습니다.
using (SqlConnection sqlconnection1 = new SqlConnection(“Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5”))
{
sqlconnection1.Open();
SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
sqlcommand1.CommandText = “raiserror (‘This is a fake exception’, 17,1)”;
sqlcommand1.ExecuteNonQuery(); //this throws a SqlException every time it is called.
sqlconnection1.Close(); //Still never gets called.
} // Here sqlconnection1.Dispose is _guaranteed_
언급URL : https://stackoverflow.com/questions/670774/how-can-i-solve-a-connection-pool-problem-between-asp-net-and-sql-server
'sourcecode' 카테고리의 다른 글
큰 xlsx 파일을 R로 가져오시겠습니까? (0) | 2023.04.29 |
---|---|
Visual Studio에서 이클립스의 ALT+UP/DOWN(이동선)에 해당하는 것은 무엇입니까? (0) | 2023.04.29 |
UILabel에서 텍스트를 애니메이션으로 변경합니다. (0) | 2023.04.29 |
bash 셸 스크립트(unix)에서 .profile을 다시 로드하시겠습니까? (0) | 2023.04.29 |
VBA(Excel 2010)에서 기본 사례를 변수로 복원하는 방법은 무엇입니까? (0) | 2023.04.29 |