这是我的方案,我有一个夜间批处理作业,将记录插入第三方系统/数据库。所有这些导入调用都通过我创建的代理服务进行路由,主要是因为我的夜间批处理作业由于防火墙而没有直接连接到第三方服务。
因此,我为每个作业运行导入10000条记录。我建立了与我的代理服务的连接,其中代理服务建立到第三方Web服务的静态引用/连接。现在(不要笑),我在我的代理服务中为EACH记录建立连接。这意味着,我在我的代理服务中有10000个“OpenConnection”和“CloseConnection”方法调用来完成这个1个作业运行。我每天跑两次这个工作。
我的问题是,如果我在第一次Web服务调用上建立连接,但是在第一次调用时没有关闭连接,后续的Web服务调用会重新使用现有连接吗(因为它是静态的)?或者它会重新创建第三方服务的另一个会话?
如果这确实有效(让连接打开后续调用),如何在我的工作完成后关闭连接,以便我可以释放托管(或者是非托管)资源?我不想在我自己的名为“CloseConnection”的Web服务中添加一个方法...
除此之外,我们的服务器每晚都会自动执行IIS RESETS,如果此时连接仍处于打开状态,它是否会正确处理我的连接?
对不起,这里有很多问题,只是寻找一种“最佳实践”的方法来完成我加快这个过程的任务。
我将尝试给出一个代码示例,这是批处理作业代码:
ws.EstablishConnection();
for (int counter = 0; counter < 10000; counter++)
{
ws.ImportRecord(myRecords[counter]);
}
ws.Dispose();
网络服务代码:
[WebMethod]
public static void ImportRecord(MyRecord myRecord)
{
try
{
OpenConnection();
_3rdPartyWS.ImportRecord(myRecord);
}
catch (Exception)
{
throw;
}
finally
{
CloseConnection();
}
}
答案 0 :(得分:1)
我的问题是,如果我在第一次Web服务调用上建立连接,但是在第一次调用时没有关闭连接,后续的Web服务调用会重新使用现有连接吗(因为它是静态的)?
如果是静态的,将使用相同的对象。但你不会获得太多的速度。请注意,因为“开放”连接可能会超时。
或者它会重新创建第三方服务的另一个会话吗?
Web服务是“无会话”,每次调用都在其自己的会话中。
如果这确实有效(让连接打开后续通话), 我的工作完成后如何关闭连接,以便我可以释放我的工作 托管(或者是非托管)资源?我不想添加方法 在我自己的名为“CloseConnection”的Web服务中......
您的连接对象是静态的......如果没有显式调用“closeConnection。
,则无法关闭连接除此之外,我们的服务器每晚都会自动进行IIS RESETS 基础,如果当时连接仍然打开,它将被处置 我的连接正确吗?
“池空闲”超时可能会在每晚基础IISReset之前传递。垃圾收集器将处理您身边使用的每个内存。第三方可能从未收到过close()请求,但肯定会在一段时间后关闭连接。
在您的情况下,您可以做的最好的事情是实现一个接收MyReccord数组的Web服务方法。你会在那里节省很多时间。
[WebMethod]
public static void ImportRecord(MyRecord[] myRecords)
{
try
{
OpenConnection();
for (int counter = 0; counter < myRecords.Length; counter++)
{
3rdPartyWS.ImportRecord(myRecords[counter]);
}
}
finally
{
CloseConnection();
}
}
如果可能的话,更好的情况是要求您的第三方实现接收对象或文件数组的Web方法。
Web服务循环非常慢,你永远不应该这样做。