PreparedStatements и производительность

Проблема заключается в том, что этот код переключает alertVisible в обратное к его предыдущему состоянию:

  changeAlertVisibility = () => {
    this.setState(prevState => ({
      alertVisible: !prevState.alertVisible
    }));
  };

Итак, изначально this.state.alertVisible равно false. После первого щелчка будет установлено значение !this.state.alertVisible // => true. При втором щелчке вы устанавливаете его обратно на !this.state.alertVisible // => false.

Для того, чтобы достичь того, что вы хотите, вы должны ВСЕГДА установить alertVisible в true следующим образом:

  changeAlertVisibility = () => {
    this.setState({ alertVisible: true });
  };

Теперь, возможно, вы захотите установить его обратно в false, когда пользователь закрывается оповещение Я не могу точно сказать вам, как этого добиться, поскольку не вижу определения вашего компонента Alert. Тем не менее, я бы добавил onClose обратный вызов к вашему Alert, который вызывается при закрытии оповещения, а затем установил для alertVisible значение false:

import React, { Component } from "react";
import Alert from "./Alert";

class ListItem extends Component {
  state = {
    alertVisible: false
  };

  changeAlertVisibility = (visible) => {
    this.setState({ alertVisible: visible });
  };

  render() {
    return (
        <div className="card__body">
          <img
            src={this.props.photo.urls.small}
            onClick={() => this.changeAlertVisibility(true)}
          />

        {this.state.alertVisible ? (
          <Alert
            photoDesc={this.props.photo.description}
            photoPath={this.props.photo.urls.small}
            photoAlt={this.props.photo.id}
            onClose={() => this.changeAlertVisibility(false)}
          />
        ) : (
          null
        )}
      </div>
    );
  }
}

export default ListItem;
53
задан Kapsh 27 March 2009 в 07:15
поделиться

5 ответов

Понятие, которое подготовило операторы, прежде всего, о производительности, что-то вроде неправильного представления, хотя это - вполне общее.

Другой плакат упомянул, что он отметил улучшение скорости приблизительно 20% в Oracle Server и SQL Server. Я отметил подобную фигуру с MySQL. Оказывается, что парсинг запроса просто не является такой значительной частью включенной работы. В очень занятой системе баз данных также не ясно, что анализ запроса будет влиять на полную пропускную способность: в целом, это, вероятно, просто израсходует процессорное время, которое иначе было бы неактивно, в то время как данные возвращались из диска.

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

30
ответ дан Neil Coffey 7 November 2019 в 08:42
поделиться

Подготовленные операторы могут улучшить производительность при многократном использовании того же оператора, который Вы подготовили:

PreparedStatement ps = connection.prepare("SOME SQL");

for (Data data : dataList) {
  ps.setInt(1, data.getId());
  ps.setString(2, data.getValue();
  ps.executeUpdate();
}

ps.close();

Это намного быстрее, чем создание оператора в цикле.

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

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

28
ответ дан Mr. Shiny and New 安宇 7 November 2019 в 08:42
поделиться

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

Больше информации может быть найдено здесь:

http://www.theserverside.com/tt/articles/article.tss?l=Prepared-Statments

и Вы могли бы хотеть посмотреть на Spring JDBCTemplate как на альтернативу использованию JDBC непосредственно.

http://static.springframework.org/spring/docs/2.0.x/reference/jdbc.html

14
ответ дан Jon 7 November 2019 в 08:42
поделиться

Парсинг SQL не является единственной вещью, на которую это идет. Там проверяет это, таблицы и столбцы действительно существуют, создавая план запросов, и т.д. Вы платите это однажды PreparedStatement.

Привязка для принятия мер против Внедрения SQL является очень хорошей вещью, действительно. Не достаточный, IMO. Все еще необходимо проверить вход до получения к слою персистентности.

8
ответ дан duffymo 7 November 2019 в 08:42
поделиться

Анекдотическим образом: Я сделал некоторые эксперименты с подготовленным по сравнению с динамическими операторами с помощью ODBC в Java 1.4 несколько лет назад, и с Oracle Server и с бэкендами SQL Server. Я нашел, что подготовленные операторы могли быть целым на 20% быстрее для определенных запросов, но были конкретные различия поставщика, относительно которых запросы были улучшены до какой степени. (Это не должно быть удивительно, действительно.)

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

Ваш пробег может варьироваться, конечно.

3
ответ дан Dan Breslau 7 November 2019 в 08:42
поделиться
Другие вопросы по тегам:

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