«Мы пожинаем
wait_eventЧитать полностью »
«Мы пожинаем
wait_eventЧитать полностью »
Пришла задача перевода одного из наших приложений с базой данных Oracle в Postgres. Приложение написано на php использует базу данных только как хранилище данных, т.е. только таблицы, ключи, индексы, последовательности. Хранимых процедур нет. Вся бизнес логика, формирование запросов – внутри кода php. ORM в приложении не использовалось, запросы SQL формируются в коде.
Привет! Меня зовут Бромбин Андрей. За последние годы у меня накопилось достаточно материалов, практик и ошибок — иногда красивых, но всё же ошибок. Этого хватило, чтобы собрать маршрут до грейда Middle.
Это не «большая книга всего на свете для джуна» и не выдуманный субъективный маршрут. Мне удалось привлечь к созданию этой статьи ведущих разработчиков крупных российских компанийЧитать полностью »
Давайте знакомиться. Меня зовут Андрей Жуйков, я уже больше 15 лет в IT и успел поработать как в России, так и в Европе. Сегодня я занимаюсь темой, которая у одних вызывает скептическую усмешку, а у других — настоящий интерес: импортозамещение в России, особенно в области СУБД. Скажу сразу: всё ниже — это исключительно мой взгляд, основанный на практических кейсах. И именно об этом хочу с вами поговорить.
Для взаимодействий Java-приложений с реляционной БД существует несколько способов:
Нативные запросы, с помощью JDBC, Spring JDBC Template и т. д.;
JPQL/HQL;
Criteria API;
Spring Data репозитории.
Разбирая взаимоблокировки у клиента, я вспомнил, насколько опасным может быть использование SELECT FOR UPDATE при конкурентном доступе. В этом нет ничего нового, но я заметил, что многие не знают о режимах блокировки строк в PostgreSQL, и решил подробно описать, когда следует избегать SELECT FOR UPDATE.
В golang нет undefined/none, из-за чего структуры, функции обычные и переменные нельзя использовать гибко - нет синтаксического сахара, как в python. Есть значение nil, но оно тоже не дает понимания, было ли значение передано или нет, так как golang по умолчанию задает значения переменным или полям структуры, например:
дана структура
type Person struct { Name string Position string }
person := Pesron{Name: "Robert"}
при получении поля выдается значение по умолчанию (поле Position)
fmt.Println(person.Name) // Robertfmt.Println(person.Position) // пустая строка
Ранее среди коллег по СУБД бытовало мнение, что не стоит использовать B-tree индексы на столбцах с малым количеством уникальных значений. Считалось, что планировщик почти никогда не будет использовать такие индексы, поскольку дешевле последовательно прочитать всю таблицу, чем использовать случайное чтение (Disk I/O) на индексе, а затем переходить по указанному TID (Tuple ID) в таблицу. В случае, если необходимо прочитать сначала большую долю индекса, а потом большую долю таблицы, то дешевле сразу прочитать таблицу, чем выполнять двойную работу.
Читать полностью »
Уже давно стали обыденными внедрения решений на платформе 1С:Предприятие на тысячу одновременных пользователей. Есть внедрения и более масштабные. И масштаб внедрений растёт. Поэтому мы решили убедиться, что платформа выдержит нагрузку нашего самого востребованного на крупных внедрениях решения 1C:ERP на 30 000 одновременно работающих пользователях.
Почему именно 30 000 пользователей, как мы измеряли производительность и как добились желаемой производительности – под катом.
Spring AIЧитать полностью »