Страницы: 1
делаю приложение которое предполагает работу с данными, в качестве хранилища естественно выбрал sqllite, но столкнулся с проблемой дело в том что мне нужно делать множественные insert & select в базу
но если с селектом дело нормально обстоит то вот с инсертом вообще никак, точнее с множественным инсертом
вот например инсерт одной записи
INSERT INTO test VALUES ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81')
работает нормально, а вот вставка нескольких строк
INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'), ('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')
не работает
ведь должно работать, вроди как, а не хочет
что я делаю не так?
Отредактировано bidlocoder (06-06-2011 02:19:55)
Отсутствует
не работает
1. Как не работает? Вызывает краш FF? Вызывает BSOD? Выбрасывает эксепшн? Просто не видно новых данных?
2. Вставляйте новые данные, особенно если их больше 1-й записи, так, как это обычно принято делать: явно открывайте транзакцию, используйте параметризированные statements, по завершении явно выдавайте commit/rollback. Кстати, для пакетной обработки нескольких statements у обертки sqlite в FF есть спец. метод mozIStorageConnection.executeAsync. Метод, как это следует из его названия, асинхронный.
Отредактировано hydrolizer (06-06-2011 02:59:06)
Отсутствует
вызывает эксепшн, ругается на синтаксис запроса
вот что пишет:
1)если запускаю в sqlLite Manager
SQLiteManager: Likely SQL syntax error: INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')
Exception Name: NS_ERROR_FAILURE
Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]
2)если с приложения
[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: chrome://executejs/content/executejs/executeJS.js :: <TOP_LEVEL> :: line 235" data: no]
Отредактировано bidlocoder (06-06-2011 03:01:01)
Отсутствует
вот что пишет:
Ну так у вас же
Выделить кодКод:
INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'), ('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')
Не знаю, откуда вы взяли такой синтаксис вставки нескольких записей, но он явно не ANSI-шный, и поэтому вовсе не обязан работать в sqlite. ANSI-стандарт предполагает только 2 варианта использования insert: для одиночной записи -
insert into table_name [(columns_list)] values(values_list)
insert into table_name [(columns_list)] select ...
Отсутствует
я уже пробовал, получается ну ОООООчень медленно(((
цикл 50 итераций около 10 сек
Отредактировано bidlocoder (06-06-2011 03:06:09)
Отсутствует
bidlocoder
Вставка 10 000 значений - меньше, чем за 1 секунду (и отнюдь не на мощном компьтере):
const { classes: Cc, interfaces: Ci, utils: Cu } = Components; try { var dbFile=Services.dirsvc.get("ProfD", Ci.nsILocalFile); dbFile.append("foo.sqlite"); var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService); var mDBConn = ssvc.openDatabase(dbFile); try{ mDBConn.executeSimpleSQL("drop table foo"); } catch(err){} mDBConn.executeSimpleSQL("create table foo(n integer)"); var insertStatements=[]; var insertSQL="insert into foo values(:n)"; for(var i=0;i<10000;i++) { var statement=mDBConn.createStatement(insertSQL); statement.params.n=i; insertStatements.push(statement); } var startTime=new Date().getTime(); mDBConn.beginTransaction(); mDBConn.executeAsync(insertStatements, insertStatements.length, { handleError: function(aError) { Services.console.logStringMessage(aError.message); }, handleCompletion: function(aReason) { if (aReason!=0) { Services.console.logStringMessage("executeAsync finished with reason: "+aReason); return; } mDBConn.commitTransaction(); Services.console.logStringMessage("insert completed in " +(new Date().getTime()-startTime)+"msec"); mDBConn.asyncClose(function() { Services.console.logStringMessage("connection closed"); }); }, handleResult: function(aResultSet) {} }); } catch(err) { Services.console.logStringMessage(err+"\n"+err.stack); }
(точнее - ~250 мсек. на селероне 1.86 ГГц с 1 Мб ОЗУ).
Отсутствует
Стало самому интересно насчет скорости - набросал и прогнал тесты для вставки 10 000 строк в разных вариантах. Тесты выложены здесь: http://pastebin.mozilla-russia.org/108842 (не стал приводить код в теме, т.к. кода достаточно много). Варианты по ссылке:
executeAsync - асинхронное выполнение параметризованного insert в транзакции (я немного изменил код, там параметризация делается через массив параметров)
executeSync - синхронное выполнение непараметризованного insert без транзакции
executeSyncX - синхронное выполнение непараметризованного insert в транзакции
executeSyncXX - синхронное выполнение параметризованного insert без транзакции
executeSyncXXX - синхронное выполнение параметризованного insert в транзакции.
Места распределились так:
1-е место по скорости отработки - асинхронное выполнение параметризованного insert в транзакции (меньше 100 мсек)
2-е место - синхронные варианты в транзакции (~250-300 мсек)
3-е место - варианты без транзакции. Есть ли разница в наличии параметризации, или нет, я так и не смог узнать, т.к. не хватило терпения дождаться окончания отработки каждого из них. Ждал минут по 10 точно.
Комментарии, думаю, излишни.
Отредактировано hydrolizer (06-06-2011 07:13:30)
Отсутствует
спасибо за дельный совет и приведенный код
разбираюсь что куда..............
Отсутствует
Страницы: 1