Эффективный доступ к различным СУБД из Delphi XE2
мой должен
я работаю с Delphi / C++Builder XE2.
мне нужно получить доступ хотя бы к этим DBMSs:
- Жар
- DB2 / 400
- SQL Server
- SAP HANA (новая БД в памяти, доступные интерфейсы: JDBC, ODBC, ODBO, SQLDBC)
мне нужно показать и отредактировать данные в визуальных элементах управления с учетом данных. данные могут находиться на любой из этих СУБД, я настройте свойства соединения и инструкции SQL во внешнем текстовом файле.
так я ищу набор компонентов для доступа к базам данных который поддерживает такие DBMSs и имеет хорошие спектакли, подобно старым таблицам парадоксов.
мои догадки
- использование производительности ODBC будет хуже, чем использование собственных драйверов. Если это правда, то как я могу преодолеть эту проблему?
- даже через ODBC, выступления для ханы в памяти DB будет большим (я не могу проверить его сейчас).
то, что я нашел до сих пор
-
BDE (Borland Database Engine) (
TDatabase
,TTable
...)устаревшие.
-
DBX (Embarcadero dbExpress) (
TSQLConnection
,TSQLTable
...)заменяет BDE, однонаправленные наборы данных (курсор идет только вперед; не буферизует данные в память, такой набор данных не может быть отображен в DBGrid; для построения пользовательского интерфейса с помощью dbExpress вам нужно будет использовать еще два компонента:
TDataSetProvider
иTClientDataSet
)использует собственные драйверы (нет для HANA) или ODBC.
-
FireDAC для (Компоненты Доступа К Данным Embarcadero Fire) (
TADConnection
,TADTable
...)это продолжение AnyDAC; использует собственные драйверы (нет для HANA) или ODBC или dbExpress.
-
Юнидак (Devart Универсальные Компоненты Доступа К Данным)
не бесплатно; использует собственные драйверы (нет для HANA) или ODBC или "DB Client".
-
DA (RemObjects Сведения Аннотация для Delphi)
не бесплатно.
-
ZDBC (Интерфейс Подключения К Базе Данных Zeos) (
TZConnection
,TZQuery
...)С открытым исходным кодом; запускается как порт JDBC для объекта Pascal; не обеспечивает привязку с визуальными элементами управления с учетом данных.
-
dbGo (Embarcadero dbGo) (
TADOConnection
,TADOTable
...)реализует ADO (следовательно, через OLE DB через ODBC). Имеет ряд причуд, например, с повторением одноименных параметров в запросах.
-
СП БДЭ (
TJvQuery
,TJvBDESQLScript
...)повышение корреспондентской стандартной библиотеки.
-
Доступ К Данным Jv (
TJvADODataset
,TJvADOQuery
...)повышение корреспондентской стандартной библиотеки.
(не стесняйтесь расширять этот список)
так что мой выбор среди:
- dbExpress или FireDAC: куда пойдет Embarcadero в будущее?
- dbGo: это ADO хороший выбор? Кажется, что он полагается на ODBC, так как насчет производительности?
- коммерческий продукт, такой как UniDAC или Аннотация данных: это необходимо? Может, так будет лучше?
5 ответов
Если вы используете XE2, я бы рекомендовал dbExpress.
- он поддерживает ODBC (но не для SAP HANA)
- однонаправленные наборы данных могут использоваться с ClientDataSet для кэширования. Фактически, ClientDataSets можно использовать для кэширования любого компонента dataset.
Если вы используете XE3 или более позднюю версию, я бы рекомендовал FireDAC.
- Embarcadero купил AnyDAC и переименовал его в FireDAC.
- Он входит в состав предприятия SKU и выше. Бесплатная загрузка доступна для лицензированных пользователей XE3.
- Я считаю, что это будет их стратегии доступа к данным в будущем. См.это недавнее сообщение в блоге.
Я понимаю, что FireDAC можно использовать с XE2, но я не уверен, есть ли какие-либо проблемы.
я решил провести небольшое исследование производительности: UniDAC (5.0.1) vs FireDAC (8.0.1), на Delphi XE3. Базы данных: Firebird, MySQL и SQL Server.
вот результаты выборки записей 150k (использование памяти рассматривалось как разница между до и после выборки).
Жар-птица:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT TIMESTAMP
)
UniDAC-0,909 секунды, съел 12 324 044 памяти
FireDAC-0,967 секунды, съел 282 179 668 памяти (я в шоке)
MySQL:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT DATETIME
)
UniDAC-0,363 секунды и 11 552 604 памяти
FireDAC-0,713 секунды и 49 375 108 памяти
SQL Server:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT DATETIME
)
UniDAC-0,391 секунды и 14 155 576 памяти
FireDAC-0,324 секунды и 51 775 844 памяти
все измеряется просто:
function MemoryUsed: Cardinal;
var
st: TMemoryManagerState;
sb: TSmallBlockTypeState;
begin
GetMemoryManagerState(st);
Result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;
for sb in st.SmallBlockTypeStates do
Result := Result + sb.UseableBlockSize * sb.AllocatedBlockCount;
end;
UniQuery1.SQL.Text := 'select * from test_perf';
UniQuery1.SpecificOptions.Values['FetchAll'] := 'True';
mem := MemoryUsed;
tc := Now;
UniQuery1.Open;
UniQuery1.Last;
tc := Now - tc;
mem := MemoryUsed - mem;
Memo1.Lines.Add('UniDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));
ADQuery1.SQL.Text := 'select * from test_perf';
ADQuery1.FetchOptions.Mode := fmAll;
mem := MemoryUsed;
tc := Now;
ADQuery1.Open;
ADQuery1.Last;
tc := Now - tc;
mem := MemoryUsed - mem;
Memo1.Lines.Add('FireDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));
если кто-то заинтересован, вот это тест приложения, вы можете добавить там сравнение производительности для ADO, dbExpress, ZeosLib и других, которые вас интересуют.
Я всегда использовать ADO-используется с SQLServer, Oracle, Sybase, PostGreSQL и другими. Вы можете найти поставщика ADO практически для любой базы данных. Никогда не было проблемы, которую я не мог решить с помощью небольшого исследования. Поскольку ADO так широко используется, большинство проблем хорошо известны. И UDL файлы могут сделать вашу жизнь намного проще.
но я никогда не использую компоненты Delphi ADO на палитре компонентов - либо я использую их в памяти, либо чаще сбрасываю результаты из ADO вызывает непосредственно в TKBMMemtable и полностью избегает Delphi "из коробки". Вы можете написать функцию утилиты, которая сделает это автоматически для вас.
Firedac-поставляется с Delphi, поэтому, вероятно, вам все равно придется заплатить за это. UNidac-быстрее, и пусть Вам не придется обновлять Delphi так часто,для того,чтобы обновить данные Acess, также если вы однажды решите пойти в Lazzarus, Вы тоже сэкономите много работы.
есть много неправильных представлений во многих потоках, поэтому я попытаюсь дать мои 2 цента.
Проблема в том, что мы, дельфийцы, привыкли думать в executables
, поэтому мы ищем способы перемещения данных (особенно когда наша база данных и сервер приложений размещены снаружи); эти сценарии никогда не будут бить RIA
приложение, потому что вы больше не перемещаете данные,а просто представление экрана.
Другое заблуждение говорит, что TDATASET
не работает с AJAX
.
Просто посмотрите некоторые UNIGUI
примеры youtube
. Кстати, я использую обычный DataSnap
С clientdataset
, а не ОРМ.