안녕하세요 C# 초보 개발자 입니다.
다름이 아니라 DB에 관련해서 질문이 있어서요…!
프로젝트에서 DB를 한 번 연결하고 프로그램 내에서 계속 쿼리를 날리는 소스코드가 있을 시 어떤 식으로 구조를 짜는 게 좋은 건가요…?
제가 생각한 바로는 단일스레드로 DB을 연결하고 계속 쿼리를 날리는 메소드만 비동기로 돌린 후 나머지 쿼리를 날리는 메소드는 동기로 돌리는 방법인데
이렇게 했을 때 동기와 비동기에서 동시에 쿼리를 날릴 시 문제가 없을까요??
혹은 다른 좋은 방법이 있을까요…?ㅠㅠ 도움 부탁드립니다.
DB에 연결을 단일스레드로 하고 비동기로 돌리는 방법이 좋은 지도 알고 싶습니다.
DB와 ado driver를 뭘 쓰시나요?
저는 이패턴을 씁니다.
mariadb, ADO.NET을 사용합니다!
async/await 을 놔두고, 그 패턴을 사용하는 이유라도 있는지요?
만약 동기에서 쿼리를 날리는 메소드가 우선적으로 실행되어야하는 코드라면(예를 들면 알람) 비동기에서 쿼리가 실행 중 이더라도 동기에 있는 메소드(쿼리가 존재하는) (속도적으로 동기 쿼리가 더 빠름)가 먼저 끝나는 것이 맞는 건가요?? lock이 없으면
동기는 비동기와 관련없이 실행하는 것이 아닌게 맞는거죠…?
이 말의 의미가, 먼저 날린 쿼리의 수신이 끝나지도 않은 상태에서 또 다른 쿼리를 날린다는 것이라면, 그 것을 처리할 새로운 (워커) 스레드가 필요할 뿐입니다.
두 개의 쿼리 처리 스레드 중에 어떤 게 먼저 끝날지(쿼리 날리고 응답을 받을 지)는 아무도 모릅니다. 스레드의 실행은 전적으로 운영체제 맘이니까요.
어플리케이션 입장에서는 "우선권 좀 주십쇼"라고 읍소하는 방법 밖에는 없습니다.
만약 호출 스레드가 두 (워커) 스레드의 (결과물을 받기 위해) 완료를 기다려야 한다면, 두 워커 스레드가 완료될 때까지 호출 스레드를 차단(실행 멈춤)시키는 방법 밖에 없습니다.
참고로, 닷넷에서는 Thread.Join() 과 Task.Result.get 이 호출 스레드의 차단을 유발합니다.
호출 스레드의 차단은 눈에 띄지 않을 정도로 매우 짧을 수도 있고, 몇 초간 유지될 수도 있습니다.
만약, 호출 스레드가 UI 스레드라면, UI 의 업데이트가 차단됩니다.(응답이 없게 됩니다.)
이러한 호출 스레드 차단을 방지하기 위한 것이 async/await 입니다.
닷넷의 모든 API는 (호출 스레드를 차단하는) 동기 버전과 (호출 스레드를 차단하지 않는)비동기 버전을 모두 제공합니다. 여기에는 당연히 Ado.Net 도 포함되어 있습니다.
결론적으로, async/await 에 익숙하다면, 할 필요가 없는 고민 같아 보입니다.