Biztalk Debatched消息值缓存

时间:2017-03-06 11:30:18

标签: caching biztalk

我得到一个包含4000个条目的文件并将其解散,所以如果一个条目损坏了数据,我就不会丢失整个消息。

Biztalkmap正在访问SQL服务器,在我发布消息之前我只是在地图中缓存了SLQ数据,但现在我有4000个独立的地图。

如果没有缓存,该过程需要大约30倍。

有没有办法在不丢失太多性能的情况下将数据从SQL Server缓存到地图之外的某个地方?

2 个答案:

答案 0 :(得分:2)

访问Map中的数据库不是一种值得推荐的模式。

由于您所描述的内容听起来像您正在检索静态参考数据,因此另一个选项是将流程移动到Orchestration,其中将参考数据一次性检索到消息中。

然后,您可以使用提供参考数据和业务消息的双输入映射。

在这种模式中,您可以在Orchestration中进行移植或使用顺序车队。

答案 1 :(得分:0)

我总是避免在地图中访问SQL Server - 很容易无意中发出比你想要的更多的调用(无论是因为地图设计中的错误还是因为意外的音量或特定地图的使用端口或端口集)。事实上,我通常会避免在必须访问其他系统或服务的地图中进行任何类型的调用,但如果必须,则缓存可以提供帮助。

您可以使用例如MemoryCache进行缓存。我使用的模式通常涉及一个自定义C#库,您首先检查缓存中的值,如果有错过,请检查SQL(对于paritcular条目或整个缓存,例如:

object _syncRoot = new object();

...
public string CheckCache(string key)
{
    string check = MemoryCache.Default.Get(key) as string;

    if (check == null)
    {
        lock (_syncRoot)
        {
            // make sure someone else didn't get here before we acquired the lock, avoid duplicate work
            check = MemoryCache.Default.Get(key) as string;
            if (check != null) return check;

            string sql = @"SELECT ...";

            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddWithValue(...);

                    // ExecuteScalar or ExecuteReader as appropriate, read values out, store in cache
                   // use MemoryCache.Default.Add with sensible expiration to cache your data
                }
            }
        }
    }
    else
    {
        return check;        
    }
}

要记住的一些事项:

  1. 这将基于AppDomain,并且管道和业务流程在不同的应用域上运行。如果您在两个地方都执行此地图,那么您最终会在两个地方都使用缓存。尝试在AppDomains上分享这一点时增加的复杂性可能不值得,但如果你真的需要,你应该将你的缓存隔离成像WCF NetTcp服务。
  2. 这会占用更多内存 - 你不应该把所有东西都扔进BizTalk的缓存中,如果你要去缓存东西,请确保你机器上有大量的可用内存。 BizTalk配置为能够使用它。
  3. MemoryCache可以存储您想要的任何内容 - 我在这里使用字符串,但它也可以是其他原始类型或对象。