- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 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/
dataElementsList : TypesAndData.DataElement list 是一个包含 50,000 条记录的列表(实际上更多,但让我们从小处开始)。我正在尝试序列化为 JSON
我试图序列化一个自定义类型,该类型在其他成员中包含一个字典。与字典的键和值相关联的类型是实现的接口(interface)。 字典看起来像 Dictionary TypeA implements IT
我有一个 C# 工厂对象,它使用对象列表作为源,通过工厂方法创建对象。 对象列表的创建方式如下: public WidgetFactory() { widgetLibrary
我正在 GenericList 类中实现递归快速排序方法。我将有第二种方法,它接受一个compareDelegate来比较不同的类型,但出于开发目的,我对GenericList进行排序。 我根据列表大
我为我的作业编写了一种方法,用于通过递归计算整数数组的所有排列。 (我正在尝试实现回溯算法)。但计算超过 7 个数字的前突变时会导致 StackOverflowException 。我不知道如何解决这
我正在尝试将一个大文件拆分成许多小文件。每个拆分发生的位置基于检查每个给定行的内容返回的谓词(isNextObject 函数)。 我试图通过 File.ReadLines 函数读取大文件,这样我就可以
我正在使用 onSuccessCallBack() 接口(interface)方法同步大量数据。按照如图所示的方法将数据发送到服务器。在这里我面临 StackOverflowException 的问题
我必须递归调用一个函数。但片刻之后它会抛出 StackOverFlowException。当我使用 Invoke(new Action(Start)) 方法时,它会抛出相同的异常,但不会在很长一段时间
我有一些依赖于 HttpContext.Cache 的代码,我希望它在满足特定条件时重新缓存某些内容。但是,这会引入潜在的堆栈溢出,我不确定这里的适当方法是什么。 看看这段代码: void OnCac
我将我的代码剥离到导致问题的部分。代码在这里来回跳转第5行和第9行,导致stackoverflowexception。 我该如何做呢?我需要 Game 类中的 Platform 实例才能在函数中使用。
我的问题很简单。我有这个新表格,我只是编写代码: public partial class Form1 : Form { public Form1() { In
根据我的question (通用方法的可重用非通用方法)我已经实现了提供的解决方案,但经过一些重构(将代码移动到基类)后,我的代码导致了我不理解的 StackOverflowException。 调用
背景。我的脚本在递归搜索大字符串中的特定文本时遇到 StackOverflowException。循环不是无限的;问题发生在 9,000-10,000 次合法搜索之间(对于特定搜索)——我需要它继续进
请帮助我解决 System.StackOverflowException我想用 .aspx 将记录写入数据库我使用 4 层架构来实现这一切都正常但是当我编译页面然后它显示要插入数据的字段时,当我将数据
我正在尝试回答 my own old question基于我唯一的(无效的)答案。 这个想法是为了简化按值排序的映射的创建: public class SortedByValueMap> implem
我目前正在制作有界数组堆栈。此方法将大于存储容量的数组抛出到 StackOverflowException,除了我不断收到“throws StackOverflowException 部分”的错误消息
我正在使用以下方法递归迭代对象的属性: void GetProps(object obj) { if (obj == null) return; var objType
我想做一个非常简单的任务,它以某种方式使程序崩溃。 我有一个包含数字的列表,所有数字都是唯一的。超过一定数量,我想倒序。 示例:5, 16, 11, 3, 8, 4 -> 5, 16, 11, 4,
我正在尝试编写一个函数来检查字符串是否为回文,并使用 this example ,我正在尝试使用递归匿名函数反转字符串: static Boolean checkPalindromeAnonRec(s
这段代码有什么问题?我不断收到 StackOverlflowException.. public class Places { public string Title { get; set;
我是一名优秀的程序员,十分优秀!