Ваш "синглтон" действительно рекурсивен на некоторых путях.Что произойдет, если эта строка
instance = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString);
выдаст исключение, например, если строка подключения недопустима?Вы регистрируете это исключение с помощью WriteLog
, которое снова ссылается на синглтон с помощью
using (OracleConnection conn = OracleSingleton.Instance)
Так что, если строка подключения недопустима или создание соединения постоянно завершается неудачей по другой причине - вы переходите в рекурсию и в конечном итоге заканчиваете StackOverflowException
, когдапространство стека исчерпано.
Кстати, с помощью
using (OracleConnection conn = OracleSingleton.Instance)
вы также избавляетесь от своего соединения, что делает его непригодным для последующих вызовов.
Лучший способ решить эточтобы просто избавиться от синглтона, в этом нет необходимости.Это плохая практика - иметь глобальное соединение - просто создавайте его каждый раз, когда вам это нужно, и удаляйте (закрывайте), когда вы закончите с ним.Пул подключений будет управлять остальным за вас.
Если вы по какой-то причине не хотите проводить серьезный рефакторинг, по крайней мере, измените его на что-то вроде этого:
public static OracleConnection Create() {
// no need to catch any exceptions here
return new OracleConnection(ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString);
}
И используйте как выуже делаем:
using (OracleConnection conn = OracleSingleton.Create())