Ограничивающие потоки пула потоков C#

Несколько рекомендаций по экранированию специальных символов в операторах SQL.

Не используйте MySQL , это расширение устарело, используйте MySQLi или PDO .

MySQLi

Для ручного экранирования специальных символов в строке вы можете использовать функцию mysqli_real_escape_string .

Пример:

$mysqli = new mysqli( 'host', 'user', 'password', 'database' );
$mysqli->set_charset( 'charset');

$string = $mysqli->real_escape_string( $string );
$mysqli->query( "INSERT INTO table (column) VALUES ('$string')" );

Для автоматического экранирования значений с помощью подготовленных операторов , используйте mysqli_prepare и mysqli_stmt_bind_param , где для соответствующего преобразования должны быть указаны типы для соответствующих переменных связывания:

Пример:

$stmt = $mysqli->prepare( "INSERT INTO table ( column1, column2 ) VALUES (?,?)" );

$stmt->bind_param( "is", $integer, $string );

$stmt->execute();

Независимо от того, используете ли вы подготовленные операторы или mysqli_real_escape_string, вам всегда нужно знать тип входных данных, с которыми вы работаете.

Итак, если вы используете подготовленный оператор, вы должны указать типы переменных для функции mysqli_stmt_bind_param.

И использование mysqli_real_escape_string для, как сказано в названии, означает экранирование специальных символов в строке, поэтому оно не сделает целые числа безопасными. Цель этой функции - предотвратить разрыв строк в операторах SQL и повреждение базы данных, которое она может вызвать. mysqli_real_escape_string - полезная функция при правильном использовании, особенно в сочетании с sprintf.

Пример:

$string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';

$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string( $string ), $integer );

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5

$integer = '99999999999999999999';
$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string( $string ), $integer );

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647

36
задан Community 23 May 2017 в 10:31
поделиться

2 ответа

Примечание: при ограничении этого "3" именно так, Вы не сокрушаете машину, запускающую Ваше приложение, я удостоверился бы, что это - проблема сначала. Пул потоков, как предполагается, управляет этим для Вас. С другой стороны, если Вы не хотите сокрушать некоторый другой ресурс, затем продолжаете читать!

<час>

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

В этом случае, я использовал бы семафор для управления доступом к ресурсу. В Вашем случае Ваш ресурс выполняет веб-царапанье или вычисляет некоторый отчет, и т.д.

, Чтобы сделать это, в Вашем статическом классе, создать семафорный объект:

System.Threading.Semaphore S = new System.Threading.Semaphore(3, 3);

Затем в каждом потоке, Вы делаете это:

System.Threading.Semaphore S = new System.Threading.Semaphore(3, 3);

try
{
    // wait your turn (decrement)
    S.WaitOne();
    // do your thing
}

finally {
    // release so others can go (increment)
    S.Release();
}

Каждый поток заблокируется на S.WaitOne (), пока этому не дадут сигнал продолжиться. Как только S был постепенно уменьшен 3 раза, все потоки заблокируются, пока один из них не увеличивает счетчик.

Это решение не прекрасно.

<час>

, Если бы Вы хотите что-то немного более чистое, и более эффективный, я рекомендовал бы идти с подходом BlockingQueue, где Вы ставите в очередь работу, которую Вы хотите выполненный в глобальный Объект очереди Блокирования.

Между тем, у Вас есть три потока (который Вы создали - не в пуле потоков), высовывая работу из очереди для выполнения. Это не настолько хитро для установки и очень быстро и просто.

Примеры:

30
ответ дан Community 27 November 2019 в 06:16
поделиться

Это - статический класс как любой другой, что означает, что что-либо, что Вы делаете с ним, влияет на любой поток в текущем процессе. Это не влияет на другие процессы.

я рассматриваю эти из больших недостатков дизайна в.NET, как бы то ни было. Кто придумал блестящую идею сделать пул потоков статичным ? Поскольку Ваш пример показывает, мы часто хотим пул потоков, выделенный наш , задача, не имея его вмешивается в несвязанные задачи в другом месте в системе.

0
ответ дан jalf 27 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

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