<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@ed_gibbs</title><author><name>@ed_gibbs</name></author><id>https://teletype.in/atom/ed_gibbs</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/ed_gibbs?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@ed_gibbs?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ed_gibbs"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/ed_gibbs?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-09T12:59:56.239Z</updated><entry><id>ed_gibbs:restful-xmysql</id><link rel="alternate" type="text/html" href="https://teletype.in/@ed_gibbs/restful-xmysql?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ed_gibbs"></link><title>RESTful MySql</title><published>2020-11-26T13:22:55.871Z</published><updated>2020-12-08T06:09:22.051Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/91/3e/913ed2c2-44ac-4829-bbfa-ec1d8c1756e6.png"></media:thumbnail><category term="c" label="C#"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/f5/d5/f5d57704-6dc3-4ab7-874b-72bd44f1764e.jpeg&quot;&gt;C# for ZennoPoster</summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f5/d5/f5d57704-6dc3-4ab7-874b-72bd44f1764e.jpeg&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;a href=&quot;https://t.me/joinchat/AAAAAEXzi9byc9ZFlE8bxw&quot; target=&quot;_blank&quot;&gt;C# for ZennoPoster&lt;/a&gt;&lt;/p&gt;
  &lt;h3&gt;0. What the fuck your RESTful hm.. ?&lt;/h3&gt;
  &lt;p&gt;Представим себе любое веб приложение. Как взаимодействовать с ним все мы знаем и умеем? Конечно же с помощью основных &lt;strong&gt;HTTP &lt;/strong&gt;методов &lt;strong&gt;GET/POST&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Наверняка многие уже знают или слышали про методы такие как &lt;strong&gt;PUT/DELETE/PATCH &lt;/strong&gt;и так далее.&lt;/p&gt;
  &lt;p&gt;Принцип не отличается от известных всеми &lt;strong&gt;GET/POST&lt;/strong&gt;, где&lt;/p&gt;
  &lt;blockquote&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;em&gt;- получить &amp;quot;контент&amp;quot;&lt;/em&gt;&lt;/blockquote&gt;
  &lt;blockquote&gt;&lt;strong&gt;POST&lt;/strong&gt; - &lt;em&gt;отправить &amp;quot;контент&amp;quot;&lt;/em&gt;&lt;/blockquote&gt;
  &lt;blockquote&gt;&lt;strong&gt;DELETE&lt;/strong&gt; - &lt;em&gt;удал.....&lt;/em&gt;&lt;/blockquote&gt;
  &lt;blockquote&gt;&lt;strong&gt;PUT &lt;/strong&gt;- &lt;em&gt;обнов....&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p&gt;Если подсознательно дополнил определения, поздравляю, ты уже разобрались в принципе &lt;strong&gt;RESTful&lt;/strong&gt;. Это тот же HTTP, где позиция метода запроса определяет поведение приложения.&lt;/p&gt;
  &lt;p&gt;Иначе говоря &lt;strong&gt;RESTful &lt;/strong&gt;представление позволяет нам к примеру обновлять записи путем простого указания &lt;strong&gt;PUT &lt;/strong&gt;в запросе, удалять посредством &lt;strong&gt;DELETE. &lt;/strong&gt;&lt;/p&gt;
  &lt;h3&gt;1. Introduce&lt;/h3&gt;
  &lt;p&gt;Общие черты основного принципа &lt;strong&gt;RESTful &lt;/strong&gt;вспомнили. На примере точно вспомните, наверняка взаимодействовали уже ранее с данным представлением.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Все то что многие так долго искали, а кто-то просто хотел, но не мог сформулировать.&lt;/p&gt;
  &lt;p&gt;Пришло время научится делать из любой mysql базы полноценную &lt;strong&gt;RESTFful &lt;/strong&gt;прослойку и да она будет работать по &lt;strong&gt;HTTP &lt;/strong&gt;протоколу. Даже не придётся в очередной раз гуглить, лезть на форума при составлении SQL запроса, а вспомните сколько ужаса связанного с экранированием спец символов и тому подобное.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3&gt;2. Getting Started&lt;/h3&gt;
  &lt;p&gt;Решение является кроссплатформенным, заведётся как на OS Windows, так и на unix-подобных системах с установленной &lt;strong&gt;node &lt;/strong&gt;(&lt;em&gt;requires node &amp;gt;= 7.6.0&lt;/em&gt;).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;1) Убедимся что у нас стоит пакет &lt;a href=&quot;https://nodejs.org/en/download/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;node&lt;/strong&gt;&lt;/a&gt; (&lt;a href=&quot;https://nodejs.org/en/download/&quot; target=&quot;_blank&quot;&gt;https://nodejs.org/en/download/&lt;/a&gt;), и работает &lt;strong&gt;npm &lt;/strong&gt;менеджер пакетов (ставиться вместе с &lt;strong&gt;node&lt;/strong&gt;).&lt;/p&gt;
  &lt;p&gt;После установки Открываем &lt;u&gt;новое окно&lt;/u&gt; терминала&lt;/p&gt;
  &lt;pre&gt;C:\&amp;gt; node -v
v12.18.4

C:\&amp;gt; npm -v
6.14.8
&lt;/pre&gt;
  &lt;p&gt;2) Установим пакет &lt;a href=&quot;https://github.com/o1lab/xmysql&quot; target=&quot;_blank&quot;&gt;xmysql &lt;/a&gt;который будет делать магию. (&lt;a href=&quot;https://github.com/o1lab/xmysql&quot; target=&quot;_blank&quot;&gt;офф репозиторий&lt;/a&gt;)&lt;/p&gt;
  &lt;p&gt;Запустим терминал/консоль (&lt;u&gt;с правами Администратора&lt;/u&gt;)&lt;/p&gt;
  &lt;pre&gt;C:\&amp;gt; npm install -g xmysql&lt;/pre&gt;
  &lt;p&gt;Если не увидели ошибок, можем приступать.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p data-align=&quot;right&quot;&gt;У кого разбор полетов, следуйте на страничку репозитория проекта, изучите решения или задайте вопрос разработчику (https://github.com/o1lab/xmysql)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;3) Ну и конечно же нам нужна рабочая &lt;strong&gt;mysql &lt;/strong&gt;бд.&lt;/p&gt;
  &lt;p&gt;Я буду использовать локальную версию &lt;strong&gt;MariaDB 10.3.26&lt;/strong&gt;. Вы можете любую какая вам по душе.&lt;/p&gt;
  &lt;pre&gt;C:\&amp;gt; xmysql&lt;/pre&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/4964e75761c0793a8dce7.png&quot; width=&quot;1088&quot; /&gt;
    &lt;figcaption&gt;run xmysql  [3]&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p&gt;4) Пропишем в параметрах наши значения для подключения к базе данных и укажем имя базы данных с которой будем работать&lt;/p&gt;
  &lt;pre&gt;C:\&amp;gt; xmysql -h localhost -u root p &amp;quot;&amp;quot; -d open_disposable_base&lt;/pre&gt;
  &lt;p&gt;Убедитесь что у вас не занят порт 3000, и добавьте в исключение при первом запуске сработает брандмауэр windows.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/34adf0cbe859e834c2ac6.png&quot; width=&quot;748&quot; /&gt;
    &lt;figcaption&gt;start xmysql on local db [4]&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p&gt;5) Проверим локальный адрес по порту 3000, на нем должен подняться RESTful HTTP нашей базы (по умолчанию &lt;a href=&quot;http://localhost:3000/&quot; target=&quot;_blank&quot;&gt;http://localhost:3000&lt;/a&gt;)&lt;/p&gt;
  &lt;p&gt;Попробуем отправить запрос по этому адресу&lt;/p&gt;
  &lt;blockquote&gt;p.s. можно также просто отрыть в браузере &lt;a href=&quot;http://localhost:3000/&quot; target=&quot;_blank&quot;&gt;http://localhost:3000&lt;/a&gt;&lt;/blockquote&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/a561cae3572f4ee4be017.png&quot; width=&quot;690&quot; /&gt;
    &lt;figcaption&gt;curl query get routes [5]&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;На корневой странички увидим все доступные пути &lt;strong&gt;routing &lt;/strong&gt;и методы взаимодействия &lt;strong&gt;RESTful &lt;/strong&gt;(&lt;u&gt;какой метод использовать&lt;/u&gt; в &lt;strong&gt;HTTP&lt;/strong&gt; запросах)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;На данном этапе мы настроили и запустили все необходимое.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;!!!!Однако будьте внимательны!!!!! &lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;Если запустите на выделенном сервере и не позаботитесь о доступе по &lt;strong&gt;&lt;u&gt;порту 3000&lt;/u&gt;&lt;/strong&gt;, скорее всего любой желающий &lt;strong&gt;&lt;u&gt;сможет получить данные с базы&lt;/u&gt;&lt;/strong&gt;, или куда похуже через методы &lt;strong&gt;upload/download.&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;&lt;code&gt;Решения легко найти в google. Вариантов довольно много. От парольного доступа до исключения на сетевом уровне.&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3&gt;3. Query processing&lt;/h3&gt;
  &lt;p&gt;Разберем пару примеров, попробуем на что способен этот зверь =)&lt;/p&gt;
  &lt;pre&gt;Модель построения запросов &lt;/pre&gt;
  &lt;p&gt;host:port/api/[&lt;strong&gt;table_name&lt;/strong&gt;]/?[&lt;strong&gt;method]&lt;/strong&gt;&lt;/p&gt;
  &lt;pre&gt;Модель построения запросов с перечислением параметров&lt;/pre&gt;
  &lt;p&gt;host:port/api/[&lt;strong&gt;table_name&lt;/strong&gt;]/?[&lt;strong&gt;method]&lt;/strong&gt;=([&lt;strong&gt;param1]&lt;/strong&gt;,[&lt;strong&gt;param2]&lt;/strong&gt;..)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p data-align=&quot;right&quot;&gt;&lt;em&gt;Полный список &lt;a href=&quot;https://github.com/o1lab/xmysql#api-overview&quot; target=&quot;_blank&quot;&gt;https://github.com/o1lab/xmysql#api-overview&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/4f4d0fc124f1df0826e58.gif&quot; width=&quot;1064&quot; /&gt;
    &lt;figcaption&gt;List of method api&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;hr /&gt;
  &lt;ul&gt;
    &lt;li&gt;Просмотр содержимого таблицы (аналогия запроса ниже)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;em&gt;&lt;code&gt;sql select * from &amp;#x60;open_disposable_base&amp;#x60; limit 0,20&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;blockquote&gt;GET /api/disposable_emails/&lt;/blockquote&gt;
  &lt;pre&gt;[
  {
    &amp;quot;id&amp;quot;: 1482,
    &amp;quot;domain&amp;quot;: &amp;quot;ce.mintemail.com&amp;quot;,
    &amp;quot;created_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;updated_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;deleted_at&amp;quot;: null
  }
]&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Получить кол-во в таблице.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote&gt;GET /api/disposable_emails/count &lt;/blockquote&gt;
  &lt;pre&gt;[
  {
    &amp;quot;no_of_rows&amp;quot;: 663
  }
]&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;p&gt;Пример передачи параметров:&lt;/p&gt;
  &lt;p&gt;/&lt;strong&gt;findOne&lt;/strong&gt;?_where=([&lt;strong&gt;Column&lt;/strong&gt;],[&lt;strong&gt;Operator&lt;/strong&gt;],[&lt;strong&gt;SearchValue&lt;/strong&gt;])&lt;/p&gt;
  &lt;p&gt;[&lt;strong&gt;SearchValue&lt;/strong&gt;] = &lt;u&gt;ce.mintemail.com &lt;/u&gt;-искомое значение&lt;/p&gt;
  &lt;p&gt;[&lt;strong&gt;Column&lt;/strong&gt;] = &lt;u&gt;domain &lt;/u&gt; - имя столбца&lt;/p&gt;
  &lt;p&gt;[&lt;strong&gt;Operator&lt;/strong&gt;] = &lt;u&gt;eq&lt;/u&gt; - эквивалентно (&lt;a href=&quot;https://github.com/o1lab/xmysql#comparison-operators&quot; target=&quot;_blank&quot;&gt;полный список&lt;/a&gt;)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;ul&gt;
    &lt;li&gt;Поиск записи по указанному столбцу&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote&gt;GET /api/disposable_emails/findOne?_where=(domain,eq,ce.mintemail.com)&lt;/blockquote&gt;
  &lt;pre&gt;[
  {
    &amp;quot;id&amp;quot;: 1482,
    &amp;quot;domain&amp;quot;: &amp;quot;ce.mintemail.com&amp;quot;,
    &amp;quot;created_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;updated_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;deleted_at&amp;quot;: null
  }
]&lt;/pre&gt;
  &lt;ul&gt;
    &lt;li&gt;Фильтрация по столбцам, перечисляем через запятую имена столбцов. Также инверсионный вариант с добавлением “-” перед именем.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote&gt;GET /api/disposable&lt;em&gt;emails/?&lt;/em&gt;fields=id,domain&lt;/blockquote&gt;
  &lt;pre&gt;[
  {
    &amp;quot;id&amp;quot;: 1481,
    &amp;quot;domain&amp;quot;: &amp;quot;cbair.com&amp;quot;
  },
  {
    &amp;quot;id&amp;quot;: 1482,
    &amp;quot;domain&amp;quot;: &amp;quot;ce.mintemail.com&amp;quot;
  }&lt;/pre&gt;
  &lt;blockquote&gt;GET /api/disposable&lt;em&gt;emails/?&lt;/em&gt;fields=-domain&lt;/blockquote&gt;
  &lt;pre&gt;[
  {
    &amp;quot;id&amp;quot;: 1481,
    &amp;quot;created_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;updated_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;deleted_at&amp;quot;: null
  },
  {
    &amp;quot;id&amp;quot;: 1482,
    &amp;quot;created_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;updated_at&amp;quot;: &amp;quot;2018-05-31T01:25:56.000Z&amp;quot;,
    &amp;quot;deleted_at&amp;quot;: null
  }&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;ul&gt;
    &lt;li&gt;Создаем пагинацию (полезно при очень больших таблицах)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote&gt;GET /api/disposable&lt;em&gt;emails/?&lt;/em&gt;fields=domain&amp;amp;_p&lt;em&gt;p=1&amp;amp;&lt;/em&gt;ze=3&lt;/blockquote&gt;
  &lt;pre&gt;[
  {
    &amp;quot;domain&amp;quot;: &amp;quot;cheaphorde.com&amp;quot;
  },
  {
    &amp;quot;domain&amp;quot;: &amp;quot;chef.asana.biz&amp;quot;
  },
  {
    &amp;quot;domain&amp;quot;: &amp;quot;chielo.com&amp;quot;
  }
]&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;ul&gt;
    &lt;li&gt;Также стоит отметить возможность работы с файлами. Upload, Download, в параметрах xmysql есть флаг указания каталога для файлов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;ul&gt;
    &lt;li&gt;В документации описан также метод  Dynamic queries, эта возможность присутствует в случае локального mysql сервера.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote&gt;POST /dynamic  &lt;/blockquote&gt;
  &lt;pre&gt;    {
        &amp;quot;query&amp;quot;: &amp;quot;select * from ?? limit 1,20&amp;quot;,
        &amp;quot;params&amp;quot;: [&amp;quot;customers&amp;quot;]
    }&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3&gt;4. Work in ZP, try multitread inserts&lt;/h3&gt;
  &lt;p&gt;На коленке написал минимальный код, для быстрого теста и попробовать многопоточную вставку. Общий принцип как начать внедрять в свои проекты xmysql.&lt;/p&gt;
  &lt;pre&gt;string xsqlHost = &amp;quot;http://localhost&amp;quot;;   // xmysql hostname or IP
string xsqlPort = &amp;quot;3000&amp;quot;;
string xsqlTable = &amp;quot;test_multithread&amp;quot;;  // Table name

string xsqlBase = string.Concat(xsqlHost, &amp;quot;:&amp;quot;, xsqlPort);  // base path for query
string xsqlGetTable = string.Concat(xsqlBase, &amp;quot;/api/&amp;quot;, xsqlTable);   // path to query for table

var xsqlHelth = new HttpRequest().Get(xsqlBase+&amp;quot;/_health&amp;quot;).ToString();  // check avalible and status mysql
project.SendInfoToLog(xsqlHelth);

var xsqlRoutes = new HttpRequest().Get(xsqlBase).ToString();  // parse all avalible routes 
project.Json.FromString(xsqlRoutes);  // show routes with methods in zp varibles (json)&lt;/pre&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f2/3c/f23cb5de-6f4c-4109-b37a-451dd43e87c5.gif&quot; width=&quot;1351.2582972582973&quot; /&gt;
    &lt;figcaption&gt;Project Maker sample&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Плавненько подходим к концовке. Читать данные хорошо, но что же с записью/изменению/обновлению? &lt;/p&gt;
  &lt;p&gt;Произвели пару тестов, в окружении локально поднятой базой, для общей оценки и применения xmysql при работе в многопоточном режиме.&lt;/p&gt;
  &lt;p&gt;Схема заполняемой таблицы выглядело примерно след. образом:&lt;/p&gt;
  &lt;pre&gt;CREATE TABLE &amp;#x60;test_multithread&amp;#x60; (
  &amp;#x60;id&amp;#x60; int(11) NOT NULL AUTO_INCREMENT,
  &amp;#x60;domain&amp;#x60; varchar(255) NOT NULL,
  &amp;#x60;add_date&amp;#x60; timestamp DEFAULT CURRENT_TIMESTAMP
  PRIMARY KEY (&amp;#x60;id&amp;#x60;)
) ENGINE=InnoDB AUTO_INCREMENT=5958 DEFAULT CHARSET=utf8;&lt;/pre&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Из списка загружались домены, причем умышленно по одному, и аналогично происходила вставка по одному INSERT.&lt;/p&gt;
  &lt;blockquote&gt;Так делать не желательно, в xmysql помимо add row есть и пакетные обработки CREATE, LIST,  DELETE. Прошу заметить, средствами слоя xmysql параметры переданные в теле POST запроса преобразуются в стандартный пакетный INSERT. &lt;/blockquote&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Первый тест обычными циклами средствами zp, 2 кубика, один из них шлет POST с параметром &amp;quot;domain=test.com&amp;quot;&lt;/p&gt;
  &lt;figure class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ee/55/ee55d395-010e-47a6-9e7b-b52959648dd3.gif&quot; width=&quot;1269&quot; /&gt;
    &lt;figcaption&gt;Multithread add (25 threads)&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Второй тест с использованием Threading.Tasks.Parallel.For&lt;/p&gt;
  &lt;p&gt;Для понимания кусок кода который отрабатывал указанное кол-во циклов параллельно&lt;/p&gt;
  &lt;pre&gt;var listparams = project.Lists[&amp;quot;domains_becnh&amp;quot;];

System.Threading.Tasks.Parallel.For(0, icount, (i, parallelLoopState) =&amp;gt; {
  string domain = listparams[0];
  listparams.RemoveAt(0);
  using (var request = new HttpRequest())
{
    var reqParams = new RequestParams();
    reqParams[&amp;quot;domain&amp;quot;] = domain;

    string addRow = request.Post(xsqlGetTable, reqParams).ToString();
}
return;
});&lt;/pre&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c6/ff/c6ff3064-fc6a-4f1b-8d11-5cfc35f0fcb2.gif&quot; width=&quot;1240&quot; /&gt;
    &lt;figcaption&gt;Parallel Task  rows add&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;В конечном итоге протестировать удалось далеко еще не все.&lt;/p&gt;
  &lt;p&gt;Однако как видите, даже по одиночной вставке работает более чем.&lt;/p&gt;
  &lt;p&gt;Скорость вставки в моем случае следующие:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;500 строк 25 потоками  =  500 rows added in &lt;em&gt;7110,4820ms&lt;/em&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;Используя параллельные потоки (parallels threads):&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;100 &lt;/strong&gt;rows added in &lt;em&gt;205,8456ms&lt;/em&gt; (  &lt;strong&gt;&lt;u&gt;2,1 second&lt;/u&gt;&lt;/strong&gt; ) &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;500 &lt;/strong&gt;rows added in &lt;em&gt;4619,1725ms &lt;/em&gt;(  &lt;strong&gt;&lt;u&gt;4,6 second&lt;/u&gt;&lt;/strong&gt; ) &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;1000 &lt;/strong&gt;rows added in &lt;em&gt;7503,2164ms  &lt;/em&gt;(  &lt;strong&gt;&lt;u&gt;7,5 second&lt;/u&gt;&lt;/strong&gt; ) &lt;/li&gt;
  &lt;/ol&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;blockquote&gt;p.s. судя по минимальному просмотру исходного кода xmysql, я не углядел работу с транзакциями и т.д. Данный вопрос оставил на потом. Убедитесь в отсутствие необходимости локов на уровне бд если вам будет необходимо много удалять строк и тд. Надеюсь там все хорошо в этом плане, в любом случае попробуйте перед тем как бежать переносить все на xmysql.&lt;/blockquote&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Проект неплохо вдохновил на интересные идеи и решения. Так-же есть куча альтернативных решений, в целом личное мнение xmysql вполне способен на роль вспомогательную в проектах. Но в в идеале нужно обертку. Вполне возможно в скором времени она появится...&lt;/p&gt;
  &lt;hr /&gt;
  &lt;hr /&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p data-align=&quot;right&quot;&gt;Следите за новостями, прокачивайте умы -  &lt;a href=&quot;https://t.me/joinchat/AAAAAEXzi9byc9ZFlE8bxw&quot; target=&quot;_blank&quot;&gt;C# for ZennoPoster&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>