기고글 토론 "SQLite: MQL5로 SQL 데이터베이스의 처리" - 페이지 7

 
Renat Fatkhullin:

내일 베타 버전이 2840으로 출시될 예정입니다:

  • SQLite 2.35.2 버전

  • 영구 WAL 모드로, 다른 애플리케이션의 오픈 데이터베이스로 작업할 수 있습니다(이전에는 메타에디터가 터미널과 병렬로 작업할 수 없었습니다).

매우 기쁩니다, 감사합니다
 
Edgar Akhmadeev:
매우 만족합니다, 감사합니다

베타 2840을 사용할 수 있으니 사용해 보세요.

 
Renat Fatkhullin:

내일 베타 버전이 2840으로 출시될 예정입니다:

  • SQLite 2.35.2 버전

  • 영구 WAL 모드로 다른 애플리케이션의 오픈 데이터베이스로 작업할 수 있습니다 (이전에는 MetaEditor가 터미널과 병렬로 작업할 수 없었습니다).

  • 통계 함수 확장
    예:
  • 새로운 수학 함수
  • JSON 지원도 포함됨

    나중에 데이터베이스 생성 마법사에 새로운 json 유형을 포함할 예정입니다.



Renat, 정말 감사합니다!!!
이렇게 빨리 될 줄은 몰랐어요, 매우 기쁘게 생각합니다))))))
 
fxsaber:

누가 그것을 알아 냈는지, 그러한 작업의 구현을 보여주세요.

  1. 터미널이 두 개 있습니다.
  2. 터미널1에서 터미널2의 해당 사용자 지정 기호로 한 심볼의 실시간 따옴표를 전송해야 합니다.
FXSABER:

이 작업의 프레임 워크 내에서 두 경우 (터미널 2에서베이스를 읽고 터미널 1에서베이스에 쓸 때) 트랜잭션 메커니즘을 통해 차단되어야한다는 것을 올바르게 이해합니까?

데이터베이스가 업데이트되었는지 확인하는 가장 저렴한 방법은 무엇입니까?

근본적으로 잘못되었습니다. 작성자 1명, 독자 N명으로 구성된 분산형 클라이언트-서버 애플리케이션을 설명하는 것입니다. 이러한 시스템(및 일반적으로 모든 분산 시스템)을 설계할 때는 잠금이 없는 데이터 구성 및 액세스 방식을 사용하여 잠금을 피해야 합니다. 만약 사용된 기술이 잠금 없이 작업을 수행할 수 없다면, 해당 기술이 작업에 가장 적합한 솔루션이 아닐 수도 있습니다.
귀하의 경우에는 본격적인 서버를 배포하고(클라이언트와 동일한 컴퓨터에서 할 수 있음) 메시지 대기열에 따옴표를 쓰는 것이 좋습니다(예를 들어 Kafka를 보세요). 클라이언트는 필요한 인덱스에서 이러한 따옴표를 읽습니다. 이것은 잠금 없는 데이터 액세스 방식입니다.

fxsaber:

데이터 교환이 파일을 통한 것보다 가능성이 적다는 것이 밝혀졌나요?

절대 아닙니다. 파일을 통한 공유는 전혀 원자적이지 않기 때문에 읽는 쪽과 쓰는 쪽 모두에 잠금이 필요합니다. 이것은 교착 상태에 빠지고 찾기 어렵고 이해하기 어려운 오류를 잡는 데 길을 잃는 가장 확실한 방법입니다.

 
Vasiliy Sokolov:

근본적으로 잘못되었습니다. 작성자 1명, 독자 N명으로 구성된 분산형 클라이언트-서버 애플리케이션을 설명하고 있습니다. 이러한 시스템(및 일반적으로 모든 분산 시스템)을 설계할 때는 잠금이 없는 데이터 구성 및 액세스 방식을 사용하여 잠금을 피해야 합니다. 만약 사용된 기술이 잠금 없이 작업을 수행할 수 없다면, 해당 기술이 작업에 가장 적합한 솔루션이 아닐 수도 있습니다.
귀하의 경우에는 본격적인 서버를 배포하고(클라이언트와 동일한 컴퓨터에서 할 수 있음) 메시지 대기열에 따옴표를 쓰는 것이 좋습니다(예를 들어 Kafka를 보세요). 클라이언트는 필요한 인덱스에서 이러한 따옴표를 읽습니다. 이것은 잠금 없는 데이터 액세스 방식입니다.

절대 안 됩니다. 파일을 통한 공유는 전혀 원자적이지 않으므로 읽는 쪽과 쓰는 쪽 모두에 잠금이 필요합니다. 이것은 교착 상태에 빠지고 보기 어렵고 이해하기 어려운 오류를 포착하는 데 어려움을 겪는 가장 확실한 방법입니다.

자세한 답변에 감사드립니다! 안타깝게도 당시 어떤 문제를 해결하고 있었는지 완전히 잊어버렸어요. 그래서 그 주제에 대한 제 생각을 공유할 수 없습니다.

 
Renat Fatkhullin:

베타 2840을 사용할 수 있으니 사용해 보세요.

레나트, 안녕하세요!

예를 들어 %d, %s, %lld, %s와 같이 3-4 개의 문이있는 리소스 파일에서 데이터의 다소 큰 입력 문자열이 배치 될 때 StringFormat에서 문제를 발견했습니다. 여러 대체 변형을 확인했는데 함수에서 방문한 많은 양의 문제 일 뿐이며 오류 4003이 발생합니다.

프로젝트에서 일시적으로 StringReplace 함수로 전환했는데 입력 문자열의 큰 데이터에서 올바르게 작동합니다.
 
배웠습니다, 공유해 주셔서 감사합니다.
 
DataBasePrepare 파일에 실수가 있습니다. "쌍"을 문자열로 바꾸면 맞나요?
 

이 솔루션에 대한 질문

- 여러 EA가 동일한 sqlite 데이터베이스를 동시에 사용할 때 문제가 있나요?

- MT5가 충돌하면 일부 데이터가 손실될 수 있나요? 얼마나 자주 디스크에 데이터를 쓰나요?

 

안녕하세요, 개발자 여러분!

매개 변수에 테이블 이름을 지정하면 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();
  }
//+------------------------------------------------------------------+