記事"SQLite: MQL5 での SQL データベースのネイティブな処理"についてのディスカッション - ページ 7

 
Renat Fatkhullin:

明日のベータでは2840になる:

  • SQLite 2.35.2バージョン

  • 永続的なWALモードで、開いているデータベースを別のアプリケーションから操作できるようになりました(以前はMetaEditorはターミナルと並行して操作できませんでした)。

とても嬉しい。
 
Edgar Akhmadeev:
とても嬉しい、ありがとう

ベータ2840が利用可能です。

 
Renat Fatkhullin:

明日のベータでは2840になる:

  • SQLite 2.35.2バージョン

  • 永続的なWALモードにより、異なるアプリケーションから開いているデータベースを操作できる(以前はMetaEditorはターミナルと並行して作業できなかった)

  • 統計関数の拡張
    例:
  • 新しい数学関数
  • JSON サポートも 含まれています

    データベース作成ウィザードに新しい json タイプを含める予定です。



Renat、どうもありがとう!
こんなに早くできるとは思っていなかったので、とても嬉しいです。)
 
fxsaber:

それを理解した人は、そのようなタスクの実装を示してほしい。

  1. 2つのターミナルがあります。
  2. あるシンボルのリアルタイム相場をターミナル1からターミナル2の対応するカスタムシンボルに 転送する必要がある。
fxsaber:

このタスクの枠組みの中で、両方の場合(Terminal2 でベースを読み取り、Terminal1 でベースに書き込む場合)、トランザクションメカニズムを通じて ブロックする必要があることを正しく理解していますか?

データベースが更新されたことを判断する最も安価な方法は何ですか?

根本的に間違っています。あなたが説明しているのは、分散クライアントサーバーアプリケーションで、1ライター、nリーダーのスキームです。このようなシステム(そして一般的な分散システム)を設計する場合、ロックフリーのデータ構成やアクセス方法を使用することで、ロックを回避するようにしなければなりません。もし使用する技術がロックなしを可能にしないのであれば、それはあなたのタスクにとって最適なソリューションではないかもしれません。
あなたの場合、本格的なサーバーをデプロイして(クライアントと同じマシン上で可能)、メッセージキューに引用を書き込むのがよいでしょう。クライアントは、必要なインデックスからこれらの引用を読み取る。これはロックフリーのデータアクセス方式である。

fxsaber:

つまり、データ交換の 可能性はファイル経由よりも少ないということだ。

断じてノーだ。ファイル経由の共有はアトミックではないので、読み手側と書き手側の両方でロックが必要です。これはデッドロックを引き起こす最も確実な方法であり、見つけにくく理解しにくいエラーをキャッチするのに迷うことになる。

 
Vasiliy Sokolov:

根本的に間違っている。あなたが説明しているのは、1ライター、nリーダーのスキームを持つ分散クライアント・サーバー・アプリケーションです。このようなシステム(そして一般的な分散システム)を設計する場合、ロックを避け、ロックフリーの方法でデータを整理し、それらにアクセスするようにすべきです。もし使用するテクノロジーがロックなしを可能にしないのであれば、それはあなたのタスクにとって最適なソリューションではないかもしれません。
あなたの場合、本格的なサーバーをデプロイして(クライアントと同じマシン上でデプロイできます)、メッセージキューに引用を書き込むのがよいでしょう。クライアントは、必要なインデックスからこれらの引用を読み取る。これはロックフリーのデータ・アクセス・スキームである。

断じて違う。ファイルを介した共有はアトミックではないので、読み手側と書き手側の両方でロックが必要になる。これはデッドロックを引き起こす最も確実な方法であり、見難く理解し難いエラーを捕らえることに没頭することになる。

詳細な回答をありがとう!残念なことに、当時自分がどんな問題を解決していたのかすっかり忘れていました。そのため、このトピックに関する私の考えを共有することができないのです。

 
Renat Fatkhullin:

ベータ2840が利用可能です。

Renatさん、おはようございます!

私もStringFormatの問題に気づきました。かなり大きな入力データ文字列がStringFormatに置かれた場合、例えば3-4個のステートメント、例えば%d, %s, %lld, %sを持つリソースファイルから、いくつかの置換バリエーションをチェックしました。

プロジェクトのStringReplace関数に 一時的に切り替えたところ、入力文字列に大きなデータがあっても正しく動作しました。
 
勉強になった。
 
DataBasePrepareファイルに間違いがあります。pair "を文字列で置き換えるということでよろしいでしょうか?
 

このソリューションに関する質問

- 複数の EA が同じsqlite データベースを 同時に使用することに問題はありますか?

- MT5がクラッシュした場合、一部のデータが失われる可能性はありますか?データをディスクに書き込む頻度はどのくらいですか?

 

開発者の皆様、こんにちは!

関数 "DatabaseExport "がどうにも動きません...パラメータにテーブル名を指定するとエラー5601(クエリ実行エラー。クエリは実行しません)が出ます、

SQLクエリを指定すると、エラー4022(プログラム実行の キャンセル)が出ます。おそらくMQL関数内のエラーか、私のライブラリのコードの一部でしょう:


//+------------------------------------------------------------------+
void CSQLite::DataBaseToFile(void)
  {
   uint flags=DATABASE_EXPORT_COMMON_FOLDER | DATABASE_EXPORT_QUOTED_STRINGS;

   long count_rows=0;

   string tables[],
          file_name,
          separator=";",
          query="SELECT name FROM sqlite_master WHERE tbl_name <> 'sqlite_sequence' AND type='table'";

   int total=GetValuesFromDataBase(query,tables); // ТУТ ВСЕ ОК, СПИСОК ТАБЛИЦ ИЗ БАЗЫ ПОЛУЧЕН.

   if(m_handle==NULL)
      Open();

   for(int i=0; i<total; i++)
     {
      file_name=StringFormat("%s.%s",m_name,tables[i]);
      count_rows=DatabaseExport(m_handle,tables[i],file_name,flags,separator); // ОШИБКА ПОСЛЕ ВЫПОЛНЕНИЯ ДАННОЙ ФУНКЦИИ
      Print(StringFormat("Export file: %s, rows: %lld",file_name,count_rows));

      if(count_rows<0)
         Print("DB: ", m_name,", Table: ",tables[i], ", Import failed with code ", GetLastError());
      else
         if(count_rows>0)
            Print(StringFormat("Import file: %s, rows: %lld",file_name,count_rows));
     }

   Finalize();
  }
//+------------------------------------------------------------------+