問題タブ [intersystems-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unicode - Intersystems キャッシュで予期しないエラーが発生しました:
古い CACHE.DAT データベースを Intersystems Cache (2012.1.1 win32 評価版) にロードしようとしています。名前空間とデータベースの作成に成功し、いくつかのデータベース テーブルに対してクエリを実行できました。
ただし、他のテーブルでは、次のエラーが発生します。
ドキュメントによると、これは、1 バイト文字が予期される場所でマルチバイト文字が読み取られることを意味します。これは、元のデータベースが UTF-16 であったのに対し、新しいインストールでは UTF-8 を使用していることを意味していると思われます。
私の質問は次のとおりです。データベースを変換する方法、キャッシュを構成して を処理できるようにする方法、またはこの問題を別の方法で処理する方法はありますか?
profiling - %SYS.PTools.SQLStats データの管理
Caché データベースを使用してアプリケーションのプロファイルを作成する必要があり、そのためにCacheMonitorを使用しようとしています。
クエリ統計を有効にして (CacheMonitor がDO SetSQLStats^%apiSQL(3)
内部で実行されると思います)、2 日後にサーバーのディスク容量が不足しました。データが多すぎるので、スペースを解放したいと思います%SYS.PTools.SQLQuery
。%SYS.PTools.SQLStats
これらのデータを管理するための管理ツールはありますか? SQL統計からデータを削除するにはどうすればよいですか?
注: Caché に関する私の知識はほとんどありません。
intersystems-cache - 親子関係とキャッシュ SQL ストレージを使用したキャッシュ クラスのコンパイル エラー
以下にリストされているグローバルがあり、SQL ストレージを使用していくつかのキャッシュ クラスを作成しようとしています。
グローバルの最初の 2 つの添え字 (Hmo と Keen) は、一意のエントリを作成します。3 番目の添え字 (Seq) には、4 番目の添え字レベル (Seq2) の IppLines の数であるプロパティ (IppLineCount) があります。親クラスである以下のクラス WIppProv を作成します。
このクラスは正常にコンパイルされます。次に、以下に示す WIppProvLine クラスを作成し、2 つの間の親子関係を作成しました。
これをコンパイルしようとすると、次のエラーが発生します。
エラー #5502: SQL テーブル 'XFXA_MCA.WIppProvLine %msg のコンパイル エラー: テーブル XFXA_MCA.WIppProvLine には、次のマップされていない (データ マップで定義されていない) フィールドがあります: relWIppProv'
エラー #5030: クラス XFXA.MCA.WIppProvLine のコンパイル中にエラーが発生しました 2.745 秒でコンパイル中に 1 つのエラーが検出されました。
私は何を間違っていますか?
前もってありがとう、フレッド
intersystems-cache - キャッシュSQLストレージを使用してクラスを作成するときに、グローバルの拡張参照をどのように含めますか?
既存のグローバルにマップされるクラスを作成しているので、デフォルトのストレージではなくキャッシュSQLストレージを使用します。このクラスには、実行時に値が設定される拡張参照(UCKE、SYKE)があります。SQLストレージマップに拡張参照を含めるにはどうすればよいですか?これに関するIntersystmesのドキュメントが見つからないようです。
com - システム間キャッシュに対してObjectScriptプログラムを実行して、SQLServerにデータを提供する
バックグラウンド
私が働いている主なアプリケーションは、InterSystemsのMUMPS風のCachéデータベースエンジンに大きく基づいています。すべてがグローバル配列に格納されます。外部レポートのためにシステムからデータを取得することは、単に苦痛であるものから、ひどく遅くて苦痛であるものまでさまざまです。
Cachéはデータベース用のODBCドライバーを提供しますが、関連するグローバルアレイがたまたま選択基準によってキー設定されていない限り、スキャンに頼り、単純なクエリの実行には数時間かかります。規模については、Caché実稼働名前空間全体が約100GBです。このような場合、ODBCドライバーよりもはるかに高速にデータをプルするObjectScript(IntersystemsのMUMPSの方言)プログラムを作成できます。
問題の一部は、アプリケーションベンダーがCachéのオブジェクト永続性サポートを使用せず、代わりにグローバル配列のファサードとして定義されたSQLテーブルを持っていることであり、バッチ要求ではうまく機能しないことがよくあります。
最も一般的なデータ(2.5GB相当)をプルするレポートデータベースをMS SQL Serverで構築しました。すべてのテーブルをスキャンする必要がある場合でも、すべての結果が3秒以内に返されます。残念ながら、データの更新には長い時間がかかるため、完全な更新は週に1回、アクティブな更新は1日1回しか実行できません。これはほとんどのニーズには十分ですが、もっとうまくやりたいと思っています。
私はCaché2007、SQL Server 2008 R2、Windows7およびWindowsServer2008R2上のVS2010を使用しています。
質問の範囲
ソースCachéデータベースのライブデータをSQLServer上の他のデータと統合する方法が必要です。ビューまたはテーブル値関数をSQLクエリに統合し、ソースデータベースからライブデータをプルできるようにしたい。
ライブデータは、SQLServer内で処理できる必要があります。セカンダリアプリケーションでそれを行うことは非常に苦痛であり、ODBCを介してクエリをプッシュし、適切な形式で最終的なデータセットを取得することを期待するレポートツールでは機能しません。
SQL Serverにデータを取り込む方法や、私がやりたいのと同じ一般的なことを実行する方法があることを理解しています。それはこの質問が何であるかではありません。
必要なすべてのデータがSQL定義のテーブルを介して公開されるわけではなく、ObjectScriptでパフォーマンスを使用可能にするために必要なコントロールを取得するため、データはCachéで実行されるObjectScriptプログラムから取得する必要があります。
新しいオプションや、試したり検討したりしたオプションの1つ、またはそれらのアプローチの他の長所や短所を改善する方法についてのアドバイスを探しています。
私がこれまでに試したこと
このプロジェクトは、私が調べたそれぞれの有望な道がひどいものであるか、何らかの理由で機能しないという欲求不満の練習でした。多くの場合、その理由はSQLCLRアセンブリに対する不要な制限です。
リンクサーバーを介してInterSystemのCachéODBCドライバーを介してすべてをプルします。SQL Serverは、条件をリモートサーバーにプッシュできない場合、またはローカルで結合を実行する必要がある場合に、スキャンに頼ることがよくあります。重要なテーブルのスキャンには何時間もかかり、受け入れられません。また、多くの列の長さが、CachéのSQLテーブル定義によって誤って定義されています。SQL Serverはそれを嫌い、クエリを中止します。このSOの質問を参照してください。テーブルの定義を変更することはできません。ベンダーは、MS Accessで動作するため、問題はないと考えています。
オンデマンドでOPENQUERYを使用します。これはある程度機能しますが、前の項目の列の長さの問題が発生する可能性があり、OPENQUERYクエリをパラメーター化する方法がないため、コンテキストデータを取得するのはかなり役に立ちません。
SQLCLRを使用して、CLRテーブル値関数を介してODBCデータプロバイダーを呼び出します。これにより、パラメーター化とデータ長の問題が処理されますが、新しいデータが必要になるたびに関数を定義または変更する必要があります。残念ながら、私が興味を持っているすべてのデータ要素がSQLで利用できるわけではありません。いくつかのことについては、グローバルアレイに直接アクセスする必要があります。
Intersystemsは、サーバー上でTCPを介してObjectScriptプログラムを実行し、結果を取得できるActiveXコントロールを提供します。これはスタンドアロンのC#アプリではうまく機能しますが、SQLCLRアセンブリから接続しようとすると、ばかげたURIエラーが発生します。
ユーザー定義ルーチンまたはアグリゲート「GetActiveAccounts」の実行中に.NETFrameworkエラーが発生しました:System.UriFormatException:無効なURI:URIが空です。System.UriFormatException:at System.Uri.CreateThis(String uri、Boolean dontEscape、UriKind uriKind)at System.Uri..ctor(String uriString)at System.ComponentModel.Design.RuntimeLicenseContext.GetLocalPath(String fileName)atSystem.ComponentModel。 Design.RuntimeLicenseContext.GetSavedLicenseKey(Type type、Assembly resourceAssembly)at System.ComponentModel.LicenseManager.LicenseInteropHelper.GetCurrentContextInfo(Int32&fDesignTime、IntPtr&bstrKey、RuntimeTypeHandle rth)at FacsAccess.GetActiveAccounts.Client.connect()at FacsAccess.GetActiveAccounts FacsAccess.GetActiveAccounts.E1.GetEnumerator()のctor()
この未回答のSOの質問を参照してください。ネット上には他にも投稿がありますが、手がかりはないようです。これは、C++DLLに対する非常に単純なCOMラッパーです。ライセンスに関しては何もしておらず、管理されたライセンスライブラリに含まれる理由はありません。これは、SQLデータベースにロードされているために名前がないアセンブリの名前を取得しようとしている、ある種の定型文であるのではないかと思います。
Intersystemsは、より直接的なアンマネージインターフェイスも提供しますが、これらのインターフェイスはすべてC ++であり、P / Invokeでは使用できず、SQLCLRでC ++/CLI混合モードの不純なアセンブリをロードできません。
私が検討したオプションですが、ちょっとひどいようです
SQL ServerのCOMサポートを介してActiveXコントロールを試すことを検討しましたが、それは非常に遅く、非常に面倒です。
トラフィックをプロキシするためのアウトプロセスサービスを作成することはできますが、SQLCLRからの.NETリモーティングを使用できません。また、WCFを使用することは想定されておらず、このような単純なインターフェイスではとにかく非常に重いものになります。私はすぐに自分のIPCインターフェイスをロールバックします。
VisMまたはCacheDirectインターフェイス用のCスタイルのインターフェイスを使用して、ある種の追加のアンマネージラッパーを記述し、P/Invokeを介してそれにアクセスすることができます。
これはそれほど難しいことではないようですが、それは本当に私を壁に押し上げており、私はいくつかの視点が必要です。
intersystems-cache - キャッシュSQLストレージを使用するキャッシュオブジェクトを保存するときにRowIdを変更する
まず、この質問の長さについてお詫び申し上げます。次のようにグローバルに設定しています。
最初の添え字は内部Hmo、sceondは内部提供、3番目は行番号、最後は行詳細番号です。4番目の添え字レベルのデータは、行の監査証跡履歴を組み合わせたものであり、最大の行詳細番号が現在の行です。
私は次のように親子関係で3つのクラスを設定しています:メインクラス
Lineクラス
Line Detail Class Class XFXA.Try3.IppProvLineDetail Extends(%Persistent、%XML.Adaptor)[ClassType = persist、Inheritance = right、ProcedureBlock、SqlRowIdName = Id、StorageStrategy = SQLMapping] {
ユーザーが行に削除のマークを付けると、現在の詳細行の4番目の添え字レベルで削除フラグが1に設定され、この行が最後の行でない場合、ファイリングコードは最後の行に移動します。メインクラスのdeleteメソッドでこれを実行しようとすると、RowIdの更新が許可されていないというエラーメッセージが表示されます。これは、行を移動する行クラスのLineプロパティを操作して、削除された行を最後までプッシュしようとしたためです。ドキュメントを確認したところ、AllowRowIDUpdateにいくつかの警告がありましたが、使用方法の明確な例はありませんでした。誰かがこれを達成する方法を知っていますか?
intersystems-cache - グローバル添え字の中点を見つける
CaféObjectScript(IntersystemsのMUMPSの方言)で、グローバル添え字範囲のキーの近似中点または線形点に効率的にスキップする方法はありますか?レコード数に基づいて等しい。
下付き文字のキー範囲をほぼ等しいチャンクに分割してから、各チャンクを並行して処理したいと思います。
グローバルのキーが何らかのバイナリツリーに配置されていることを知っているので、これは基盤となるデータストレージエンジンの簡単な操作であるはずですが、これを行うためのインターフェイスがあるかどうかはわかりません。
グローバルのキースペース全体をスキャンすることでそれを行うことができますが、それでは操作を並行して実行しようとする目的が無効になります。シーケンシャルスキャンは、このグローバルで数時間かかります。スキャンを開始する前に、キースペースを分割する必要があります。
各スレッドが、キースペースのほぼ同じサイズの連続したチャンクに個別にスキャンするようにします。問題は、各スレッドに与えるキー範囲を計算することです。
unit-testing - IntersystemsCachéのユニットテストフレームワーク
IntersystemsCachéの単体テストフレームワークはありますか?もしそうなら、いくつかリストしてください。
intersystems-cache - 挿入/更新中に行にタイムスタンプを設定する方法
SQL 経由でフィールドが更新または挿入されるたびに、タイムスタンプ列を設定したいと考えています。
SqlComputed プロパティを使用してみましたが、フィールドが最初に null の場合、%Open または %New と ObjectScript でオブジェクトを設定するときに、フィールドを設定するという望ましくない副作用があります。オブジェクトが %Save (または INSERT/UPDATE) されるまで値を設定したくありません。
これどうやってするの?
intersystems-cache - Intersystems-cache log4 相当
キャッシュに使用できる log4 に似たものがあるかどうかは誰にもわかりませんか?
多くの .Net プロジェクトで log4net を使用してきましたが、同じ機能を備えたものが必要です。特に、ローカル、dev、qa、および prod 環境間のロギング レベルと構成機能。