BizTalk Server and named SQL Server Analysis Services instances

The documentation for BizTalk Server 200X is very clear, and has been since BizTalk Server 2006. See the 2010 versions of technet wiki and download. It states:

Named instances of SQL Server 200X Analysis Services are not supported

But why is that? I set out to investigate if I could find a reason for it still being true.

Examining the history

In the beginning, there was a limitation with SQL Server 2000 Analysis Services (SSAS). It was not instance or cluster aware (much like SSIS today). Some time later with the help of service packs (if I can recall and use my search engine correctly) SSAS became cluster aware, but only supported running on the default instance. Thus the requirements and the reason that was true with BizTalk Server 2006 is crystal – due to the support of the underlying technology, namely SQL Server 2000, named instance of Analysis Service was not supported.

Present

I later versions of SQL Server, and the latest of SQL Server 2008 R2 specifically, there is no such limitation. Analysis Services is both cluster and instance aware and can be installed in a named instance. So the underlying limitation just isn’t there. But what about BizTalk? Does it have some built in limitation to how it uses Analysis Services that doesn’t allow working against a named instance?

The scenario

Two BizTalk Server Group installations – connected to their respective database instance – side-by-side. Both SQL Server instances has the database, agent and analysis services services installed. In the default instance I have a BizTalk Server Group configured with BAM tracking and Analysis, and a deployed activity and view when we start our journey. For the named instance I wanted to configure the same thing to see that there were no issue with

  • running Analysis Service in a named instance, and
  • running it side by side with the default instance and its Analysis Services on the same SQL Server machine.

Configuring BizTalk Server against a named instance of SQL Server 2008 R2 Analysis Services

First configuring the feature using BizTalk Server Configuration.

Then applying the configuration and view the result.

No issues.

Deploy BAM activities and views

Using bm.exe to deploy my BAM activity and view to my named instance.

No issues.

Using Tracking Profile Editor to connect my activity to an orchestration.

No issues.

Running some data through the integration

BizTalk Server behaves as expected. After running some sample data through the integration I could open my BAMPrimaryImportDb and run a Select against it to view my data.

Running my BAM_AN_<View> SSIS package

This was one of my prime candidates beforehand of where it could possibly go wrong. However as I used Business Intelligence Development Studio to inspect the package I could see that it was configured with datasources for the databases that it worked with, including the Analysis Services database, and it clearly points to the correct configured instance.

Running it caused no incidents that I could detect. After having run the package and processed the cube I was ready to look at the data in the cube to see if it got there as expected.

Viewing the Live Workbook

The first thing to check was the live workbook (useless as I find this feature I wanted to see if it could read the data as expected).

It could. And again, if we view the data connection properties here it point to my named instance.

(sorry about the swedish locale here, but you get the point)

Viewing data in the BAM portal

Next up, what about the BAM portal – would it be able to understand the named instance of SSAS and retrieve my data?

 

Yes. Both the Activity Search and the Aggregations show the data expected.

Conclusion

I can find no reason why SQL Server 2008 R2 Analysis Service cannot be used on a named instance with BizTalk Server 2010. Granted, this was just a small test and I certainly haven’t investigated this through every aspect (as per the usual disclaimer), but it “Works on my Machine”.

Do you know a reason that this will not work? Are you running this configuration yourself and can confirm further that it does work? Let me know

HTH
/Johan

Blog Post by: Johan Hedberg

The Future of Integration with MS Technologies

The Future of Integration with MS Technologies

With the announcement of BizTalk Server 2010 R2, it is clear that there is great commitment from MS for supporting on-premise solutions. However, one other smart move from MS was they are now catering to all the three areas below: Area: On-Premises Integration Products: BizTalk Server Windows Server AppFabric Area: Hybrid Integration Products: BizTalk Server […]
Blog Post by: DipeshA

Cannot open log for source BizTalk ESB Toolkit 2.1

Cannot open log for source BizTalk ESB Toolkit 2.1

I have installed the ESB Management Console on a server that does not have Visual Studio installed and I got this error when I tried to open the ESB Management Console on the local host. http://social.msdn.microsoft.com/Forums/ar-SA/biztalkesb/thread/16f6fcbe-ffd6-4fbf-a92f-a97726292256 talks about the same error but none of the solutions in this thread solved my problem. Eventually I discovered […]
Blog Post by: mbrimble

ESB.BizTalkOperationsService fails to start

ESB.BizTalkOperationsService fails to start

I got the following error; Event code: 3008 Event message: A configuration error has occurred. Event time: 9/01/2012 11:14:01 a.m. Event time (UTC): 8/01/2012 10:14:01 p.m. Event ID: bb7f2e13c8714bec8168096629000ef0 Event sequence: 1 Event occurrence: 1 Event detail code: 0 Application information: Application domain: /LM/W3SVC/1/ROOT/ESB.BizTalkOperationsService-2-129705344411112734 Trust level: Full Application Virtual Path: /ESB.BizTalkOperationsService Application Path: C:\Program Files […]
Blog Post by: mbrimble

BizTalk: Samples: Error Handling, Email Notification

One problem with email notifications is it usually sends too many emails. Errors frequently happen in series. For example, a temporarily issue with network can result in hundreds repetitive emails. In result an email notification designed as a “VIP” notification is downgraded to the “annoying” status.

This email flooding could be mitigated with this solution.

A Sample demonstrates using the emails for sending notification in case of failed messages.

It compounds several similar errors in one email notification.

Recently I’ve downloadedthis sample

BizTalk: Samples: ErrorHandling: Notification emails

to MSDN Gallery.

It has all solution artifacts and can be used in real-life projects.

QuickLearn’s SharePoint 2010 Training

You will not run into your typical Hello World walkthrough with QuickLearn’s new SharePoint 2010 courseware. QuickLearn’s SharePoint 2010 curriculum are scenario-driven classes in which we set out to create real-life SharePoint solutions, dissect them and provide best practice solutions to real problems developers face. Our classes have greater focus on interesting issues such as:

  • Developing solutions that can be easily migrated into different environments and packaged for automatic deployment
  • Creating code in a secure fashion while working within the limitations of SharePoint’s sandbox solution model, writing client-side object model code that reduces external calls, batches operations, and attempts to reduce request size
  • Accessing custom external data sources that aren’t readily accessible with out of the box tooling

Our courses cover each topic in a broader way by providing more in depth labs. Rather than dozens of 10-15 minute labs our 45-60 minute labs provide a more complete picture of each topic.

We show you how to exercise SharePoint’s strengths, as well as work through some of its more challenging areas. Our classes won’t give you a simplified sales pitch that leaves you wanting more, but instead will provide real guidance, for real solutions.

  • SharePoint 2010 Developer Immersion
    • Upcoming dates include: February 13-17 & April 16-20
  • SharePoint 2010 Developer Deep Dive
    • Upcoming dates include: March 19-23 & May 21-25

For 20% off register before January 20th with the promotion code: NEWSP.

Anthony Borton Awarded 6th ALM MVP

2012 is off to a great start for QuickLearn’s lead ALM instructor, Anthony Borton. Anthony has been awarded the Microsoft%u00ae MVP Award for Visual Studio ALM for the 6th consecutive year. This award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others.

Anthony has developed our leading ALM curriculum that focuses on everything connected to Microsoft Team Foundation Server. He is a popular and highly regarded instructor and international presenter. If you’re eager to learn how to developer software better, please check out our upcoming TFS ALM courses starting again in February.

For those of you eagerly awaiting the upcoming BETA release of the next version of Visual Studio and TFS, make sure you keep an eye out for news of our upcoming early-adopter courses which Anthony is putting the finishing touches on right now. Why not follow us on Facebook or LinkedIn to make sure you don’t miss our announcement.

Happy New Year to all our readers and I hope you’re year has started with some great news as well.

Mapping and Auto-Mapping Objects from IDataReader

[Source: http://geekswithblogs.net/EltonStoneman]

This is one in a series of posts covering my generic mapping library on github: Sixeyed.Mapping.

1. Mapping and Auto-Mapping Objects

2. Mapping and Auto-Mapping Objects from IDataReader

3. Mapping and Auto-Mapping Objects from XML

4. Mapping and Auto-Mapping Objects from CSV

5. Comparing Sixeyed.Mapping to AutoMapper

The mapping library has support for IDataReader objects used as the source. Using data readers, AutoMap will try to populate the target by matching property names to column names. Alternatively a static map can be defined, manually specifying the mapping between column names and properties.

Auto-Mapping

Using a populated data reader as a source, you can auto-map a target object using the DataReaderAutoMap and the same syntax as for an object source:

IDataReader reader = GetReader(id);

User user = DataReaderAutoMap<User>.CreateTarget(reader);

The data reader must be open, and the map will populate from the current row so the data reader should be read to the desired start position before mapping. For a single row, call Read() once on the reader before passing it to the Create() call.

DataReaderAutoMap and AutoMap share the same base class, and the mapping logic is the same for all sources. Specification, caching strategy and naming strategy options still apply. To specify a property mapping, you need to provide the name of the source column:

var addressMap = new DataReaderAutoMap<Address>()

.Specify(“PostCode”, t => t.PostCode.Code);

//or:

var addressMap = new DataReaderAutoMap<Address>()

.Specify((s, t) => t.PostCode.Code = (string)s[“PostCode”]);

You can also use the conversion overloads for converting the source value during population:

var map = new DataReaderAutoMap<User>()

.Specify<DateTime, DateTime>(“JoinedDate”, t => t.JoinedDate, sd =>FromLegacyDate(sd));

Static Mapping

For static maps, extend the base DataReaderMap class. As we’re dealing with string constants for the column names, static maps may be the better option in caseswhere the source and target names can’t be matched by convention – they centralise the constant definition in one place:

public class FullUserFromDataReaderMap : DataReaderMap<User>

{

/// <summary>

/// Default constructor, initialises mapping

/// </summary>

public FullUserFromDataReaderMap()

{

this.AutoMapUnspecifiedTargets = false;

Specify(ColumnName.Id, t => t.Id);

Specify(ColumnName.FirstName, t => t.FirstName);

//etc.

}

private struct ColumnName

{

public const string Id = “UserId”;

public const string FirstName = “FirstName”;

//etc.

}

}

Nested Maps

Maps can include nested maps, populating an object graph from a flattened representation in a single data reader:

var addressMap = new DataReaderAutoMap<Address>()

.Specify(“PostCode”, t => t.PostCode.Code);

var map = newDataReaderAutoMap<User>()

.Specify(“UserId”, t => t.Id)

.Specify((s, t) => t.Address = addressMap.Create(s));

var user = map.Create(reader);

Nested maps can also populate objects from multiple readers – although this requires each reader to be associated with a separate connection:

var addressMap = new DataReaderAutoMap<Address>()

.Specify((s, t) => t.PostCode.Code = (string)s[“PostCode”]);

var map = new DataReaderAutoMap<User>()

.Specify(“UserId”, t => t.Id)

.Specify((s, t) => t.Address = addressMap.Create(addressReader));

var user = map.Create(userReader);

Limitations

Data reader maps can only operate in one direction – populating an object from a reader. They also rely on the column names being available in the IDataReader implementation through the GetOrdinal method. Not all data providers supply this, and if there are no column names available, mapping will fail for auto-maps and static maps, leaving the target object unpopulated.

Performance

Mapping from data readers uses the column names of the source, so only the target is reflected over. For small numbers of reads, there is less of a performance impact than with object-to-object mapping, and the benefits are greater as mapping also takes care of type conversion. Using a SqlServerCe database populated with 250,000 rows (80+Mb of data), the performance was bounded by the speed of the database connection and not the speed of mapping. Up to 1,000 are read and mapped in 0.4-0.6 seconds for all reads, with a small performance hit for the automap:

For larger reads, the performance impact is more significant, with DataReaderAutoMap and a static DataReaderMap taking almost twice as long as manually reading and mapping the data, when you reach 100K or 250K reads:

At 10K reads, performance is still comparable for auto-mapping and manual mapping, so whether you can use the DataReaderAutoMap would need to be looked at in context of your own data, mapping complexity and any upstream caching in your solution.