Nicky Zhu · Oct 16, 2017 go to post

Hi Eduard, thank you for answering, the second service do not take parameter from URL, a json payload is used instead

Nicky Zhu · Oct 24, 2017 go to post

Hi Samuel,

Thank you for your help. I'll try it and feedback later.

Nicky Zhu · Nov 1, 2017 go to post

HI Samuel,

     I've tried several times using DeepSee Folder Manager to do the job but unfortunately it did not work.

The following is the steps I've tried, would you mind help me in figuring out what was wrong about them?

1. I've written a Cube class named as Test.TestCube, basically it is only a copy of HSAA.PatientCube. The definition of the cube was written as below:

Class Test.TestCube Extends %DeepSee.CubeDefinition [ DependsOn = (HSAA.Patient, HSAA.PatientOverrides, HSAA.PatientCurrentConditionsCube, HSAA.EnteredAtCube) ]
{

/// Cube definition from Architect.
XData Cube [ XMLNamespace = "http://www.intersystems.com/deepsee" ]
{
<cube xmlns="http://www.intersystems.com/deepsee" name="TestCube" displayName="TestCube" disabled="false" inheritsFrom="PatientDetails" abstract="false" actionClass="HSAA.KPI.PatientActions" owner="_SYSTEM" caption="TestCube" countMeasureName="%COUNT" bucketSize="8" bitmapChunkInMemory="false" precompute="0" disableListingGroups="false">

2. Then I defined a pivot table as GenderDistribution which depend on two calculated dimensions as Female and Male respectively:

3. then I first export the cube and imported it into another environment, compile and builded the cube

4. And I exported the pivot table with Folder Manager as below:

5. I updated the exported file to another instance and used Folder Manager to import it, but the calculated members are still missing and my pivot table fails to load:

Thanks.

Nicky Zhu · Nov 2, 2017 go to post

A million thanks. This works and my pivot table can work now. 

I'll recommend it to my team members, thank you.

Nicky Zhu · Jun 4, 2018 go to post

Thanks Eduard. But not exactly.

With the use of SoapAction, we can rename the soapAction attribute as below:

<binding name="MyServiceSoap" type="s0:MyServiceSoap">

<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>

<operation name="GetPatientInfo">

<soap:operation soapAction="Get_PatientInfo" style="document"/>

<input><soap:body use="literal"/></input>

<output><soap:body use="literal"/></output>

</operation>

</binding>

What they want is actually to change the name of the operation.

Nicky Zhu · Jun 4, 2018 go to post

Thanks guys. I've finished the tasks except for mirroring.

When I use SYS.Mirror to create mirror set:

%SYS>set tSC = ##class(SYS.Mirror).CreateNewMirrorSet("TestSet",sysName,,)

It failed because:

SYS>zw tSC
tSC="0 "_$lb($lb(2066,,,,,,,,,$lb(,"%SYS",$lb("e^zCreateNewMirror+9^SYS.MirrorConfiguration.1^1","e^zCreateNewMirrorSet+48^SYS.Mirror.1^1","e^^^0"))))/* ERROR #2066: Mirroring Service is required but not enabled */

Then the question is how may I enable %Service_Mirror  programtically

Thanks again

Nicky Zhu · Oct 29, 2018 go to post

Dear Lexi,

I've assigned the DB resource to the  application, unfortunately it's still not working.

Anyway, we bypassed the problem. Thank you for your help.

Nicky Zhu · Jan 10, 2019 go to post

Hi Robert,

Thank you very much for your help.

So far we simply used exported csv files to load legacy data. 

During the tests, we found:

1. Under Hive JDBC drivers:

a. By changing rowkey to Varchar(255) is not working. Data migration and link table tasks all failed.

b. Using sql inbound adapter to read data is not working either(select * from sometable), the query failed due to the missing of some toCLOB(0,2) method in the jdbc driver

2. then we tried hive odbc driver

a.  link table task succeed

b. we can use sql to select * from linked table which can also be used with sql inbound adapter. But when we used where clause (select * from sometable where rowkey=' a long string key'), the query failed again due to the follwoing error:

Any idea?

Nicky Zhu · Nov 23, 2020 go to post

Hi Botai, 如大家已指出的,Https是实现服务器与客户端通过http访问时通信安全的推荐实现。

当我们采用自己编程实现的客户端加密 - 服务器端解密解决方案时,需要注意和控制以下的若干问题:

1. Base64是一个编码手段而不是加密手段,其编码的结果可以被反向解码。 如果客户需要的是通信被加密,那么需要应用的是DES、RSA等加密算法避免引入信息安全缺陷。

2. 如果采用修改登录页的方式来处理数据的加密和解密,需要对开发结果进行全面的测试,包括非功能测试,避免因开发和部署新的代码引入缺陷

3. 应用Https将对服务器与客户端的所有http请求进行加密,只改登录页的处理逻辑将只能处理登录请求,其他的客户敏感信息,例如REST、SOAP等请求的明文也仍然暴露在网络上,因此并不是个能解决安全性问题的手段

Nicky Zhu · Jan 8, 2021 go to post

Thanks guys. We are using audit log now to trace the deletions. 

Both truncate table statement and delete statement are logged as SQL DELETE Statement in table %SYS.Audit. Of cause, after the audit of XDBCStatement was enabled, the size of Audit Database increased rapidly (I.E 300MB for 100000 insertions in a table of only 5 fields ).

Developers who want to trace SQL execution need to be aware of much more disk space consumption and prepare that in advance.

Nicky Zhu · Jan 14, 2021 go to post

Hi Tani,

Indeed, we've talked with our client. We agreed that temporarily open audit log is OK for  trouble shooting, while we will need to make audit/cleaning process a more formal process as part of their data quality control solution.

I'll refer to the example above for them in the solution we are working on. Thanks a lot yes.

Nicky Zhu · Jan 20, 2021 go to post

Hi Scott, I'm not sure whether I captured your question exactly. Say, if you want two fields to be taken at the same time to compose a key field, it can be done by combine the two fields into one "virtual" field then use it as the key field. For example

SELECT HQ_ORG_CODE||'|'||ORDER_PROJ_CODE||'|'||FORM_DATE As OID,* FROM tableX WHERE FORM_DATE >= ?

In this SQL, we concatenated the three fields with the splitter "|" into one "virtual" filed OID, then we can directly use OID as the key field because it will exist in the result set. Also, we can use SQL function to concatenate the fields, as below

SELECT STRING(HQ_ORG_CODE,ORDER_PROJ_CODE,FORM_DATE) As OID,* FROM tableX

Hope that helps

Nicky Zhu · Feb 8, 2021 go to post

Hi, Dongsheng,

Setting on pool size could be a little tricky. 
Planning pool size before the implementation is good but it depends on whether we can predict the actual throughput of a business host and the performance of it.
As for my own experience, the more effective way to use pool size is to use it as a performance tuning approach.
Say, we deploy a business host online and perform test run for several rounds with actual or estimated loads. During the test, we'll need to observe the queue. For example, if a queue is increasing much faster than the others, it usually means the underlining business host is a performance bottleneck and we'll need to either optimize the business host or simply increase it's pool size as long as there are spare CPU cores to be used. 

Before a project goes live we usually try it out for a period of time, during which we gradually determine the pool size of each business host to achieve the required performance.

__________________________________________________________________________________

pool size的设置并不会对每一个应用都一样。
在实施之前规划好池大小是好的,但这要看我们是否能预测business host的吞吐量和它的性能。
就我自己的经验而言,将pool size作为一种性能调整的方法比较有用。
比如说,我们在线部署一个business host,在实际或预估负载的情况下,进行几轮测试运行。在测试过程中,我们需要观察队列的情况。例如,如果一个队列的增长速度比其他队列快得多,通常意味着对应的business host是一个性能瓶颈,我们需要对它进行优化,或者,只要有空余的CPU核心可以使用,增加它的pool size通常就会带来可观的性能提升。

在项目上线之前我们通常会试运行一段时间,期间逐步确定每一个business host的pool size以达到所需的性能。

Nicky Zhu · Apr 27, 2021 go to post

Hi Kevin,

I think it is better if we refine the requirement for some details so that we can refer to a set of configurations to achieve what you want.

1. The user can only visit specific DBs instead of all DBs.  Therefore, we will use specific resource to protect specific DB.


2. The user can use SQL from third party tools to visit the DBs through ODBC and JDBC connections, therefore, he need not only DB access but also specific SQL privileges. 


Reference:https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View…

We can make the user a READONLY one by assigning only Select SQL privilege to him.
We can also use portal to define the privileges:

3. If the user can only use SQL and should not use portal to visit IRIS, the simplest way is not to assign roles such as %Operator, %Manager to the user, he then can only visit portal but can not use menus to perform action and we will Never refer to %All from a user expected to have limited previleges.

Nicky Zhu · Apr 29, 2021 go to post

Hi Sai,

From the error log you attached before:

ERROR <Ens>ErrTCPReadBlockSize: TCP Read(32000) with timeout period (5) failed with : (1144):l version="1.0" encoding="UTF-8"?> Wsma2Message xmlns:ns1="urn:hl7-org:v3" ......

It seems to me it was very likely the sender and receiver are using different Charset or Endian settings (These settings are used by counted block transferring through TCP) thus the receiver can not retrieve the XML String from the bytes in the stream.
Would you mind to check whether your BO and BS are referring to the same Charset and Endian settings?

Nicky Zhu · May 31, 2021 go to post

Hi Denny,

I think the most common cause of a refused connection is OS firewall blocking the superserver port of IRIS, which is used by JDBC connections. You can try close the firewall or open the superserver port in firewall settings.

I remember that SqlDBx is using ODBC to connect to DBs, so it will use a different connection.

Nicky Zhu · Jun 3, 2021 go to post

Oh, missed one line of code.

Set confItem = ##Class(Ens.Config.Item).%OpenId(itemId)
    Do prodConf.RemoveItem(confItem)
    Set tSC = ##class(EnsPortal.Template.prodConfigSCPage).CallProductionUpdateAndSaveToClass(prodConf,"","SaveProduction")
    Quit:$$$ISERR(tSC) tSC  
    Set tSC = ##class(Ens.Director).UpdateProduction()
    Quit:$$$ISERR(tSC) tSC
    Quit tSC

Just add 

Set tSC = ##class(EnsPortal.Template.prodConfigSCPage).CallProductionUpdateAndSaveToClass(prodConf,"","SaveProduction")

Now it's working