SqlConnection 의 실현 방법 을 정확하게 사용 하 는 방법 을 분석 합 니 다.

5255 단어 sqlconnection
이전에 어떤 사람 이 이렇게 코드 를 쓰 는 것 을 본 적 이 있다

public class Service1 : IService1
    {
        private SqlConnection conn = new SqlConnection();
        public void Method1()
        {
            //do something with conn;
        }
        public void Method2()
        {
            //do something with conn;
        }
        public void Method3()
        {
            //do something with conn;
        }
        public void Method4()
        {
            //do something with conn;
        }
    }
서비스 류 에서 전체적인 conn 대상 을 새로 만 든 다음 에 conn 대상 으로 데이터 베 이 스 를 조작 하 는 것 을 본 적 이 있다.물론 다른 버 전도 있 습 니 다.예 를 들 어

private SqlConnection conn = new SqlConnection();
private static SqlConnection sconn = new SqlConnection();
private SqlConnection Conn
{
    get { return new SqlConnection(); }
}
어떤 방식 이 좋 냐 고 물 어보 면 어떻게 대답 하 시 겠 습 니까? 먼저 다 중 스 레 드 환경 에서 Connection 을 사용 하 는 방식 을 검증 합 니 다.콘 솔 프로그램 만 들 기:Main 코드 는 다음 과 같 습 니 다

public static void Main()
{
    string connectionString = @"Data Source=.\SQLEXPRESS;
                                AttachDbFilename=""E:\DB\NORTHWND.mdf"";
                                Integrated Security=True;
                                Connect Timeout=30;User Instance=True";
    string connectionStringNoPooling = connectionString + " ;Pooling='false' ";
    SqlConnection conn = new SqlConnection(connectionString);
    new Thread(() => { ExecuteCommand(conn); }) { Name = "t1" }.Start();
    new Thread(() => { ExecuteCommand(conn); }) { Name = "t2" }.Start();
}
public static void ExecuteCommand(SqlConnection conn)
{
    Console.WriteLine("Thread:{0},{1}", Thread.CurrentThread.Name, DateTime.Now);

    conn.Open();

    SqlCommand command = new SqlCommand("select * from customers", conn);
    command.ExecuteNonQuery();
    command.Dispose();
    Thread.Sleep(5000); //
    conn.Close();
    Console.WriteLine("Thread:{0} ,{1}", Thread.CurrentThread.Name, DateTime.Now);
}
코드 는 간단 합 니 다.두 스 레 드 를 모 의 하면 Execute Command 를 동시에 실행 합 니 다.방법.결 과 는 다음 과 같다.
image
 
다 중 스 레 드 환경 에서 하나의 Connection 을 사용 하여 Sql 문 구 를 실행 하 는 것 이 안전 하지 않다 는 것 을 알 수 있 습 니 다.
메 인 함 수 를 다음 과 같이 수정 합 니 다.하나의 Connection 을 여러 개의 Connection 으로 바 꿉 니 다

public static void Main()
{
    string connectionString = @"Data Source=.\SQLEXPRESS;
                                AttachDbFilename=""E:\DB\NORTHWND.mdf"";
                                Integrated Security=True;
                                Connect Timeout=30;User Instance=True";
    string connectionStringNoPooling = connectionString + " ;Pooling='false' ";
    //SqlConnection conn = new SqlConnection(connectionString);
    //new Thread(() => { ExecuteCommand(conn); }) { Name = "t1" }.Start();
    //new Thread(() => { ExecuteCommand(conn); }) { Name = "t2" }.Start();
    SqlConnection conn1 = new SqlConnection(connectionString);
    SqlConnection conn2 = new SqlConnection(connectionString);
    new Thread(() => { ExecuteCommand(conn1); }) { Name = "t1" }.Start();
    new Thread(() => { ExecuteCommand(conn2); }) { Name = "t2" }.Start();
    Console.ReadLine();
}
실행 결 과 는 다음 과 같 습 니 다.
image
하나의 커 넥 션 보다 여러 개의 커 넥 션 이 좋 으 니,
왜 아직도 누군가가 위의 그런 표기 법 을 사용 하여 Connection 을 만 듭 니까?
나 는 그들 이 여러 개의 Connection 을 만 드 는 데 시간 이 걸 리 고 여러 개의 Connection 이 메모 리 를 차지 하고 성능 에 영향 을 줄 것 이 라 고 생각 할 것 이 라 고 생각한다.
이 점 에서 테스트 데 이 터 를 사용 하여 설명 할 수 있다.
테스트 데이터 출처:Connection-Pool vs.Reusing one connection
Run #
NCP
CP
OC
1
4073
374
237
2
4032
341
298
3
3985
353
242
4
4085
348
269
5
3964
369
256
6
4203
330
207
7
4055
341
359
8
4071
357
286
9
3968
363
356
10
4023
349
359
AVG
4046
353
287
 
Run\#1 은 1000 회 조회,2 는 2000 회 조회
NCP:Not Connection Pool,데이터베이스 연결 풀 을 사용 하지 않 음
CP:Connection Pool,데이터베이스 연결 풀 사용
OC:One Connection,연결 대상
도표 에서 연결 탱크 를 사용 하 는 방식 이 연결 을 다시 사용 하 는 것 보다 그다지 느 리 지 않다 는 것 을 알 수 있다.
그러나 안정성,프로그램의 건장 성 으로 볼 때 CP 의 방식 은 OC 보다 현저히 좋다.
따라서 다음 에 서 비 스 를 실현 하거나 조회 할 때 private SqlConnection conn=new SqlConnection(connection String)을 사용 하지 않 고 사용 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기