Re[52]: MS забило на дотнет. Питону - да, сишарпу - нет?
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.09.21 04:00
Оценка: :)
Здравствуйте, vdimas, Вы писали:


S>>А там, где встречаются, разработчики знают, зачем их применяют, и не будут делать конверсию на том конце, который сделает её медленнее.


V>На "том конце" выгодней использовать In32 или даже UIn32, в случае которого опять боксинг, согласно приведённого кода.

Непонятное утверждение. Если нам на приёмном конце удобнее иметь Int32, то делаем int a = d.GetInt16().
Если программист намеренно сделал в базе поле int16, но читает его через int a = d.GetInt32(), то он сам себе дебил.

V>>>Ну так из приемного буфера (который уже managed) — в MemoryRecordBuffer, а оттуда в датасет или в поля объектов какого-нить ORM.

S>>Вот не вижу этого момента "из приёмного буфера".
V>Я приводил и сниппеты и ссылки дотнетного ODBC-драйвера, вернись да посмотри.
Дотнетный ODBC драйвер никакого отношения к MemoryRecordBuffer не имеет. С чего вы взяли, что ODBC драйвер как-то применяется при заполнении MemoryRecordBuffer.


V>В которых всё не лучше:

V>https://github.com/mysql/mysql-connector-net/blob/502d718bed8ca9cf81a3a0397574f24ec41b25ba/MySQL.Data/src/datareader.cs#L619
V>
V>   public override Int32 GetInt32(int i)
V>    {
V>      IMySqlValue v = GetFieldValue(i, true);
V>      if (v is MySqlInt32)
V>        return ((MySqlInt32)v).Va

V>      return (Int32)ChangeType(v, i, typeof(Int32));
V>    }
V>

Ну, это же MySQL. Его задача — "чтобы хоть как-то работало".

V>Речь о том, как по-факту.

Ну, вы только что несли чушь про то, что все пользуются ODBC драйвером потому, что не существует OLE DB.
По факту оказалось, что для всех мало-мальски известных СУБД написан менеджед-драйвер.
То, что он неэффективен — заслуга авторов драйвера, а не команды из Редмонда.

V>OLEDB проще, т.к. это некая объектная модель на основе COM.

И?

V>Вот OLEDB именно так и устроен с ценой одного виртуального вызова на одно чтение одного поля.

Точно одного? Вы смотрели в исходники OLE DB драйверов? Снаружи-то и у дотнета один виртуальный вызов на чтение одного поля.

V>Речь о кач-ве этой обертки.

Речь о том, что эта обёртка вообще не нужна.

V>Это локальная база, в основном.

Ну, так как раз для неё и нужно, в основном, выжимать такты.

V>Лень смотреть еще и на Postgre-дрова, но вот для MySQL ссылку привёл — мрак.



V>>>Я говорил как оно есть по-факту, а ты рассуждаешь как оно могло бы быть, если бы все в мире действовали самым разумным способом.

S>>Как видим, все действуют именно так, как я говорю.

V>Ложь.

V>Причём, ложь глупая, игнорующая реальность.
В смысле "ложь"? Вы только что рассказывали, что все пользуются генерик ODBC драйвером, и вынуждены жить с его плохим качеством. По факту, оказалось, что всё ровно так, как я говорил — для основных СУБД существует родной дотнетный драйвер.

V>Нет, не страдает.

Ну конечно же страдает. Как вы думаете, что будет делать OLE DB, если я привяжу поле типа Int16 к буферу типа Int32? Ну, боксинга, наверное, не будет. Но тем не менее, будут преобразования на стороне драйвера, которые потребуют лишних затрат.

V>Страдаешь ты непонимаем той простой вещи, что зачитка данных и вообще задачи драйвера БД — это такие же задачи как сериализации-десериализации.


V>И что если (допустим) кто-то где-то навертел слои абстракций, то и обходить их надо как принято — через IoC.


V>Сравни poll-метод в случае "матрёшки" абстракций:


V>
V>class Layer1Obj {
V>    public virtual int GetInt32(int index) {}
V>}

V>class Layer2Obj {
V>    Layer1Obj _obj1;

V>    public virtual int GetInt32(int index) {
V>        return _obj1.GetInt32(int index);
V>    }
V>}

V>...

V>class Layer10Obj {
V>    Layer9Obj _obj9;

V>    public virtual int GetInt32(int index) {
V>        return _obj9.GetInt32(int index);
V>    }
V>}
V>

V>Сравнить надо с принятым в OLEDB подходом с акцессорами, когда акцессоры устанавливаются на текущий recordset и вызываются одной командой.

V>В дотнете такой подход можно сравнить с подпиской на события:

V>
V>class Layer10Obj {
V>    Layer9Obj _obj9;

V>    public event SomeEventSignature SomeEvent {
V>        add { _obj9 += value; }
V>        remove { _obj9 -= value; }
V>    }
V>}
V>

V>IoC-подход "прошивает" слои абстракции (бо сам OLEDB — уже абстракция).
Очень отдалённая абстракция, т.к. "Аксессор" в OLE DB — это всего лишь описание маппинга в некоторой структуре. Т.е ответственность за преобразования типов тоже лежит на драйвере.
Это перечёркивает любые шансы на то, что обращение к данным превратится в "чтение по смещению" без копирования.


V>Банальную задачу сериализации/десериализации ни сформулировать не могут, ни решить.



V>Как ни крути, но в плане доступа к БД над дотнетом как проклятие висит.

V>Днище.
Ну, коллега — это же золотое дно! Напишите вменяемый драйвер для MySQL, да продайте ораклу за пару сотен тыщ.


S>>Если мы захотим сделать что-то более оптимальное, чем дефолтный драйвер поверх универсального коннектора типа OLE DB или ODBC, то придётся погрузится вот в эти подробности.


V>Ой, уже страшно...

V>Аж протокол распарсить...
V>Неподъёмного веса задача. ))
V>Ты хоть себя слышишь?
Я-то да, а вот у вас явно с усвоением проблемы. Дело не в сложности задачи, а в том, что протокол у каждого свой. И способ получения буфера, и лэйаут в этом буфере, и способы передачи метаданных.
Поэтому никакого особенно общего кода там не будет.


S>>По факту там внутри — массив структур.

V>Опять глупая ложь. ))
Хорошо. Массив указателей на структуры.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.