gpt4 book ai didi

c# - Singleton 上的 StackOverflowException

转载 作者:太空宇宙 更新时间:2023-11-03 20:56:31 25 4
gpt4 key购买 nike

我的 Singleton 抛出一个 StackOverflowException,但昨天它工作正常,唯一的变化是连接字符串中的数据库。它是一个控制台应用程序,调试非常复杂:

class OracleSingleton
{
private static OracleConnection instance;

private OracleSingleton() { }

public static OracleConnection Instance
{
get
{
if (instance == null)
{
try
{
instance = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString);
}
catch (Exception ex)
{
LogHelper.WriteMessage("Error trying to create a new connection. - " + ex.Message.ToString() + " - " + ex.InnerException.ToString().Trim());
}
}
return instance;
}
}
}

我的 App.config:

<configuration>
<connectionStrings>
<add name="OracleConnection" connectionString="Password=somepassword;Persist Security Info=True;User ID=someuser;Data Source=DATABASE01"/>
</connectionStrings>
//Some stuff
</configuration>

你们能告诉我哪里出了问题以及为什么昨天它运行良好吗?

编辑:

我用 Singleton 做了很多事情。我知道问题出在单例中,因为我的应用程序显示了 StackoverflowException 而没有记录任何内容,这是我使用单例的地方之一。下面是我的 LogHelper.WriteMessage 方法,它在程序的第一行被调用说“嗨,应用程序正在运行”:

public static void WriteMessage(string info)
{
using (OracleConnection conn = OracleSingleton.Instance)
{
using (OracleCommand cmd = new OracleCommand("INSERT INTO TB_LOG (DT_LOG, ID_PERMISSAO, ID_USUARIO, NM_USUARIO, DS_LOG) VALUES (TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS'), 5025, 5025, 'IMPORTADORCAIXA', '" + info + "')", conn))
{
try
{
conn.Open();
cmd.ExecuteNonQuery();
} catch (Exception ex)
{
Console.WriteLine(DateTime.Now + " - Erro ao conectar com o banco. por favor, verifique o erro: " + ex.Message.ToString() + ", " + cmd.CommandText.ToString());
}
}
}
new LogHelper();
eventLog.WriteEntry(info);
Console.WriteLine(DateTime.Now + " - " + info);
}

最佳答案

您的“单例”确实在某些路径上是递归的。如果这条线会发生什么

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())

关于c# - Singleton 上的 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com