亚音速3.0.0.3超时多次保存操作。 MSSQL2005

时间:2009-12-08 21:15:08

标签: sql-server-2005 subsonic

我正在读取csv文件并将信息插入到sql 2005数据库中。

在大约250次object.save操作之后,它超时了。这里是代码和确切的错误消息。这不是代码的第一个版本,但它总是给出相同的时间。

这不是一个大数据库,只有2个表。有什么我不做的事吗?是否为每个保存操作打开和关闭连接。关于这个问题的所有意见都是受欢迎的。

List<shipment> oLstShipments = new List<shipment>();
while (oReader.ReadNextRecord())
{
  int iIdShipment;
  if (int.TryParse(oReader[0], out iIdShipment))
  {
    shipment oShipment = new shipment();
    oShipment.idShipment = iIdShipment;
    oShipment.dateDelivered = oReader[1];
    oShipment.inventoryGroup = oReader[2];
    oShipment.companyId = oReader[3];
    oShipment.shipTo = oReader[4];
    oShipment.carrier = oReader[5];
    oShipment.accountOwner = oReader[6];
    oShipment.accountNumber = oReader[7];
    oShipment.trackingNumber = oReader[8];
    oLstShipments.Add(oShipment);
  }
}
oReader.Dispose();
oSR.Dispose();

foreach (shipment oShip in oLstShipments)
{
  oShip.Save();
}

错误:

System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

       at System.Data.SqlClient.SqlConnection.Open()

       at SubSonic.DataProviders.DbDataProvider.CreateConnection(String connectionString)

       at SubSonic.DataProviders.DbDataProvider.CreateConnection()

       at SubSonic.DataProviders.AutomaticConnectionScope..ctor(IDataProvider provider)

       at SubSonic.DataProviders.DbDataProvider.ExecuteReader(QueryCommand qry)

       at SubSonic.Repository.SubSonicRepository`1.Add(T item, IDataProvider provider)

       at invoiceRetriever.Data.shipment.Add(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 516

       at invoiceRetriever.Data.shipment.Save(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 531

       at invoiceRetriever.Data.shipment.Save() in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 525

       at invoiceRetriever.frmHaasFiles.cmdProcess_Click(Object sender, EventArgs e) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\frmFiles.cs:line 59

测试#1

for (int i = 1; i < 200; i++)
                    {
                        try
                        {
                            shipment oShipment = new shipment();
                            oShipment.idShipment = i;
                            oShipment.dateDelivered = "10/10/2009";
                            oShipment.inventoryGroup = "123";
                            oShipment.companyId = "1";
                            oShipment.shipTo = "shipToTest";
                            oShipment.carrier = "carrierTest";
                            oShipment.accountOwner = "me";
                            oShipment.accountNumber = "123456";
                            oShipment.trackingNumber = "track001";
                            oShipment.Save();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("failed at #: " + i + Environment.NewLine + ex.ToString());
                            break;
                        }

                    }

提出异常:

failed at #: 267

System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

   at System.Data.SqlClient.SqlConnection.Open()

   at SubSonic.DataProviders.DbDataProvider.CreateConnection(String connectionString)

   at SubSonic.DataProviders.DbDataProvider.CreateConnection()

   at SubSonic.DataProviders.AutomaticConnectionScope..ctor(IDataProvider provider)

   at SubSonic.DataProviders.DbDataProvider.ExecuteReader(QueryCommand qry)

   at SubSonic.Repository.SubSonicRepository`1.Add(T item, IDataProvider provider)

   at invoiceRetriever.Data.shipment.Add(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 516

   at invoiceRetriever.Data.shipment.Save(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 531

   at invoiceRetriever.Data.shipment.Save() in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 525

   at invoiceRetriever.frmHaasFiles.cmdProcess_Click(Object sender, EventArgs e) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\frmHaasFiles.cs:line 50

如果我尝试分离数据库,它会说101个活动连接(1个用于管理工作室,其余用于代码。)

如果我像以前一样尝试使用repo列表,我会得到以下异常:System.Data.SqlClient.SqlException:传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。此RPC请求中提供的参数太多。最高为2100。

我很确定我做错了什么,我不能成为唯一想在数据库中插入这么多项目的人。

EDIT 12/13/2009 09:44:00:

以下是创建货件表的脚本。

/****** Object:  Table [dbo].[shipment]    Script Date: 12/11/2009 14:33:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[shipment](
    [idShipment] [int] NOT NULL,
    [dateDelivered] [varchar](255) NULL,
    [inventoryGroup] [varchar](255) NULL,
    [companyId] [varchar](255) NULL,
    [shipTo] [varchar](255) NULL,
    [carrier] [varchar](255) NULL,
    [accountOwner] [varchar](255) NULL,
    [accountNumber] [varchar](255) NULL,
    [trackingNumber] [varchar](255) NULL,
    [cebnowaybill] [varchar](50) NULL,
 CONSTRAINT [PK_shipment] PRIMARY KEY CLUSTERED 
(
    [idShipment] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

3 个答案:

答案 0 :(得分:1)

发布的版本3。0。0。3(7月)中存在一个错误,但在早期版本中没有。 它是一个rdr没有包含使用或后跟rdr.close。它会产生我提到的效果。连接被打开但未关闭...意味着连接池变满。

自从Rob在很多电子邮件中反对讨论后,它已得到纠正。你必须进入github上的source选项卡才能找到更正。

感谢所有帮助过的人。特别感谢Adam(因为没有放弃这么多回复)以及Rob快速回复我的电子邮件。

亚音速很棒,花时间找到问题的答案。

答案 1 :(得分:0)

超时是由于数据库没有可用的连接而导致的,我的猜测是来自某个读者在某处保持打开状态。

首先 - 为什么ReadNextRecord()?你的意思是使用Read()吗?您也可以将阅读器传递给Load(),它会为您加载对象。

最后 - 我建议将它包装在一个using语句中,以确保即使出现错误,读者和所有内容都会被关闭。

编辑: 在阅读下面的回复时 - 您是否为您的桌子定义了主键?

答案 2 :(得分:0)

Sylvain而不是告诉你如何解决你的问题我会告诉你应该做什么。因此,不要担心如何保存每个单独的项目而不必连接打开超过100次,您应该执行一次批处理操作,一次保存所有记录。

以下是SimpleRepo的示例,但这也可以使用Active Record来完成

var repo=new SimpleRepository();
repo.AddMany(oLstShipments);