これは InterSystems FAQ サイトの記事です。
SYS.ApplicationError クラスの ErrorList クエリを使用します。
注意1:%SYS ネームスペースで実行します。
注意2:ストアド化していないユーティリティのため %SQL.Statement ではなく %ResultSet クラスを利用します。
コマンド実行例は以下の通りです。
これは InterSystems FAQ サイトの記事です。
SYS.ApplicationError クラスの ErrorList クエリを使用します。
注意1:%SYS ネームスペースで実行します。
注意2:ストアド化していないユーティリティのため %SQL.Statement ではなく %ResultSet クラスを利用します。
コマンド実行例は以下の通りです。
これは InterSystems FAQ サイトの記事です。
InterSystems製品を停止しないバックアップ方法は、3種類あります。
① 外部バックアップ
② オンライバックアップ
③ レガシー並行外部バックアップ
各詳細については、以下ドキュメントをご参照ください。
バックアップ方法について【IRIS】
バックアップ方法について
それぞれの特徴について、簡単に解説します。
これは InterSystems FAQ サイトの記事です。
通常SQLCODE -110(Locking conflict in filing)のエラーはロックが競合した場合に発生します。
大量レコードが一度に更新された場合、その件数がロック閾値を超えてロックエスカレーションを起こしてテーブルロックとなる可能性があり、そのためにロックの競合が起きやすくなっていることが考えられます。
このロック閾値を上げることにより、この競合を回避できる可能性もあります。
しかしこの閾値を上げることにより、システムが必要とするロック管理用のメモリが増えるという副作用がありますので、慎重な検討が必要です。
あるいはテーブルロックになる可能性を排除できずに、更新タイミング等アプリケーションの仕様を見直す必要があるかもしれません。
またSQLCODE -110はロックテーブルの空き容量が不足した場合にも発生する可能性があります。
コンソールログファイル(※)をご確認いただき、「LOCK TABLE FULL!!!」のエラーが記録されているようであれば、ロックテーブルの容量不足が原因です。
※ InterSystems IRIS のコンソールログファイル名は messages.log、Caché/Ensemble/HealthShare コンソールログファイル名は cconsole.log
この場合は、
これは InterSystems FAQ サイトの記事です。
InterSystems Data Platform自身には、ソース管理を行う機能はありません。
2016.2以降のバージョンをご使用の場合、統合開発環境として VSCode をご利用いただくことで、VSCode でご利用いただけるソース管理機能をご使用いただけます。
VSCode で ObjectScriptの操作を行うためには、専用エクステンションのインストールが必要です。
使用方法については、コミュニティの記事「VSCode を使ってみよう!」をご参照ください。
また、「VSCodeでのソースコード管理について」についても併せてご参照ください。
2016.2より前のバージョンをご使用の方でも使用できる方法としては、InterSystems製品 のIDEであるスタジオに、外部のソース管理ツール、製品と連携するためのフック機能があります。
このフック機能は、複数のAPIで構成されており、お客様毎にご自身の環境に合わせて、作りこむことを前提に提供されております。
よく使われるマイクロソフトのVisual Source SafeとSubversion(SVN)については、テンプレートがあります。
このテンプレートを利用すると、作りこみの作業を短縮することが可能です。
これは InterSystems FAQ サイトの記事です。
管理ポータル:システムオペレーション > データベース にあるオプションボタン(ラジオボタン)「空き容量ビュー」で表示される内容は、システムクラス SYS.Database のFreeSpace クエリで取得可能です。
次のようなコードでクエリを実行します。
例:
(%SYSネームスペースにて作成、実行します)
/// ZISJ.mac
Set stmt=##class(%SQL.Statement).%New()
Set status=stmt.%PrepareClassQuery("SYS.Database","FreeSpace")
Set rs=stmt.%Execute()
While rs.%Next() {
Write !
For i=1:1:9 {
Write rs.%GetData(i),","
}
}
もしくは、以下のようにも行えます。
これは InterSystems FAQ サイトの記事です。
%SYS.ProcessQuery クラスの AllFields クエリを使用すると取得できます。
詳細は、ドキュメント「プロセス(ジョブ)について【IRIS】 / プロセス(ジョブ)について」もご参照ください。
ターミナルでの実行例は以下の通りです。
これは InterSystems FAQ サイトの記事です
復旧を優先される場合を除き 【トラブル発生状態のまま】弊社サポートセンターまでご連絡ください。
その際、専用ツールを利用して情報収集いただくことで(所要時間約 5分)、サポートセンターによる状況確認がスムーズに行えます。
ツール使用方法については、PDF または以下ビデオでご紹介しています。
※ InterSystems IRIS / IRIS for Health をご利用の方は、こちらの記事をご参照ください。
ぜひ 1 度、テスト/開発環境で実行をお試しいただき、万が一の場合に備えていただければ思います。
ビデオの目次(YouTubeでもご覧いただけます)
0:00~1:40 情報収集ツールを使用する上での大事なポイント
1:41~2:15 ツールの種類について
2:15~3:45 どのツールを実行したらいいか困った時の考え方
3:45~5:04 管理ポータルの診断レポートの例
5:04~6:00 ^Buttonsの実行例(Cache)
6:00~7:12 ^Buttonsの実行例(Ensemble / Cacheベースの HealthConnect)
7:12~8:27 CacheHungスクリプトの実行例(Windowsの例)
8:27~9:30 CacheHungスクリプトの実行例(Linuxの例)
これはInterSystems FAQ サイトの記事です。
HTMLからRESTを使って画像ファイルをアップロードする方法をご紹介します。
1.はじめに、以下のようなhtmlとクラスを作成してください。
*UploadTest.html
開発者の皆さん、こんにちは!
VSCode の ObjectScript エクステンションで、プロセスにアタッチしてデバッグする方法についてご紹介します。
ObjectScript エクステンションの基本的な操作方法については、こちらの記事をぜひご参照ください。
解説ビデオ(4分ちょっと)もあります。ぜひご参照ください。
VSCode のデバッグ実行に関連する各種の構成情報を記述するための launch.json に ObjectScript エクステンション用の設定を記述します。
(ビデオだと、最初~1:31 で解説しています)
プロセスにアタッチするデバッグ設定例は以下の通りです。
これは InterSystems FAQ サイトの記事です。
Java のガベージコレクションは、使用しなくなったメモリ上のオブジェクトを自動開放するしくみですが、InterSystems data platform(以下IRISと表記)のガベージコレクションは、意味が異なります。
IRIS では、ディスク上の大量のデータノードを 1 コマンド(killコマンド)で削除する機能があります。
通常、データ容量が増えれば、それに伴い、削除に必要な時間が増加しますが、そうすると、そのkillコマンドを発行したプロセスが、削除が終わるのを待つ時間が増加することになってしまいます。
その様な事象の発生を避けるため、IRIS では、ユーザプロセスが大量のデータを削除する kill コマンドを発行した際に、その場で削除に必要な全ての処理を行うのではなく、削除が必要な開始の場所だけを示して、次の処理に進むようになっています。
その後、ガベージコレクタというシステムプロセスに起動がかかり、その指示されたポイントから大量データの削除に伴う領域の開放処理をバックグラウンドで処理していきます。
つまり、論理的な削除は、一瞬で終わるが、実際の物理的な削除は、遅延して行われる仕組みとなります。
このような仕組みをガベージコレクションと呼んでいます。
これは InterSystems FAQ サイトの記事です。
インターシステムズは、個々の仮想化ソフトウェアに対して、弊社製品の動作検証は行なっておりません。
インターシステムズでは、弊社製品がサポートするプラットフォームをサーバプラットフォームという単位で定義しています。
サーバプラットフォームは、オペレーティングシステムとそのバージョン、およびそのオペレーティングシステムが動作するプロセッサタイプの 3 つの要素で定義されます。
従いまして、ある仮想ソフト上で InterSystems 製品がサポートしているサーバプラットフォームが稼動し、その上で InterSystems 製品が動作している限りにおいて、製品のサポートを提供します。
これは InterSystems FAQ サイトの記事です。
データベースキャッシュおよびルーチンキャッシュをモニターし、最適値を調べる方法をご紹介します。
(1) データベースキャッシュ
現状の設定値で問題ないかは、^GLOSTAT ユーティリティ のCache Efficency値(キャッシュ効率)でモニターします。
Cache Efficiency 値は大きければ大きいほど良いですが、目安として100 以上であれば、設定サイズは問題ありません。
実行例)
これは InterSystems FAQ サイトの記事です。
「特権ルーチンアプリケーション」を使用し、コード中に $system.Security.AddRoles()メソッドを使用してロールを付与する仕組みを利用します。
※ロールベースで必要な特権を付与するため、予め特定の特権を持ったロールを作成する必要があります。
詳細は、以下ドキュメントをご参照ください。
特権ルーチン・アプリケーション【IRIS】
特権ルーチン・アプリケーションについて
例えば、特定ルーチン(またはクラスメソッド)実行時のみデータベースの更新を許可するための設定は、以下のとおりです。
(接続するデータベースに対してはREAD許可だけを持ち、あるルーチン実行時のみデータベースに対するREAD/WRITE許可を持つように設定します。)
1) データベース:Aのリソース定義を確認する
データベース:Aのリソースに %DB_%DEFAULT が設定されている場合は、独自リソースを作成します。
(データベースに割り当てられたリソースの確認は、管理ポータル > [システム管理] > [構成] > [システム構成] > [ローカルデータベース] > リソース で確認できます)
これは InterSystems FAQ サイトの記事です。
以下例のクラスメソッド getLatestID() のように ObjectScript のクラスメソッドを用意します。
返したい値を戻り値に指定し、SQLストアドプロシージャ(SqlProc)キーワードを指定するだけで値が返せます。
ClassMethod getLatestID() As %Integer [ SqlName = getLatestID, SqlProc ]
{
set latestID=$Order(^ISJ.TestClass1D(""),-1)
quit latestID
}
操作を試す場合は、以下のクラス定義をご準備ください。
Class ISJ.TestClass1 Extends (%Persistent, %Populate)
{
Property name As %String;
ClassMethod getLatestID() As %Integer [ SqlName = getLatestID, SqlProc ]
{
set latestID=$Order(^ISJ.TestClass1D(""),-1)
quit latestID
}
}これは InterSystems FAQ サイトの記事です。
XMLファイルの内容を格納する永続クラス定義を作成し、%XML.Adaptor を追加で継承します。
例は以下の通りです(右端の %XML.Adaptorクラスを追加で継承します)。
Class ISJ.Class1 Extends (%Persistent, %Populate, %XML.Adaptor)
次に、%XML.Reader クラスを使用して格納先のインスタンスへ、タグとクラスの関連付け(Correlate())を行い、reader.Next() でXMLを取り込みます。
set sc=reader.OpenFile(filename)
do reader.Correlate(tag,class)
while reader.Next(.x,.sc) { do x.%Save() }
サンプルコードは以下の通りです。
これは InterSystems FAQ サイトの記事です。
システムのパフォーマンスが低下した場合、OSやインターシステムズ製品の様々なツールを使用して情報収集を行い
”通常時と比較して、どこがどの程度変わっているか”
を確認することで、問題のある箇所を特定できます。
(逆に、通常時の状況が不明な場合、パフォーマンス問題点の切り分けが非常に困難となる場合もあります。)
いざ という時に備え、通常時のパフォーマンスを確認することは、大変重要な情報となります。
収集情報詳細は、以下のドキュメントをご参照ください。
ガイド内でご紹介しているサンプルは、https://github.com/Intersystems-jp/performance-sample からダウンロードいただけます。
パフォーマンス低下時の情報収集ツールについては、以下の関連FAQトピックをご参照ください。
これは InterSystems FAQ サイトの記事です。
$IsObject()を使用して判別できます。 調べたい変数をvとすると、
となります。
vが未定義の場合は、$IsObject(v)はUNDEFINEDエラーとなりますので、ご注意ください。
UNDEFINEDエラーを防止するには、次のように$Getを使用することをお勧めします。
これは InterSystems FAQ サイトの記事です。
ドキュメント上は明確に記述されていませんが、エクスポートの追加ボタンを押した時に表示されるファイルダイアログのファイル名にグローバル名 + .GBLと入力することでグローバルをエクスポートの対象にすることができます。
(例: ^aaaの場合、^aaa.gblと指定)
この機能はクラス、ルーチン等と一緒にグローバルデータを一括してエクスポート/インポートする際に、便利な機能ですが、XMLで表現されるため、データ容量は実データに比較し大きくなりますので、大量データを処理する場合には必要な容量に注意が必要です。
これは InterSystems FAQ サイトの記事です。
%SYS.Journal.File クラスの ByTimeReverseOrder クエリ と %SYS.Journal.Record クラスの List クエリを使用して検索することができます。
それぞれのクエリの役割は以下の通りです。
ジャーナルファイル名を取得できます。ジャーナルファイル名の降順で結果が返ります。
これは InterSystems FAQ サイトの記事です。
システム提供の %SYS.GlobalQueryクラス の Size クエリーを使用することで取得できます。
使用例は、以下のサンプルコードをご参照ください。
※カラムやパラメータの指定はクラスリファレンスをご確認ください。
set dir="C:\intersystems\iris\mgr\user" // IRIS.DAT(またはCACHE.DAT)フォルダ
set rs = ##class(%ResultSet).%New("%SYS.GlobalQuery:Size")
do rs.Execute(dir) // 第3引数でマスク指定も可
while (rs.Next()) {
set gname= rs.Get("Name") // グローバル名
set gsize= rs.Get("Used MB") // グローバルサイズ(MB)
write gname," : ",gsize,!
}
グローバル変数のサイズが大きい場合、取得時間がかかる場合もあります。その場合、Size クエリー 実行時、第 6 引数に 1 を指定してクエリを再実行してみてください。
これは InterSystems FAQ サイトの記事です。
InterSystems ObjectScript言語では引数の異なる同名のメソッドを定義することはできません。
InterSystems ObjectScript言語は一般的に動的言語と呼ばれるプログラミング言語に分類されます。
ObjectScriptではメソッド実行時にどの引数を使用するかどうかは自由に制御可能ですので、動的プログラミング言語ではないJava等の言語と異なり、コンパイルの段階で厳密に引数の数でメソッドを区別する必要がありません。
従って ObjectScript言語は、オーバーロードと一般に呼ばれる言語仕様を含んでいません。
Java等で記述されたプログラムを移植する際にオーバーロード相当の機能を実現するには、
ClassMethod test(args... as %String)
のように引数の後ろに ... を付加します。
これにより、可変長引数を渡すことが可能です。
このメソッドに複数の引数が渡された場合は、args(1)=第一引数 args(2)=第二引数というように順次設定されます。
これを使用して、メソッドコード中で渡された引数の個数を取得して処理を分岐させることができます。
※ただし、引数のデータタイプを判別することはできません。
これは InterSystems FAQ サイトの記事です。
クラス定義のプロパティの表示順は、スタジオのプロパティウィザードを利用して登録した場合は、末尾に追記されます。
また、エディタ上の任意の場所でプロパティ定義文を記述する場合は、その場所に追記され、クラス定義が登録されます。
つまり、定義者が記述した順番に登録されます。
(スタジオが並び換えを行ったりはしません。)
作成したクラス定義が、PersistentやSerialのようにデータベースに格納する属性を持ったクラス定義である場合、”初回のコンパイル”で クラス定義に対応するグローバル変数の定義情報=ストレージ定義を作成します。
初回コンパイル以降に、プロパティ定義の追加が行われれば、そのプロパティに対応するグローバル変数のスロット番号を、末尾に追加し、ストレージ定義を更新します。
以下の例は、クラス定義に対応するストレージ定義の例です。
(初回コンパイル時の状態)
これは InterSystems FAQ サイトの記事です。
一括コメントを付与したい行全体を選択後、Ctrl + / を入力することで、選択範囲を一括でコメントにすることができます。
コメントの一括解除には、コメントを解除したい行全体を選択後 Ctrl + Shift + / を入力します。
これは InterSystems FAQ サイトの記事です。
$ZSTRIP() 関数を使用します。
この関数を使用すると、指定文字列から、文字のタイプと文字を削除できます。
下記の例のように、第2引数で、"<"、">"、"<>"を指定することにより、SQLのLTRIM、RTRIM、TRIM関数と同等の処理が可能になります。
// アクションコード "<>" を指定すると前後の空白を削除する
// マスクコード:W で空白 ($C(9), $C(32), $C(160)) を削除する
// 第3引数(全角スペース)は $C($ZHEX("3000")) でも指定可能
USER>Set a=" 全角 ・半角 スペースを含む文字列 "
USER>Set b=$ZSTRIP(a,"<>W"," ")
USER>Write "["_b_"]"
[全角 ・半角 スペースを含む文字列]
USER>Set c=$ZSTRIP(a,"*W"," ") // アクションコード "*" を指定すると全ての空白を削除する
USER>Write "["_c_"]"
[全角・半角スペースを含む文字列]
USER>これは InterSystems FAQ サイトの記事です
Web サービス(SOAP)またはREST で IIS を経由してクライアントにエラー応答する際、既定では IISが生成するデフォルトのエラーページ( HTTP 500 エラー )が返されます。
SoapFaultなど、サーバ側で出力したエラーの詳細情報は返されません。
IIS7 以降、WebクライアントがWeb サービスの障害の詳細情報を取得するための設定オプションが追加されました。
HTTP ステータスコードがエラーの場合に、既存の応答をどうするかを existingResponse 属性で指定することができます。
こちらの値を、既定の Auto から PassThrough に変更することで、エラーの詳細情報が返されるように変更できます。
※設定変更後、IISの再起動が必要です。
詳細や設定手順については、以下ドキュメントをご参照ください。
Microsoft IIS 7 以降の設定手順について【IRIS】
※web.config ファイルの手動編集よりも、IIS マネージャに組み込まれている構成エディタ を使用する方法がエラーが少なく安全です。
これは InterSystems FAQ サイトの記事です。
データベース暗号化は、ディスクヘの書き込みまたはディスクからの読み取りで暗号化と復号が実行されるため、アプリケーションのロジックに手を加える必要はありません。
この機能のドキュメントについては、以下ご参照ください。
暗号化データベース作成までの流れは、以下の通りです。
(1) 暗号化キーの作成
(2) 暗号化キーの有効化
(3) 暗号化されたデータベースの作成
暗号化データベース作成後の運用のための設定は以下の通りです。
暗号化されたデータベースは、"暗号化キーの有効" が行われてアクセスできるようになります。
既定の設定では、"暗号化キーの有効"を行いませんので、以下3種類の方法から選択します。
① キーを有効化しない起動の構成
既定の設定のまま、インスタンス起動時に "暗号化キーの有効" が行われません。
暗号化されたデータベースをマウントする前に管理ポータルなどから "暗号化キーの有効" を行う必要があります。
以下の場合、この運用は適応できません。
これは InterSystems FAQ サイトの記事です
ミラーリングが同期の対象とするのはデータベースファイルのみです。
アプリケーションに必要なその他のファイル(CSPファイル、画像ファイル、ドキュメントファイルなど)をミラーセットを構成する二台のサーバー間で同期させるには、
などの方法が考えられます。 また、2の方法では Windows 上では RoboCopy、Linuxの場合には rsync という同期ソフトを使った実例があります。
これは InterSystems FAQ サイトの記事です
揮発性テーブル(多数のINSERT、DELETEが行われるテーブル)では、ビットマップ・インデックス用ストレージは徐々に効率が低下する可能性があります。
例えば、以下の定義からなるデータが数千件あり、一定期間保持した後 TRUNCATE TABLE で一括削除を行うオペレーションが繰り返し行われているとします。
Class MyWork.MonthData Extends (%Persistent, %Populate)
{
/// 満足度
Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
/// 年齢
Property Age As %Integer(MAXVAL = 70, MINVAL = 20);
Index AgeIdx On Age [ Type = bitmap ];
}
INSERT によってできたビットマップ・インデックスのストレージのイメージ(一部)は以下の通りです。