То, как использовать MySQL, подготовило кэширование оператора?

Это не имеет отношения к Angular. Сам JavaScript никогда не инициализирует значение, когда вы определяете переменную, JavaScript просто выделяет эту переменную как переменную любого типа.

Вы на самом деле пишете на TypeScript, который, конечно же, является типизированным надмножеством JavaScript, и все, что делает

count: number;

- это выделение переменной count и обозначение ее тип number. Вы, разработчик, должны инициализировать переменную самостоятельно, потому что во многих случаях вы не хотите, чтобы переменная была инициализирована.

Так, например, в Vue есть декоратор @Prop(), который вы используете для предоставления доступа к данным из родительского компонента дочернему элементу.

Пример:

@Prop(String)
public title?: string

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

Есть еще много случаев, когда вы не хотите инициализировать переменную значением, имейте в виду, что это может привести к неопределенным значениям, которые, если вы не обрабатываете, могут быть проблемой. Однако, если вы используете что-то вроде TSLint в коде Visual Studio или любом другом расширяемом редакторе, вы увидите, когда вам нужно это обработать.

public exampleFunction() {
  // if you try and use title here it may be undefined
  if (!this.title) {
    return
  }
  // after you check to make sure that title is not undefined you can be sure it's safe to use it
}

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

8
задан Chei 21 October 2008 в 14:11
поделиться

5 ответов

Необходимо подготовить оператор только однажды, за пределами цикла, и затем связать параметры в цикле. Поэтому подготовленные операторы имеют, связывают параметры - таким образом, можно снова использовать подготовленный оператор.

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

2
ответ дан 5 December 2019 в 20:20
поделиться

Во-первых, Ваш PreparedStatement воссоздается в цикле, таким образом, драйверу JDBC позволяют отбросить подготовленные данные. Таким образом, Вы попросили ужасное поведение, и таким образом, Вы получили его.

И затем, PreparedStatement в MySQL являются главой самостоятельно. Чтобы иметь реальное кэширование, необходимо запросить это явно через свойство соединения.

Таким образом, необходимо установить "cachePrepStmts" свойство на "истинный" для получения кэширования на подготовленных операторах. По умолчанию то свойство имеет значение false.

@see руководство MySQL для Вашей версии MySQL для деталей

1
ответ дан 5 December 2019 в 20:20
поделиться

Действительно ли возможно подражать этому использующему чистому JDBC?

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

Я могу неправильно понимать способ, которым работает кэш MySQL, но файл журнала обязательно сообщает о работе кэша? Может случиться так, что Spring или В спящем режиме, имеет его собственный промежуточный кэш, который проверяет подготовленные операторы по отправленным ранее. Могло бы случиться так, что это, которое Вы видите, когда Вы запускаете программу с Spring. Это означало бы делать немного трассировки с Вашей системой, чтобы видеть, сообщает ли журнал mysqld просто об операторах, он был отправлен, независимо от того, как он имеет дело с ними.

2
ответ дан 5 December 2019 в 20:20
поделиться

Необходимо подготовить оператор вне цикла.

Connection conn = DatabaseUtil.getConnection();
PreparedStatement stmtUpdate = conn.prepareStatement("UPDATE foo SET bar=? WHERE id = ?");
for(int id=0; id<10; id++){
    stmtUpdate.setString(1, "baz");
    stmtUpdate.setInt(2, id);
    int rows = stmtUpdate.executeUpdate();
    // Clear parameters for reusing the preparedStatement
    stmtUpdate.clearParameters();
}
conn.close();

Я не знаю о mysql кэширование подготовленных операторов, но это - способ, которым подготовился JDBC, операторы, как предполагается, снова используются.

1
ответ дан 5 December 2019 в 20:20
поделиться

Вам также необходимо установить размер кэша операторов для экземпляра соединения. Я предполагаю, что размер кеша по умолчанию равен 0. Следовательно, кеширование не выполняется.

2
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

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