Тестовая компиляция идеи Intellij занимает слишком много времени (по сравнению с Eclipse)

Можно параметризовать каждый значение, таким образом, что-то как:

string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" };
string cmdText = "SELECT * FROM Tags WHERE Name IN ({0})";

string[] paramNames = tags.Select(
    (s, i) => "@tag" + i.ToString()
).ToArray();

string inClause = string.Join(", ", paramNames);
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) {
    for(int i = 0; i < paramNames.Length; i++) {
       cmd.Parameters.AddWithValue(paramNames[i], tags[i]);
    }
}

, Который даст Вам:

cmd.CommandText = "SELECT * FROM Tags WHERE Name IN (@tag0, @tag1, @tag2, @tag3)"
cmd.Parameters["@tag0"] = "ruby"
cmd.Parameters["@tag1"] = "rails"
cmd.Parameters["@tag2"] = "scruffy"
cmd.Parameters["@tag3"] = "rubyonrails"

нет, это не открыто для Внедрение SQL . Единственный введенный текст в CommandText не основан на вводе данных пользователем. Это только основано на hardcoded "@tag" префикс и индекс массива. Индекс будет всегда быть целым числом, не быть пользователем, сгенерированным, и безопасен.

введенные значения пользователя все еще наполнены в параметры, таким образом, нет никакой уязвимости там.

Редактирование:

Инжекционные проблемы в стороне, заботьтесь, чтобы отметить что построение текста команды для размещения переменного количества параметров (как выше) способность SQL-сервера impede использовать в своих интересах кэшируемые запросы. Конечный результат состоит в том, что Вы почти наверняка теряете значение использования параметров во-первых (в противоположность простой вставке строк предиката в сам SQL).

Не то, чтобы кэшируемые планы запросов не ценны, но IMO, этот запрос не является почти сложным достаточно для наблюдения большого преимущества от него. В то время как затраты на компиляцию могут приблизиться (или даже превысить), затраты на выполнение, Вы все еще говорите миллисекунды.

, Если бы у Вас есть достаточно RAM, я ожидал бы SQL  Сервер, вероятно, кэшировал бы план относительно общих количеств параметров также. Я предполагаю, что Вы могли всегда добавлять пять параметров и позволять неуказанным тегам быть ПУСТЫМИ - план запросов должен быть тем же, но это кажется довольно ужасным мне, и я не уверен, что это было бы стоящий микрооптимизации (хотя, на Stack  Переполнение - это может стоить того).

кроме того, SQL  Сервер 7 и позже будет автопараметризовать запросы , так использование параметров не действительно необходимо с точки зрения производительности - это, однако, очень важный с точки зрения безопасности - особенно с пользователем ввел данные как это.

5
задан Péter Török 4 August 2010 в 21:37
поделиться

3 ответа

В репозитории плагинов Idea есть плагин , который решает именно эту проблему!

3
ответ дан 14 December 2019 в 13:43
поделиться

Eclipse компилируется «на лету» (при сохранении), поэтому ему не нужно ничего делать, кроме как запускать тесты. Идеи нет. Перед запуском тестов его необходимо произвести (скомпилировать все измененные классы всего проекта). Также невозможно запустить тест по идее, когда есть какая-либо ошибка компиляции в другом месте проекта.

3
ответ дан 14 December 2019 в 13:43
поделиться

Передо мной нет IntelliJ, но может быть, IntelliJ настроен на чистую компиляцию перед запуском тестов, в которых Eclipse настроен на выполнение make (т.е. компилировать только измененные классы )

Просто мысль

0
ответ дан 14 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: