Курс "Промышленное программирование на Java". Набор лекций 3. "Реляционные базы данных".
Модель предметной области. Подключение к РСУБД из Java.
Spring JDBC.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
Курс "Промышленное программирование на Java". Набор лекций 1. "Сборка и компоновка приложения".
Сборка проекта. Apache Maven. Компоновка и верхнеуровневый дизайн приложения. Depencency Injection. Spring Framework. Spring Boot. Обзор популярных утилитарных библиотек. Логгинг, slf4j, log4j.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Курс "Промышленное программирование на Java". Набор лекций 2. "Распределенные приложения".
Производительность и ресурсы системы. Распределенные системы. Архитектуры клиент-сервер, клиент-фронтенд-бекенд, Service-Oriented Architecture (SOA). HTTP, REST.
Угрозы безопасности в интернетах. Защита приложения.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
Курс "Промышленное программирование на Java". Набор лекций 1. "Сборка и компоновка приложения".
Сборка проекта. Apache Maven. Компоновка и верхнеуровневый дизайн приложения. Depencency Injection. Spring Framework. Spring Boot. Обзор популярных утилитарных библиотек. Логгинг, slf4j, log4j.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Курс "Промышленное программирование на Java". Набор лекций 2. "Распределенные приложения".
Производительность и ресурсы системы. Распределенные системы. Архитектуры клиент-сервер, клиент-фронтенд-бекенд, Service-Oriented Architecture (SOA). HTTP, REST.
Угрозы безопасности в интернетах. Защита приложения.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Web-программирование
Лекция #7. Django ORM
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Я.Субботник в Челябинске в рамках конференции UWDC
О докладе:
Все, что вы хотели узнать про одностраничное ajax-приложение Яндекс.Почта, но боялись спросить. Изнанка фронтенда, загрузка данных, обновление страниц и взаимодействие с пользователями без регистрации, без смс. Бонус-трек: как работают сторонние приложения в рамках одной платформы.
Курс "Программирование на Java". Лекция 04 "Обобщения и лямбды".
Массивы. Механизм обобщений (Generics), надтипы и подтипы (supertypes and subtypes). Лямбда-функции, функциональные интерфейсы. Пакет java.util.collections, списки (Lists), множества (Sets), словари (Maps), итераторы (Iterators and Iterables). Иерархия коллекций.
МФТИ, 2016 год. Лектор - Лаврентьев Федор Сергеевич
Web-программирование
Лекция #7. Django ORM
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Я.Субботник в Челябинске в рамках конференции UWDC
О докладе:
Все, что вы хотели узнать про одностраничное ajax-приложение Яндекс.Почта, но боялись спросить. Изнанка фронтенда, загрузка данных, обновление страниц и взаимодействие с пользователями без регистрации, без смс. Бонус-трек: как работают сторонние приложения в рамках одной платформы.
Курс "Программирование на Java". Лекция 04 "Обобщения и лямбды".
Массивы. Механизм обобщений (Generics), надтипы и подтипы (supertypes and subtypes). Лямбда-функции, функциональные интерфейсы. Пакет java.util.collections, списки (Lists), множества (Sets), словари (Maps), итераторы (Iterators and Iterables). Иерархия коллекций.
МФТИ, 2016 год. Лектор - Лаврентьев Федор Сергеевич
Курс "Программирование на Java". Лекция 07 "Бонус - Головоломки".
Java Puzzlers. Синхронизация и многопоточность. Примитивы. Объекты и классы. Исключения и финализация.
МФТИ, 2016 год. Лектор - Лаврентьев Федор Сергеевич
Курс "Программирование на Java". Лекция 01 "Основы Java".
История Java, мотивация её появления, JVM, примитивы, упоминание об объектной природе.
МФТИ, 2016 год. Лектор - Лаврентьев Федор Сергеевич
a continuacion se presenta el portafolio de producto jabón de baño en barra, veremos las características, precio, clientes potenciales y oportunidades de mejora.
A short presentation about the core concepts of semantic web. Topics discussed:
- Semantic vs Syntax
- Structured Data
- Schema.org
- Semantic Web building blocks
- Data integration
- Machine-to-Machine Measurement (M3) Framework
Scala-библиотека Slick прекрасно зарекомендовала себя как развитый и удобный инструмент работы с базами данных. Поддерживаются и простейшие текстовые SQL-запросы, и строго типизированные join’ы нескольких таблиц. Для построения запросов Slick предоставляет DSL, код на котором выглядит как обработка коллекций. Причем простые подзапросы могут использоваться для конструирования более сложных.
Slick имеет весьма любопытную внутреннюю архитектуру, которая делает возможным не только продвинутое использование, но и расширение библиотеки несколькими способами, о которых и пойдет речь в докладе.
(see also video: https://youtu.be/9n1zzwOGado)
Александр Сычев "Разделяй и властвуй: CQRS в iOS"IT Event
В сложных мобильных приложениях, работающих с большим объемом постоянно изменяющихся данных, задача их синхронизации и своевременного обновления в разных модулях становится нетривиальной. В своем докладе я предлагаю отойти от привычных подходов и применить практику разделения ответственности на команды и запросы, предполагающую использование разных моделей для обновления и чтения информации. Я продемонстрирую области, в которых этот подход поможет мобильным разработчикам эффективно развивать их приложения. Слушатели узнают о сложностях, с которыми им придется столкнуться при его адаптации и о том, как их следует решать.
Рассказ будет интересен опытным разработчикам, сталкивающимся в своей практике с задачей развития высокопроизводительных приложений со множеством потоков данных.
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
Антон Кириллов, Zeptolab (Москва)
Доклад посвящен обзору ключевых технологий стека Typesafe и анализу ключевых преимуществ и недостатков на примере реального проекта:
* Действительно ли Scala - “более лучшая” Java? Что следует знать, начиная внедрять Scala.
* Play Framework: больше чем просто контейнер. Архитектура и возможности.
* Доступ к базам данных: библиотеки и подходы, эволюция схемы БД во времени
* Actors: безболезненная многопоточность!
* Simple Build Tool: не совсем simple, но крайне функциональный инструмент автоматической сборки.
Рассматриваемые технологии позволяют “из коробки” начать создавать прототипы веб-приложений за очень короткое время и в дальнейшем наращивать их функционал. Тем не менее, из-за молодости стека существует большое количество “граблей”, о которых следует знать, принимая решение об использовании данного набора технологий.
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)Andrey Gershun
AlaSQL - это библиотека для обработки данных с помощью языка SQL, которая написана на JavaScript и может работать в браузере (в том числе, и в режиме WebWorker) или Node.js. Библиотека может быть использована в приложениях для обработки данных, а также для решения задач ETL (extract-transform-loading), таких как приложения бизнес-аналитики.
AlaSQL позволяет проводить сложные манипуляции с массивами данных (такие как группировки, сортировки, выборки, слияния) с помощью привычных выражений языка SQL. Встроенные процедуры импорта и экспорта данных в различных форматах (включая TXT, JSON, CSV, TSV, Microsoft Excel и Google Spreadsheets) предоставляют удобный интерфейс для импорта и экспорта прямо из SQL-выражений. Библиотека хорошо сочетается с такими современными фреймворками, как Angular.js, d3.js и Google Chars.
AlaSQL поддерживает совместимость по многим операторам со стандартным SQL и различными его диалектами, что позволяет переносить ранее разработанные процедуры для других баз данных. Специальные расширения синтаксиса SQL позволяют простым и удобным способом использовать все возможности, предоставляемые JavaScript, например, обработка JSON объектов из SQL выражений.
Для достижения высокого быстродействия AlaSQL написана с использованием сильно оптимизированного JavaScript и содержит несколько эвристик для сокращения времени обработки SQL выражений.
3. Цели проектирования модели П.О.
Точно отразить реальные взаимосвязи
между сущностями
Упростить логическую структуру БД
Обеспечить удобное использование БД
Облегчить возможную эволюцию модели
Оптимально использовать физические
возможности машины
6. Нормализация
Проектирование начинается с одной
условной супертаблицы (отношения)
Нормализация - декомпозиция отношения с
выделением меньших отношений и связей
между ними
Выделяют не менее 5 нормальных форм
Задача - свести исходное отношение к
приемлемой нормальной форме
8. Индекс
Физическая реализация вторичного ключа
Компактно организованная структура
Осуществляет поиск записи по значению
ключа - помогает ускорить запросы
Осуществляет проверку условия
(constraint) на пространстве ключей
9. Реализация индекса
Как правило, физически хранится отдельно от
таблицы
Содержит только данные ключа и ссылки на
соответствующие записи
Организован в виде структуры поиска -
дерево поиска, хеш-таблица, гистограмма
Может храниться в памяти или на диске, в
зависимости от этого - разные реализации
10. Взаимосвязь
Термин - внешний ключ (Foreign Key)
Столбец-ссылка, указывает на ключ в
другой таблице
Физически реализуется в виде ссылки на
индекс в другой таблице
Использование ссылок позволяет СУБД
переходить сразу к нужной записи
11. Типы взаимосвязи
1:(0..1) “Один к одному”. Вспомогательная
таблица либо дополнительные столбцы
1:* - “Один к многим”. Внешний ключ.
*:* - “Многие ко многим”. Промежуточная
таблица с двумя внешними ключами.
12. Планирование запросов
СУБД составляет план выполнения
каждого запроса с учетом физической
организации данных
В плане выполнения задействуются
индексы и связи между таблицами
При проектировании нужно убедиться, что
планы выполнения наиболее важных
запросов выстраиваются оптимально
13. Эффект от индексов
На построение и обновление индекса
тратится время - замедляется вставка,
удаление и модификация
Можно быстро перейти к записи по
значению вторичного ключа
При работе с внешними ключами часть
операций можно производить на индексе
14. Результат проектирования
Список таблиц с заголовками
Механизмы генерации идентификаторов
Запланированные индексы (с типами)
Связи между таблицами
Сводный обзор планов выполнения
важнейших запросов
16. SQL CLI
sql> create table animals (id integer, name varchar,
weight decimal);
sql> show tables;
TABLE_NAME | TABLE_SCHEMA
ANIMALS | PUBLIC
sql> insert into animals values (1, 'kitten', 2.5);
sql> select name from animals where weight < 3.0;
NAME
kitten
17. JDBC
Open DataBase Connectivity (1992) -
унифицированное API SQL баз данных
Java DataBase Connectivity (1997) -
унифицированное Java API SQL БД
Изначально JDBC просто оборачивало
ODBC, однако потом были написаны
нативные реализации
18. Пример JDBC
Class.forName("com.mysql.jdbc.Driver"); // Загрузка
драйвера
String url = "jdbc:mysql://localhost:3306/db_name";
Connection conn =
DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
// Process row
}
stmt.close();
19. Проблема - слишком много букв
Ручное управление подключениями
Ручное управление запросами к базе
Ручное управление транзакциями
Отсутствие конкурентного доступа
Опасности при закрытии ресурсов
Низкоуровневое API для данных
Сложная работа с исключениями
20. Решение - Spring JDBC
Расширение Spring Framework
Управляет подключениями и запросами
Вовремя закрывает дескрипторы
Тесно интегрировано с JTA и Spring
Transactions (см далее)
Каноничная иерархия исключений
Высокоуровневое API для запросов
21. Пример Spring JDBC
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int updated = jdbcTemplate.update(
"insert into animals " +
"(id, name, weight) " +
"values (1, 'kitten', 2.5)");
List<String> names = jdbcTemplate.queryForList(
"select name from animals " +
"where weight < 3.0", String.class);
jdbcTemplate.execute("alter table animals " +
"add column (height decimal)");
25. Connection Pooling
Spring DataSource на каждый запрос
открывает новые подключения
Выгодно многократно переиспользовать
созданные подключения
Это сложная задача с массой нюансов
Есть готовые реализации - C3P0, DBCP,
BoneCP
27. JDBC Template
JdbcTemplate - класс-фасад, центральный
класс Spring JDBC
Предоставляет методы для упрощенной
работы с JDBC
Создается вокруг конкретного DataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
28. Методы JDBC Template
jdbcTemplate.execute(
“alter table users add column (last_login timestamp)”);
int count = jdbcTemplate.queryForObject(
“select count(*) from table”, Integer.class);
String userName = jdbcTemplate.queryForObject(
“select name from users where uid = 1”, String.class);
List<String> admins = jdbcTemplate.queryForList(
“select name from users where is_admin = 1”,
String.class);
Map<String, Object> row3 = jdbcTemplate.queryForMap(
“select * from rows where row = 3”);
29. Методы JDBC Template
int inserted = jdbcTemplate.update(
“insert into animals (id, name, weight) ” +
“values (1, ‘kitten’, 2.5)”);
int updated = jdbcTemplate.update(
“update animals set is_heavy = 1 where weight > 50”);
int deleted = jdbcTemplate.update(
“delete from animals where is_heavy = 0”);
33. Row Callback
class MeanCallback implements RowCallbackHandler {
double sum = 0;
int count = 0;
public double getMean() { return sum/count; }
public void processRow(ResultSet rs) {
sum += rs.getDouble(1);
count += 1;
}
}
34. Row Callback
MeanCallback callback = new MeanCallback();
String sql = "select weight from animals where in_zoo =
1";
jdbcTemplate.query(sql, callback);
double mean = callback.getMean();
35. Стандартизация исключений
В JDBC фигурирует checked SQLException
У каждого вендора свой подход к ошибкам
Исключения в транзакционной среде
требуют внимательной обработки
Spring берет на себя разбор исключений
Он использует свою unchecked иерархию
Маппинги пишутся отдельно к каждому
вендору (много доступно из коробки)
36. Prepared Statement
Стадии обработки SQL-запроса:
Передача текста запроса
Парсинг в синтаксическое дерево
Построение плана выполнения
Выполнение (вжжжж!)
Для массовых однотипных запросов
“планировочные” стадии несут оверхед
Есть возможность избежать этого
37. Prepared Statement
Запрос с Placeholder’ами:
select count(*) from animals where
weight >= ? and weight < ? and
country_id = 4;
Отправим запрос на сервер:
Передача текста запроса
Парсинг в синтаксическое дерево
Построение плана выполнения
Запомним ID запроса
38. Prepared Statement
Для запроса достаточно отправить только
ID и значения Placeholder’ов
Экономия на передаче данных, парсинге
текста и построении плана
Для легких запросов это >50% времени
39. Prepared Statement
static ANIMAL_ROW_MAPPER = new RowMapper<Animal>() {...}
for (int animalId : animalIds) {
Animal animal = jdbcTemplate.queryForObject(
"select * from animals where id = ? ",
animalId, ANIMAL_ROW_MAPPER);
animalsInZoo.add(animal);
jdbcTemplate.update(
"update animals set in_zoo = 1 where id = ? ",
animalId);
}