"SQLite: MQL5'te SQL veritabanlarıyla yerel olarak çalışma" makalesi için tartışma - sayfa 8
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Ve 2. soru:
SQLite'ın yerleşik mekanizmasını kullanarak veritabanları arasında veri aktarmak için ATTACH/DETACH işlevlerini kullanmaya çalıştığımda, sonuç 5601 işlem hatası oluyor...
Aynı işlemi SQLiteStudio'da çalıştırırken her şey yolunda.
Bu bilerek mi yapılıyor yoksa bir şeyler mi çalışmıyor?
Ne yazık ki, DatabaseExport işlevi tabloyu dışa aktarma işlevselliğini almamıştır (bu işlevsellik başlangıçta amaçlanmış olmasına rağmen) ve şu anda yalnızca sorguları desteklemektedir.
Hata 4022'de, test sırasında mı alıyorsunuz, evet ise, test cihazının dışa aktarma dosyası boyutunda bir sınırlaması vardır - diske yazılan toplam veri boyutu 1 GB ?
Aynı işlemi SQLiteStudio'da yürütürken her şey yolunda.
Bu bilerek mi yapılıyor yoksa bir şey mi çalışmıyor?
Ne yazık ki, DatabaseExport işlevi hiçbir zaman tablo dışa aktarma işlevine sahip olmamıştır (bu işlev başlangıçta amaçlanmış olmasına rağmen) ve şu anda yalnızca sorguları desteklemektedir.
4022 hatasını test sırasında mı alıyorsunuz, evet ise, test cihazının dışa aktarma dosya boyutu üzerinde bir sınırlaması vardır - diske yazılan toplam veri boyutu 1 GB ?
DatabaseExport işlevinde tablo adı yerine sorgu belirtirseniz, test cihazı olmadan 4022 hatası görünür.
Veritabanının boyutu 10 Mb'den az, bu işlevi diskteki veritabanından bellekteki veritabanına veri kopyalamak için kullanmayı planlıyordum.Sorgu çalışmalıdır, yolların doğru olup olmadığını kontrol edin
Teşekkürler, yolu farklı bir şekilde sağlamaya çalışacağım, ancak aslında SQLiteStudio'da belirtilen yoldaki sorgu çalışıyor, sorguyu terminal günlüğüne çıkardım ve ardından SQLiteStudio'da sorunsuz bir şekilde kopyalayıp çalıştırdım.
Sonuç hakkında yazacağım.
Veritabanına çok iş parçacıklı yazmayı test edin, betiğin birden fazla kopyasını çalıştırın, her kopya expert_id parametresiyle etiketlenebilir.
Her şey doğru şekilde yazılıyor:
Ancak bloklama ile ilgili hatalar alıyorum:
Nasıl olmalı? Hata döndürmeden koşullu kayıt ekleme mekanizması olmalıdır.
Sorgu çalışmalıdır, yolların doğru olduğundan emin olun
1. Kontrol edildi ATTACH DATABASE çalışıyor!
Sorun şu şekildeydi, RAM'de oluşturulan tabana eklemeye çalıştım, bu durumda fiziksel taban ATTACH DATABASE çalışmıyor, ancak RAM tabanını fiziksel tabana eklersek çalışıyor!
Bu, RAM'de tabanın bir kopyasını oluşturmam için oldukça yeterli, bu da hesaplamaları hızlandırıyor)))
2. Daha ileri gitmeye karar verdim. ve bir olasılığı daha kontrol etmeye karar verdim:
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS M;
Fikre göre, veritabanı RAM'de oluşturulmalı ve iş parçacığı kapatıldıktan sonra varlığı sona ermelidir, ancak davranışı farklıdır ...
1'de, herhangi bir MQL5 programından, Uzman Danışmanından, göstergeden, komut dosyasından, hizmetten katılabilirim,
2'de, içindeki veriler yeniden başlatıldıktan sonra bile sonsuza kadar kaydedilir, zaten düşündüm ... belki de veritabanı fiziksel olarak oluşturulmuştur, ancak *memdb1* adıyla yapılan bir aramahiçbir şey bulamadı
Not: Belki de tabanı göstergeden oluşturduğum ve ortak bir iş parçacığında çalıştığı içindir?
Bu harika bir özellik, ancak bir sonraki güncellemelerde ve bu konudaki mesajımdan sonra terminalde kalıp kalmayacağını bilmek istiyorum: )))).
Bu durumda, programlar arasında büyük miktarda veriyi sorunsuz ve gecikmesiz olarak kolayca aktarabilir ve ad uzunluğu ile sınırlı global değişkenleri kullanmazsınız....
Bu uygulamada MQL5 programı bittikten sonra silinir:
ATTACH DATABASE ':memory:?cache=shared' AS M;
ATTACH DATABASE ':memory:' AS M;
İyi günler!
MT geliştiricilerine soru, SQLite kütüphanesinin Paylaşılan özelliğini devre dışı bırakmak mümkün mü, diğer projelerdeki deneyimlerle bunun hatanın nedeni olduğu belirlendi: veritabanı hatası , veritabanı kilitli.
Veritabanına farklı iş parçacıklarından erişiyorsanız, veritabanının kendi düzeyinde, yani veritabanını açtıktan hemen sonra bu iki sorguyu çalıştırarak çözülür:
1. PRAGMA journal_mode = WAL;
2. PRAGMA busy_timeout = 1000;
ancak kilitleme hatası yalnızca tabanı Paylaşılmayan yaptıktan sonra ortadan kalkacaktır , bunu sorgularla yapamazsınız .
Eğer veritabanına farklı iş parçacıklarından erişim varsa, bu sorun veritabanının kendi seviyesinde, yani veritabanı açıldıktan hemen sonra bu iki sorgunun çalıştırılmasıyla çözülür:
1. PRAGMA journal_mode = WAL;
2. PRAGMA busy_timeout = 1000;
ancak kilitleme hatası yalnızca tabanı Paylaşılmayan yaptıktan sonra ortadan kalkacaktır , bunu sorgularla yapamazsınız .
Bu durumda sorguların hızı düşecek ve bellek gereksinimleri artacaktır....
ama her şey yolunda :-)
SQLite bir iş parçacığı ya da bir yazar ve birçok okuyucu için tasarlanmıştır. Birçok yazar bu konuda değil, bu konuda "hafif" olmayan diğer üsler.
Bu MQL ile ilgili değil - bu sadece gerçekten ve her yerde olduğu gibi.