이 작업의 프레임 워크 내에서 두 경우 (터미널 2에서베이스를 읽고 터미널 1에서베이스에 쓸 때) 트랜잭션 메커니즘을 통해 차단되어야한다는 것을 올바르게 이해합니까?
데이터베이스가 업데이트되었는지 확인하는 가장 저렴한 방법은 무엇입니까?
근본적으로 잘못되었습니다. 작성자 1명, 독자 N명으로 구성된 분산형 클라이언트-서버 애플리케이션을 설명하는 것입니다. 이러한 시스템(및 일반적으로 모든 분산 시스템)을 설계할 때는 잠금이 없는 데이터 구성 및 액세스 방식을 사용하여 잠금을 피해야 합니다. 만약 사용된 기술이 잠금 없이 작업을 수행할 수 없다면, 해당 기술이 작업에 가장 적합한 솔루션이 아닐 수도 있습니다. 귀하의 경우에는 본격적인 서버를 배포하고(클라이언트와 동일한 컴퓨터에서 할 수 있음) 메시지 대기열에 따옴표를 쓰는 것이 좋습니다(예를 들어 Kafka를 보세요). 클라이언트는 필요한 인덱스에서 이러한 따옴표를 읽습니다. 이것은 잠금 없는 데이터 액세스 방식입니다.
근본적으로 잘못되었습니다. 작성자 1명, 독자 N명으로 구성된 분산형 클라이언트-서버 애플리케이션을 설명하고 있습니다. 이러한 시스템(및 일반적으로 모든 분산 시스템)을 설계할 때는 잠금이 없는 데이터 구성 및 액세스 방식을 사용하여 잠금을 피해야 합니다. 만약 사용된 기술이 잠금 없이 작업을 수행할 수 없다면, 해당 기술이 작업에 가장 적합한 솔루션이 아닐 수도 있습니다. 귀하의 경우에는 본격적인 서버를 배포하고(클라이언트와 동일한 컴퓨터에서 할 수 있음) 메시지 대기열에 따옴표를 쓰는 것이 좋습니다(예를 들어 Kafka를 보세요). 클라이언트는 필요한 인덱스에서 이러한 따옴표를 읽습니다. 이것은 잠금 없는 데이터 액세스 방식입니다.
절대 안 됩니다. 파일을 통한 공유는 전혀 원자적이지 않으므로 읽는 쪽과 쓰는 쪽 모두에 잠금이 필요합니다. 이것은 교착 상태에 빠지고 보기 어렵고 이해하기 어려운 오류를 포착하는 데 어려움을 겪는 가장 확실한 방법입니다.
자세한 답변에 감사드립니다! 안타깝게도 당시 어떤 문제를 해결하고 있었는지 완전히 잊어버렸어요. 그래서 그 주제에 대한 제 생각을 공유할 수 없습니다.
예를 들어 %d, %s, %lld, %s와 같이 3-4 개의 문이있는 리소스 파일에서 데이터의 다소 큰 입력 문자열이 배치 될 때 StringFormat에서 문제를 발견했습니다. 여러 대체 변형을 확인했는데 함수에서 방문한 많은 양의 문제 일 뿐이며 오류 4003이 발생합니다.
매개 변수에 테이블 이름을 지정하면 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());
elseif(count_rows>0)
Print(StringFormat("Import file: %s, rows: %lld",file_name,count_rows));
}
Finalize();
}
//+------------------------------------------------------------------+
내일 베타 버전이 2840으로 출시될 예정입니다:
매우 만족합니다, 감사합니다
베타 2840을 사용할 수 있으니 사용해 보세요.
내일 베타 버전이 2840으로 출시될 예정입니다:
예:
나중에 데이터베이스 생성 마법사에 새로운 json 유형을 포함할 예정입니다.
누가 그것을 알아 냈는지, 그러한 작업의 구현을 보여주세요.
이 작업의 프레임 워크 내에서 두 경우 (터미널 2에서베이스를 읽고 터미널 1에서베이스에 쓸 때) 트랜잭션 메커니즘을 통해 차단되어야한다는 것을 올바르게 이해합니까?
데이터베이스가 업데이트되었는지 확인하는 가장 저렴한 방법은 무엇입니까?
근본적으로 잘못되었습니다. 작성자 1명, 독자 N명으로 구성된 분산형 클라이언트-서버 애플리케이션을 설명하는 것입니다. 이러한 시스템(및 일반적으로 모든 분산 시스템)을 설계할 때는 잠금이 없는 데이터 구성 및 액세스 방식을 사용하여 잠금을 피해야 합니다. 만약 사용된 기술이 잠금 없이 작업을 수행할 수 없다면, 해당 기술이 작업에 가장 적합한 솔루션이 아닐 수도 있습니다.
귀하의 경우에는 본격적인 서버를 배포하고(클라이언트와 동일한 컴퓨터에서 할 수 있음) 메시지 대기열에 따옴표를 쓰는 것이 좋습니다(예를 들어 Kafka를 보세요). 클라이언트는 필요한 인덱스에서 이러한 따옴표를 읽습니다. 이것은 잠금 없는 데이터 액세스 방식입니다.
데이터 교환이 파일을 통한 것보다 가능성이 적다는 것이 밝혀졌나요?
절대 아닙니다. 파일을 통한 공유는 전혀 원자적이지 않기 때문에 읽는 쪽과 쓰는 쪽 모두에 잠금이 필요합니다. 이것은 교착 상태에 빠지고 찾기 어렵고 이해하기 어려운 오류를 잡는 데 길을 잃는 가장 확실한 방법입니다.
근본적으로 잘못되었습니다. 작성자 1명, 독자 N명으로 구성된 분산형 클라이언트-서버 애플리케이션을 설명하고 있습니다. 이러한 시스템(및 일반적으로 모든 분산 시스템)을 설계할 때는 잠금이 없는 데이터 구성 및 액세스 방식을 사용하여 잠금을 피해야 합니다. 만약 사용된 기술이 잠금 없이 작업을 수행할 수 없다면, 해당 기술이 작업에 가장 적합한 솔루션이 아닐 수도 있습니다.
귀하의 경우에는 본격적인 서버를 배포하고(클라이언트와 동일한 컴퓨터에서 할 수 있음) 메시지 대기열에 따옴표를 쓰는 것이 좋습니다(예를 들어 Kafka를 보세요). 클라이언트는 필요한 인덱스에서 이러한 따옴표를 읽습니다. 이것은 잠금 없는 데이터 액세스 방식입니다.
절대 안 됩니다. 파일을 통한 공유는 전혀 원자적이지 않으므로 읽는 쪽과 쓰는 쪽 모두에 잠금이 필요합니다. 이것은 교착 상태에 빠지고 보기 어렵고 이해하기 어려운 오류를 포착하는 데 어려움을 겪는 가장 확실한 방법입니다.
자세한 답변에 감사드립니다! 안타깝게도 당시 어떤 문제를 해결하고 있었는지 완전히 잊어버렸어요. 그래서 그 주제에 대한 제 생각을 공유할 수 없습니다.
베타 2840을 사용할 수 있으니 사용해 보세요.
이 솔루션에 대한 질문
- 여러 EA가 동일한 sqlite 데이터베이스를 동시에 사용할 때 문제가 있나요?
- MT5가 충돌하면 일부 데이터가 손실될 수 있나요? 얼마나 자주 디스크에 데이터를 쓰나요?
안녕하세요, 개발자 여러분!
매개 변수에 테이블 이름을 지정하면 5601 오류 (쿼리 실행 오류이지만 쿼리를 실행하지 않음)가 발생합니다,
그리고 SQL 쿼리를 지정하면 오류 4022 ( 프로그램 실행 취소)가 발생하며, 아마도 내 라이브러리 코드의 일부인 MQL 함수 내부에서 오류가 발생했을 것입니다: