【问题标题】:IBM.Data.DB2.DB2Exception: ERROR [08001] [IBM] SQL30081N A communication error has been detected.IBM.Data.DB2.DB2Exception: ERROR [08001] [IBM] SQL30081N 检测到通信错误。
【发布时间】:2012-06-26 07:21:12
【问题描述】:

我的应用程序通过他们的 .net 提供程序 (FP5) 与 IBM DB2 一起工作。当我离开应用程序很长一段时间后,尝试从数据库中获取任何东西 - 我收到以下错误:

---> IBM.Data.DB2.DB2Exception: ERROR [08001] [IBM] SQL30081N 检测到通信错误。通讯协议为 使用:“TCP/IP”。正在使用的通信 API:“SOCKETS”。地点 检测到错误的位置:“SERVER_IP”。通讯功能 检测错误:“recv”。协议特定错误代码: “10054”、“*”、“0”。 SQLSTATE=08001

我使用实体框架与数据库通信,在崩溃操作之前我总是有以下代码:

using (EEntities db =  EntitiesFactory.CreateEEntity())
                {
                    // ..some operations
                }   

地点:

public static EEntities CreateEEntity()
        {
            if (!string.IsNullOrEmpty(GlobalCommon.DBConnectionString))
                return CreateEEntity(GlobalCommon.DBConnectionString);
            return new EEntities();
        }

        public static EEntities CreateEEntity(string connectionString)
        {
            return new EEntities(connectionString);
        }

和:

public static string DBConnectionString
        {
            get
            {
                if (!string.IsNullOrWhiteSpace(_DBConnectionString))
                    return _DBConnectionString;

                string providerConnectionString = "Database=" +
                    Settings.Default.DBDatabase + ";User ID=" +
                    DBUserID + ";Password=" +
                    DBPassword + ";Server=" +
                    DBServer + ";Max Pool Size=150;Min Pool Size=15;Connection Lifetime=80;Pooling=true;";


                // Initialize the EntityConnectionStringBuilder.
                EntityConnectionStringBuilder entityBuilder =
                    new EntityConnectionStringBuilder();

                //Set the provider name.
                entityBuilder.Provider = "IBM.Data.DB2";

                // Set the provider-specific connection string.
                entityBuilder.ProviderConnectionString = providerConnectionString;

                // Set the Metadata location.
                entityBuilder.Metadata = @"res://*/DAL.DBModel.csdl|
                            res://*/DAL.DBModel.ssdl|
                            res://*/DAL.DBModel.msl";
                _DBConnectionString = entityBuilder.ToString();

                return _DBConnectionString;
            }
            set
            {
                _DBConnectionString = value;
            }
        }

所以我认为如果连接终止,我总是会重新连接。
池化或连接生存期会不会有问题?..

【问题讨论】:

    标签: .net connection db2


    【解决方案1】:

    此错误通常表示您的连接已被 DBA 终止,或者存在中断与您的应用程序的连接的网络故障。

    如果您收到此错误,只需重新连接到数据库即可。

    【讨论】:

    • 但是如何重新连接?.. 如果我再次调用 using (EEntities db = EntitiesFactory.CreateEEntity()) 是否意味着它重新连接?
    • 似乎有些 EntitesFactory 创建了一个 EntityConnection 对象——您可以检查该对象的 State 属性以查看连接是否仍处于打开状态,并在适当的情况下调用 Open 方法重新连接。
    • 只是想知道为什么 CreateEEntity() 方法会创建新的实体对象,以便打开的新连接(如我所想..)仍然在那里添加了检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多