Eduard Lebedyuk · Jun 3, 2020 go to post

Please ask a separate question. This is an extensive topic and the question would get more attention from Community.

Eduard Lebedyuk · Jun 3, 2020 go to post

From the linked doc

  • DM - Distributed cache cluster data serve
  • AM - Distributed cache cluster application server

%Installer can run arbitrary code, and in code you can do ECP initialization.

ICM can provision mirrored configuration

Eduard Lebedyuk · Jun 2, 2020 go to post

Can't say I have. But there are a lot of Arduino network modules - seems doable.

What are you doing?

Eduard Lebedyuk · Jun 2, 2020 go to post

Does ensemble can limit request speed at Business Service?  too many requests slowdown my service.

InterSystems IRIS comes with InterSystems API Manager which is designed for these kind of tasks.

But at the message trace page. I can't found any source address .  

You can use $$$TRACE to capture additional information. Also CSP Gateway has additional request tracing facilities. Here's how you can enable tracing there.

But most importantly as I said in your previous post it looks like you're running Ensemble service on a custom port. First thing you need to do is:

  • Install public web server
  • Adjust web server configuration for better performance
  • Connect it to Ensemble
  • Switch Ensemble Business Service to use public web server
Eduard Lebedyuk · Jun 1, 2020 go to post

Values looks correct (I assume Ipaddress is in fact replaced by an ip address or a hostname).

I think the issue is the access to the driver library.

Check that the user you're running the app has access.

Maybe you need to specify the path with double slashes.

Also try copying the jar file into your app directory.

On the other hand InterSystems offers a very flexible and powerful full text search solution, as a part of InterSystems Cache - iFind (Also known as InterSystems SQL Search for InterSystems IRIS). Try it out to add full text search to your application.

Eduard Lebedyuk · May 29, 2020 go to post
Set tSC = ##class(Ens.Director).CreateBusinessService("Strata JSON Service",.tService)

After that line add

If $$$ISERR(tSC) {
    write $System.Status.GetErrorText(tSC), !
    quit tSC
}

Looks like CreateBusinessService call fails (so tService object doesn't get created).

Eduard Lebedyuk · May 29, 2020 go to post
Set tSC = ##class(Ens.Director).CreateBusinessService("Strata JSON Service",.tService)

Check that tSC is not an error and that tService is an object.

Eduard Lebedyuk · May 24, 2020 go to post

So should this be reported as a bug ?

Yes, please do.

This probably means the pythonbind interface is not doing some conversions that the ODBC and JDBC drivers are doing ?

Probably. Python Native API and xDBC are the recommended approaches to use with InterSystems IRIS.

Eduard Lebedyuk · May 24, 2020 go to post

Does this query work?

SELECT
    DatabaseName,
    Directory,
    MaxSize,
    Size,
    ExpansionSize,
    Available,
    Free,
    DiskFreeSpace,
    Status,
    SizeInt,
    TO_NUMBER(TOCHAR(AvailableNum)) AvailableNum,
    DiskFreeSpaceNum,
    ReadOnly
FROM SYS.Database_FreeSpace('*')
Eduard Lebedyuk · May 23, 2020 go to post

.xlsx file, manipulates the file (in COS)

How are you manipulating xlsx in InterSystems ObjectScript?

Eduard Lebedyuk · May 22, 2020 go to post

For a better http performance

  • Install dedicated web server
  • Configure it for your workflow
  • Maybe move web gateway/web server to a separate server
Eduard Lebedyuk · May 19, 2020 go to post

What does

write $SYSTEM.Util.GetEnviron("JAVA_HOME")

return in the same process as JavaGateway?

If not /usr/java/jdk1.8.0_65 you might need to restart the InterSystems IRIS instance.

Your OS user can be determined by running:

write $system.Process.UserName()

again it's important to run this code in the same process as Java Gateway.

After you determined effective OS username you can check folder/executable permissions.

Finally, SELinux if enabled might require additional configuration.

Eduard Lebedyuk · May 17, 2020 go to post

You can use this macro to translate class name into table name.

set table = ##class(%CSP.UI.Portal.SQL.Home).Quoter2($$$ClassSQLTable(class))

It's faster (no object access) and quotes table name if required.

Eduard Lebedyuk · May 17, 2020 go to post

If records are never deleted and you're okay with a few misses, use ExtentSizeFast, if you need the fastest precise runtime implementation use ExtentSize, in you need better compile speed and don't care about runtime speed use GetExtentSize.

/// w ##class(Utils.Persistent).GetGlobal("Utils.Persistent")
ClassMethod GetDataGlobal(Class As %Dictionary.CacheClassname) As %String
{
    Quit:'$$$comClassDefined(Class) ""
    Set Strategy = $$$comClassKeyGet(Class, $$$cCLASSstoragestrategy)
    Quit $$$defMemberKeyGet(Class, $$$cCLASSstorage, Strategy, $$$cSDEFdatalocation)
}

/// w ##class(Utils.Persistent).ExtentSizeFast("Utils.Persistent")
ClassMethod ExtentSizeFast(Class As %Dictionary.CacheClassname) As %String [ CodeMode = expression ]
{
$Get(@..GetDataGlobal(Class), 0)
}


/// w ##class(Utils.Persistent).GetExtentSize("Utils.Persistent")
ClassMethod GetExtentSize(Class As %String) As %Integer
{
    Set Global = ..GetDataGlobal(Class)
    Quit:Global="" 0
   
    Set Id = $Order(@Global@(""))
    Set Count = 0
    While Id '= "" {
        Set Id = $Order(@Global@(Id))
        Set Count = Count + 1
    }
    Quit Count
}

ClassMethod ExtentSize() As %Integer [ CodeMode = objectgenerator ]
{
    set Strategy = $$$comClassKeyGet(%classname, $$$cCLASSstoragestrategy)
    set Global = $$$defMemberKeyGet(%classname, $$$cCLASSstorage, Strategy, $$$cSDEFdatalocation)
    Do %code.WriteLine(" Set Id = $Order(" _ Global _ "(""""))")
    Do %code.WriteLine(" Set Count = 0")
    Do %code.WriteLine(" While Id '= """" {")
    Do %code.WriteLine("     Set Id = $Order(" _ Global _ "(Id))")
    Do %code.WriteLine("     Set Count = Count + 1")
    Do %code.WriteLine(" }")
    Do %code.WriteLine(" Quit Count")
    Quit $$$OK
}
Eduard Lebedyuk · May 17, 2020 go to post
set user = $username
set role = "MyOperation"
set sc = ##class(EnsLib.Workflow.UserDefinition).CreateUser(user)
set sc = ##class(EnsLib.Workflow.RoleDefinition).CreateRole(role)
set sc = ##class(EnsLib.Workflow.RoleDefinition).AddUserToRole(role, user)

Export role/user globals as xml.

Eduard Lebedyuk · May 15, 2020 go to post

Great article.

Is it available for InterSystems IRIS?

Some projects make use of dynamic objects and it would be great to show them in Visual Trace.

Eduard Lebedyuk · May 14, 2020 go to post

You can use JDBC gateway via Interoperability productions (EnsLib.SQL package).

How are you using ODBC in InterSystems ObjectScript?

Eduard Lebedyuk · May 13, 2020 go to post

You need the c flag

write $SYSTEM.OBJ.Load("C:\InterSystems\HealthShare_2\opt\contenedor\zpm-0.2.2.xml", "c")

But as @Evgeny.Shvarovsaid you'll need InterSystems IRIS for zpm to work.

Eduard Lebedyuk · May 12, 2020 go to post

$STORAGE is a special variable which contains the number of bytes available for a current process. After it hits zero you get STORE error. You can profile your code to see which part leaks memory. Small example:

write $STORAGE
>268326112
set i=1
write $STORAGE
>268326104
kill i
write $STORAGE
>268326112

Check that:

  • $storage before and after EvaluateClone call is the same
  • $storage on each loop cycle is the same

Another approach is throwing/catching and logging an exception and checking what's available in each frame.

do clone.Children.RemoveAt(key) // update clone

RemoveAt returns oref, maybe you need to kill it.

I'm wondering if IS has a java-like garbage collector (as in "the object is automatically destroyed"), and if so, is this keeping up with the clone construction and killing, over a 200k+ loop? Is it an immediate thing, or is there a garbage collector crawling around looking for un-referenced objects?

InterSystems products have automatic garbage collector. I'm not sure on the specifics. Calling @Daniel.Pasco.