24/7을 실행해야하는 시스템을 제어하는 타이머가 있습니다. 데이터베이스에 대한 호출이 많으며 어느 시점에 두 개의 메소드가 연결을 열려고 시도하는 중 하나가 실패합니다. 재 시도 메서드를 만들려고 했으므로 메서드가 성공할 것입니다. Better way to write retry logic without goto 마이클 S. Scherotter 스티븐 Sudit의 방법의 도움으로, 내 방법은 다음과 같이 않습니다데이터베이스를 다시 호출하는 방법
int MaxRetries = 3;
Product pro = new Product();
SqlConnection myCon = DBcon.getInstance().conn();
string barcod = barcode;
string query = string.Format("SELECT * FROM Product WHERE Barcode = @barcode");
for (int tries = MaxRetries; tries >= 0; tries--) //<-- 'tries' at the end, are unreachable?.
{
try
{
myCon.Open();
SqlCommand com = new SqlCommand(query, myCon);
com.Parameters.AddWithValue("@barcode", barcode);
SqlDataReader dr = com.ExecuteReader();
if (dr.Read())
{
pro.Barcode = dr.GetString(0);
pro.Name = dr.GetString(1);
}
break;
}
catch (Exception ex)
{
if (tries == 0)
Console.WriteLine("Exception: "+ex);
throw;
}
}
myCon.Close();
return pro;
코드를 실행, 프로그램 "에 대한 (.....)"를 정차, 및 예외 : 연결이 닫히지 않았습니다. 연결의 현재 상태가 열려 있습니다 ...이 문제는 내가이 메서드를 만들기 위해 노력하는 이유입니다! 누구든지이 문제를 해결하는 방법을 알고 있다면 작성하십시오. 감사합니다
을 잘 이해하고 어떤 점은 이해하지 못합니다. 이미 연결에 싱글 톤을 사용하고 있습니다. 결국이 방법뿐만 아니라 연속 방법을 사용하여 데이터베이스에 연결하는 20 가지 방법을 사용할 수 있으므로 결국에는 두 가지 방법이 동시에 연결됩니다. – WildBoar
흥미로운 점은 시스템이 별도의 스레드/인스턴스에서 실행되고 있습니까? 그렇지 않다면 싱글 톤을 팩토리 클래스로 대체하고 새로운 데이터베이스 연결을 전달하면된다. 콜리 전이 없다. –
그들은 개별 인스턴스에서 실행 중입니다. – WildBoar