IoErr (10), сообщение = System.Data.SQLite.SQLiteException (0x800007FF): ошибка ввода-вывода диска в System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn
Обратите внимание, что я запускаю приложение-службу Windows, используя .NET Framework 4.6.2
и только изредка он получает эту ошибку:
2019-04-22 18:35:36.7727|ERROR|DataIntegrator.MyService|ERROR: code = IoErr (10), message = System.Data.SQLite.SQLiteException (0x800007FF): disk I/O error
disk I/O error
at System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous, UInt32 timeoutMS, String& strRemain)
at System.Data.SQLite.SQLiteCommand.BuildNextCommand()
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
at System.Data.SQLite.SQLiteHelper.Insert(String tableName, Dictionary`2 dic) in C:\Projects\DataIntegrator\DataIntegrator\DataAccessLayer\SQLiteHelper.cs:line 254
at System.Data.SQLite.Insert.InsertTag(Tag tag) in C:\Projects\DataIntegrator\DataIntegrator\DataAccessLayer\Query\Insert.cs:line 60
Вот мой код с ошибкой, происходящей в строке sh.Insert:
public static void InsertTag(Tag tag)
{
try
{
using (SQLiteConnection conn = new SQLiteConnection(Constants.DataSource))
{
using (SQLiteCommand cmd = new SQLiteCommand())
{
cmd.Connection = conn;
conn.Open();
SQLiteHelper sh = new SQLiteHelper(cmd);
var dic = new Dictionary<string, object>();
dic["Id"] = tag.Id;
dic["Item"] = tag.Item;
dic["Value"] = tag.Value;
dic["Source"] = tag.Source;
sh.Insert(Constants.TagTable, dic);
conn.Close();
}
}
}
catch (Exception ex)
{
LogError("ERROR: {0}", ex.ToString());
}
}
У кого-нибудь есть предложения? Вот еще несколько ссылок, которые я проверил, но пока не нашел решения:
SQLiteDiskIOException с кодом ошибки 10: ошибка ввода-вывода диска
Ошибка ввода-вывода диска sqlite3
https://dba.stackexchange.com/questions/93575/sqlite-disk-i-o-error-3850
https://github.com/linuxserver/docker-sonarr/issues/38
https://forums.sonarr.tv/t/disk-i-o-and-sqllite-error/5578
В последнем упоминается, что база данных повреждена, но когда я остановлю консольное приложение, я смогу открыть базу данных. Должен ли я использовать другую базу данных, такую как Berkeley DB, которая потенциально имеет лучшую производительность?
https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
ОБНОВИТЬ:
Добавлена ОС в теги
0 ответов
Обратите внимание, что изначально я использовал синхронный обработчик событий DataReceived, который вызывал частую загрузку ЦП и приводил к ошибкам дискового ввода-вывода:
private readonly SerialPort _port = null;
public MySerialPort(string comPortName)
{
ComPortName = comPortName;
_port = new SerialPort(ComPortName,
9600, Parity.None, 8, StopBits.One);
_port.DataReceived -= new
SerialDataReceivedEventHandler(port_DataReceived);
_port.Open();
}
private void port_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
if (!port.IsOpen) return;
for (int i = 0; i < port.BytesToRead; i++)
{
// process bytes
}
}
Чтобы повысить производительность и устранить ошибку диска ввода-вывода, я изменил использование асинхронного обработчика событий через базовый класс:
private readonly SerialPort _port = null;
public MySerialPort(string comPortName)
{
ComPortName = comPortName;
_port = new SerialPort(ComPortName,
9600, Parity.None, 8, StopBits.One);
_port.Open();
var rxData = Task.Run(async () => await ReceiveData());
// ...
}
public async Task<Stream> ReceiveData()
{
var buffer = new byte[4096];
int readBytes = 0;
using (MemoryStream memoryStream = new MemoryStream())
{
while ((readBytes = await _port.BaseStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, readBytes);
}
return memoryStream;
}
}
Для получения дополнительной информации, пожалуйста, смотрите
http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
а также