The technology of load balancing between several servers with relatively low capacity has been a standard feature of Caché for quite a while. It is based on the distributed cache technology called ECP (Enterprise Cache Protocol). ECP provides a host of possibilities for horizontal scaling of an application, and yet keeping the project budget fairly low. Another apparent advantage of ECP network is the possibility to conceal its architecture in the depths of Caché configuration so that applications developed for the traditional (vertical) architecture can be fairly easily migrated to a horizontal ECP environment. The ease of this process is so mesmerizing, that you start wishing it was always this way. For instance, everybody is used to having a possibility to control Caché processes: the $Job system variable and associated classes/functions work magic in skilful hands. Stop, but now processes can end up being on different Caché servers…
This article is about how to gain as much transparency in controlling processes in ECP environment as in traditional (non ECP) one.
Let's say we have two serial classes, one as a property of another:
Class test.Serial Extends %SerialObject
{
Property Serial2 As test.Serial2;
}
Class test.Serial2 Extends %SerialObject
{
Property Property As %String;
}
And a persistent class, that has a property of test.Serial type:
Class test.Persistent Extends %Persistent
{
Property Datatype As %String;
Property Serial As test.Serial;
}
So it's a serial, inside a serial, inside a persistent object.
Caché prints to printers in a manner somewhat different from other Windows applications. Caché sends the data directly to the GDI Printer, without the usual interface. This is because the GUI interface can only be shown on a system desktop session and not in web browser and terminal sessions. Some printer drivers have problems with this method of printing.
In the prior part of this series we have provided introduction to Google MapReduce approach, but still not covered their possible ObjectScript implementation. Which we will start to explain today.
I've released a comprehensive, free online training course on the new EWD 3 suite of products that allow the integration of Cache with the burgeoning Node.js world, and allow you to create and run browser-based and mobile applications with all the very latest development technologies from the JavaScript world.
The release of IBM POWER 8 processors with AIX 7.1 introduced up to 8 SMT threads per processor core (logical or physical). Which SMT level (1, 2, 4, or 8) to use can be confusing and varies based on multiple factors. This article is meant to help with a starting point for your specific application.
Firstly, if running on a version of 2014.x or older, it is advised to use SMT 4 or lower. SMT 8 with those older versions of Cache' has shown a decline in performance and scaling in benchmarking applications.
When dealing with SOAP in Caché, it is sometimes necessary to debug errors by directly accessing (and sometimes editing) the XML which is sent, i.e. the SOAP request and subsequent SOAP response. If you’re debugging a Caché web service, it is often useful to use a tool such as SoapUI (https://www.soapui.org/) to manually create and control the SOAP request, so that the effect of adjustments can easily be seen on the Caché web service.
Process-private Globals can be used as a data global in storage definition. That way, each process can have its own objects for the class with ppg storage. For example lets define a pool, which can:
Integrating Cache with .net may be difficult, as we need to know both technologies and tools involved. Let’s follow the simplest possible example and see the pitfalls lurking on our way.
1. Creating .Net Assembly
.Net assembly is unit that contains compiled code and other resources.
Let’s create the simplest .Net assembly that will contain the code we want to execute.
We will use assembly of type Class Library, as we will use classes and their methods contained within. This type of assembly has .dll extension.
Imagine that your .NET project uses the Caché DBMS and you need a fully-functional and reliable authorization system. Writing such a system from scratch would not make much sense, and you will clearly want to use something that already exists in .NET, e.g. ASP.NET Identity. By default, however, this framework supports only its native DBMS – MS SQL. Our task was to create an adaptor that would let us quickly and easily port Identity to the InterSystems Caché DBMS. This work resulted in creation of the ASP.NET Identity Caché Provider.
The Update Checklist for v2015.1 recommends setting the TZ environment variable on Linux platforms and points to the manpage for tzset. This is recommended to improve the performance of Cache’s time-related functions. You can find out more about this here:
What do you do if you want to have the ID field have a meaningful name for your application?
Sometimes it comes to pass that when you're making a new table that you want to have the unique row identifier (a.k.a. IDKEY) to be a field that has a name that is meaningful for your data. Moreover, sometimes you want to set this value directly. Caché fully supports this functionality and it works Suppose you have a class Test.Kyle. The data will be stored like so:
We are in the process of putting a new UI on the existing product documentation, including a mobile-optimized view. We also plan on releasing additional "solution based" documentation that is targeted at common usage scenarios or important configuration tasks.
We are interested in your feedback on our current product documentation - what you like and dislike and especially what changes you would expect to see to make it as useful as possible.
I am pleased to announce the next 2016.2 field test kit, 2016.2.0.609.0.
This is a relatively light update with only a few dozen changes from the previous field test, spread out across all areas of the product. Also, in a break from the recent past, this update doesn’t contain any new fixes to problems found in the field.
Please download the kit and give it a try; the latest field test of 2016.2 is available HERE. And, as always, we welcome your feedback.
I have seen a customer problem recently where the use of a virus scanner running over Caché databases was causing intermittent application slow downs and bad user response times.
This is a surprisingly common problem, so this short post is just a reminder to exclude key Caché components from your virus scanning.
Generally virus scanning must exclude the CACHE.DAT database files and Caché binaries. If an anti-virus is scanning CACHE.DATs and InterSystems files then system performance will be significantly impacted.
Development productivity? Isn’t it kind of an oxymoron? Anyhow, we all dream a magic tool which does the tedious job of the software development and leave the intuitive or creative part on the developer. Atelier is the next generation tool of InterSystems aiming to boost the productivity of Caché/ Ensemble based software development. Atelier is based on the popular Eclipse IDE platform, which makes available the “infinite” pool of third party tools for Caché developers. Those tools can truly boost the productivity. This short article gives some examples how third party plug-ins can help developing for Caché. It is an absolute beginner’s guide, beginner to Eclipse but experienced to Caché.
I am pleased to announce the next in the series of 2016.2 field test kits, 2016.2.0.585.0.
In the two weeks since the last field test posting Development has made over a hundred fixes and improvements in Atelier, Enterprise Manager, Ensemble and Caché.
In Atelier alone there were over a dozen changes including a fix for the incompatibility issue that Jamie Newton described in his posting of February 1.
With the release of Cache 2016.1, JSON support was re-architected and made part of the core object model with the creation of %Object and %Array classes, which allow you to create dynamic JSON enabled objects and arrays.
On a recent demonstration I was working on, I had the need to create a REST web service that returned a JSON representation of a persistent object. After searching for methods that would allow me to accomplish this, ultimately I found none, until now.
Outlined below is an example of how to check if a directory exists:
Set directoryName="c:\temp\nosuchdir"
/* Check for existence of a directory - Return Value: 0 - directory does not exist; 1 - directory does exist */
Set directoryExists=##class(%File).DirectoryExists(directoryName)
If ('directoryExists) // do the processing for when a directory does not exist
Outlined below is an example of how to check if a file exists:
I just saw this new posting by Mike Kadow on the "Caché, Ensemble, DeepSee" Google Group announcing the availability of his new book, "Caché and MUMPS - Part II"