Im создает систему, которая должна работать 24/7, с таймерами, чтобы управлять им. В базе данных много вызовов, и в какой-то момент два метода пытаются открыть соединение, и один из них будет терпеть неудачу. Я попытался сделать метод повтора, поэтому мои методы будут успешными. С помощью Майкла С. Scherotter и методы Стивена Судит в Better way to write retry logic without goto, это мой метод выглядит следующим образом:Метод повторного вызова для вызова базы данных
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;
При выполнении кода, программа останавливается на «для (.....)», и исключение: соединение не было закрыто. Текущее состояние соединения открыто ... Эта проблема была причиной, по которой я пытаюсь сделать этот метод! Если кто-то знает, как решить эту проблему, напишите. Благодаря
в какой-то момент вы это хорошо понимаете, а некоторые - нет. Я уже использую singleton в соединении. Наконец, это не работает для меня, потому что это не только этот метод, но и позволяет использовать 20 методов, пытающихся подключиться к базе данных, а затем в какой-то момент одновременно подключаются два метода. – WildBoar
Hm interesting - ваша система работает в отдельных потоках/экземплярах? Если нет, то вы можете заменить Singleton на заводский класс и просто раздавать новые подключения к базе данных, таким образом, без коллизий? –
Они работают в экземплярах separete. – WildBoar