Задать вопрос
  • Какая зависимость в Java приложении к подключению БД?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    1. Java (JDK/JRE) не содержит в себе драйверов доступа к БД вообще. В ней определен только базовый
    интерфейс java.sql.* и существует некий стандарт на то как драйверы должны работать. Например когда мы делаем ResultSet::close, или Statement::close, драйвер может ничего и не делать в этот момент. Все зависит от того
    как производитель (Oracle, MSSQL) реализовал под капотом работу драйвера. Поэтому как работает внутри драйвер это - тайна.

    2. Обычно если в приложении тебе часто и много нужно создавать объектов Connection, то используют пулы коннектов (Hikari Connection pool, DBCP, C3PO). Почитай в этом направлении. Пулы экономят сессионные
    объекты на стороне БД и создают новые коннекты быстрее за счет переиспользования сущесвтующих коннектов.
    В обычном (прямом режиме) работы с БД процесс установки соединения может занимать несколько секунд.
    Это может быть запредельно медленно для некоторых алгоритмов.

    3. В сложных ent. приложениях используются фреймворки типа Spring которые декларируют зависимости одник
    компонент от других
    и также обеспечивают ленивую инициализацию и работу синглтона. Всем новичкам
    нужно знать что такое синглтон и уметь им пользоваться. И лучше уметь это сначала без фреймворка
    чтобы понимать уже как это делает фреймворк.
    Ответ написан
  • Какой стек выбрать если я хочу разработать интернет-сервис по аналогии с Авито?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Бизнес успех таких сетей как VK, Facebook слабо связан со стеком. Они все стартовали с PHP но просто
    очень умно кешировали контент и децентрализовывали. Поэтому в первую очередь важен скилл
    специалистов которые будут видеть узкие места в системе и сумеют быстро их пофиксить.

    Популярность.

    Я-бы не брал в расчет вообще. Сервисы yahoo в свое время создавались на Lisp, а это был вообще
    нигде не популярный язык.
    Ответ написан
    3 комментария
  • Как правильно обрабатывать SQLException?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Скорее всего коды SQL ошибок зависят от DBMS. Например я по старой памяти помню что если
    в коде вы видите ORA-00001 то вы скорее всего используете Oracle и ваша ошибка
    связана с нарушением Primary KEY во время INSERT/UPDATE.

    Другие DBMS (Postgres/MySQL) будут иметь другие коды ошибок.
    Ответ написан
    3 комментария
  • На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В конце 20-го века, когда Эдгар Кодд развивал свою реляционную теорию было очень
    модно все данные нормализовывать для хранения их в БД. Это соотвествовало экономии
    ресурсов (диски мерялись килобайтами и мегабайтами) и нормализация хорошо ложилась на
    техно-стек. Все данные должны быть атомарны. И ты - плохой DBA и программист если
    кладешь в ячейку что-то более комплексное чем просто атом.

    В 2000х развитие веб и XML(XHTML/SGML, XSLT, XPath) дало толчок новым видам
    хранения информации в виде markup languages. Появляются технологии семанического веба.
    Мечтатели-теоретики создают RDF, OWL. Базы данных пытаются успеть втянуть в себя новые типы.
    Oracle начинает поддерживать XML+Schema как тип данных в таблице. Браузер начинает
    поддерживаеть трансформацию XML и обогащение его стилями. XML - моден. Его внедряют
    везде где можно и где не нужно. Даже в конфигах Apache Http и в сборщике Maven.

    Параллельно Дуглас Крокфорд работает над Java Scrip Obj Notation и создает лайтовый язык
    для описания объектов и документов. Они - конкурируют с XML но JSON практически побеждает
    в вебе, полностью захватывая веб протоколы (Ajax, WebSockets, e.t.c). И интеракцию с сервером.
    JSON становится более популярный для REST. Многие БД тоже начинают поддерживать JSON.
    Postgres даже делает бинарный JSON и добавляет спец-индексы для быстрого поиска атрибутов.
    Узко-специализированные системы такие как Mongo изначально заточены на храннение JSON
    информации.

    BigData плавно проростает в 2007 (кажется) и где-то в 2014 (или позже) году фреймворк Spark начинает поддерживать DataFrames + Structured Types которые по сути являются зеркалом JSON. Фреймворк
    позволяет грузить в бигдату JSON-lines датасеты, автоматически выводя схему.

    Это - финал. Я считаю что после такой конвергенции в бигдату JSON получил путевку везде где только можно.
    Сегодня вы можете без стыда использовать JSON везде в любых уровнях стека (даже в Redis) если
    у вас хватает памяти и вы уже порешали вопросы бизнес-согласованности данных и умеете эти
    данные инвалидировать и обновлять.

    Если поискать анти-паттерны применения JSON в базах данных - то я-бы предложил такую метрику.
    Если вы очень часто обновляете маленькое поле внутри большого JSON документа и это создает
    сильные I/O нагрузки то скорее всего вам надо перепроектировать вашу БД как-то по другому
    и вынести это поле во вне по отношению к документу
    Ответ написан
    5 комментариев
  • В каком контексте значение класса String является неизменяемым в отличии от StringBuilder?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Почему все методы StringBuilderнельзя было поместить в класс String, чтобы не плодить классы строк?

    Главный поинт при создании immutable String - безопасность кода. Когда компиллятор точно
    знает что value строки не изменится - то он может доказать много кейсов и гарантировать что
    разделяемая память не будет сломана. Особенно это важно для мультипоточки. Когда
    разные потоки владеют строкой и здесь сам вопрос доказательства вдруг становится очень важным.

    Язык С++ например такой защитой не обладает и для него строка как фундаментальный тип
    может иногда мутировать. Тоесть если вы старались писать правильно то она конечно не мутирует.
    Но в этом есть большая разница между C++ и Java. На уровне платформы гарантировано отсуствие
    какого-то класса ошибок.

    StringBuilder - это попытка улучшить перформанс для кумулятивных строк. Тоесть например
    если вы формируете текстовый файл-отчет в памяти то вы будете постоянно делать конкатенации
    строк. Это конкатенации вызовут аллокацию-уничтожение памяти. (в скобочках помним
    что строка - не мутабельная поэтому изенить ее можно только создав новую копию с добавлением
    чего-то нового. Причем с учетом роста самой строки , драматично будет расти эффект нагрузки на память.

    Специально для уменьшения этой проблемы (реаллокации и копирования) был создан StringBuilder.
    Это вообще не строка а как-бы мутирующий буфер куда можно добавлять в хвост строки. И в конце
    когда все готово - из буфера берется иммутабельная строка и на этом работа билдера закончена.

    Immutable строки - это гениальное изобретение. Оно реализовано во многих языках и платформах
    и оно практически спасает разработчика бизнес-приложений от трудно уловимых ошибок.
    Ответ написан
    2 комментария
  • Чем MSSQL занимает всю оперативную память?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно если хост отдается под сервер баз данных - то он отдается целиком и полностью.
    Как - женщина в браке. Не может быть варианта использования наполовину. Типа
    веб-сервер + еще БД.

    Оно понятно что Express - это такой пробник. Но этот пробник все равно в перспективе перерастет
    в БД. И зачем тебе размениваться на мелочах?

    База всегда брала столько памяти сколько есть. Потому вто буферный кеш БД или кеш блоков
    (его по разному называют) играет роль ускорителя для таблиц и индексов. Грубо говоря
    чем больше блоков в кеше - тем быстрее идет интеракция с data-files.
    Ответ написан
    1 комментарий
  • Как автоматизировать сборку зависимостей программы?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Смотрите в сторону любого менеджера зависимостей вроде Conan или vcpkg. У конана точно есть интеграция с CMake. Только учтите, что много чего вам всё равно придётся писать руками. Управление зависимостями -- это головная боль в C++, т.к. язык очень старый. Обычно у всех компаний есть свои велосипеды для этого.

    С помощью связки CMake + Conan реально получить то, что вы хотите.

    Следующим шагом будет создание установщика для уже скомпилированной программы, который будет устанавливать программу на компьютер пользователя. Тут всё ещё хуже на самом деле :) Но это уже другой вопрос.
    Ответ написан
    2 комментария
  • Как защитить postgresql в контейнере докера?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Уберите из docker-compose
    "ports:
    - "5400:5432"
    и порт не будет публиковаться наружу, будет доступен только на внутреннем ip адресе вашего контейнера docker.
    Для подключения или используйте внутренние имена контейнеров, или создайте отдельную подсеть docker (подсеть по умолчанию не дает выдавать контейнерам статические ip адреса) и переведите оба контейнера на ее использование с выдачей статических ip адресов.
    Ответ написан
    1 комментарий
  • Нужен ли Сетевой уровень в локальной сети.?

    "уровни" в сетевой модели - это просто способ классификации протоколов в сетевом стеке.
    В рамках одной сети возможна маршрутизация по физическим MAC-адресам (именно на них работает протокол Ethernet, например, который в модели OSI считается протоколом Канального уровня).

    В рамках нескольких сетей адресация уже идёт по IP-адресам и используется уже IP-протокол.

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

    Протоколы уровней выше должны обязательно основываться на чём-то. Тот же TCP и UDP, например, обязательно строятся поверх IP-протокола, который принято считать протоколом сетевого уровня. => если ты хочешь в своей локальной сети использовать TCP, UDP или какой-то протокол, который строится поверх них (например HTTP, LDAP, IPP), то тебе обязательно придётся использовать протокол канального уровня в лице IP.

    Есть протоколы, которые вполне могут работать и без IP, но дома ты их у себя врядли увидишь)
    Ответ написан
    Комментировать
  • Как работает HashMap с многопоточностью?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Недетерминировано работает. Без синхронизации между потоками у нас нет гарантий последовательность и видимости, так что даже без одновременного вызова мутирующих методов есть шанс сломать инвариант.
    Ответ написан
    6 комментариев
  • Как объединить сеть двух зданий?

    Bermut
    @Bermut
    Жертва домашней лаборатории
    Товарищ, у меня вопрос, кто из выше стоящих людей поставил тебя на эту задачу? У тебя отсутствуют даже базовые познания сети.
    Ну а так, подключаем первый коммутатор ко второму, назначаем на интерфейсы к которым подключен кабель ip адреса из одной подсети(можно /31), и на одном из коммутаторов пишем маршрут до подсети/подсетей, которые используются во втором здании.

    Но, опять таки, в данном случае отказаустойчивость нулевая, и при таком маштабе сети стоило бы нанять системного администратора, которое бы привел все в божеский вид.
    Ответ написан
    1 комментарий
  • Как исправить ошибку - release version 15 not supported?

    @Koshkin_I Автор вопроса
    ))) Все решил)) В компиляторе тоже надо поставит 13 версию.
    Ответ написан
    1 комментарий
  • @Bean в @Configuration и @Component. Разница?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Обычно с помощью @Bean создают объекты, которые требуют дополнительной настройки. Часто это какие-то компоненты из библиотек, например, http клиенты, пулы подключений и т.д.
    @Component и @Service используют обычно, когда ничего особенного при создании объекта не требуется.
    Ответ написан
    Комментировать
  • Docker соединяет frontend и backend?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Можно, но не нужно.
    Суть докера в том, чтобы все сервисы были отдельно. Соответственно, отдельный nginx, back, db, front и т.д.
    Ответ написан
    Комментировать
  • Docker засоряет папку Temp вплоть до 80 гб, что делать?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    docker system prune --all
    Это должно помочь
    Ответ написан
    Комментировать
  • Как обойти блокировку заблокированных сервисов в Туркменистане?

    @Drno
    Переехать. Туркменистан продолжает блокировать все VPN сервера, которые находит. И будет продолжать это делать, пока не останется только "белый список" адресов \ сайтов.
    Т.к. там авторитарное правительство, которому плевать на своё население. Они не заинтересованы чтобы их население вышло в интернет, и поняло насколько у них всё плохо))

    Поэтому либо находить новые сервера \ VPN сервисы, либо переезд
    Ответ написан
    Комментировать
  • Стоит ли брать Steam Deck как основной игровой девайс?

    Зависит от того, во что ты играешь.
    Steam deck - действительно крутой девайс, но:
    1. Никаких соревновательных игр на нём нет, кроме CS и доты. Для игр в них тебе нужен будет монитор, клавиатура, и мышь.
    2. Не все игры будут работать на нём.
    3. В тяжёлые игры будет играть тяжело. Например вот недавно попробовал поиграть в BG3 - в принципе запускается и играется, но сильно греется.

    По тому, если у тебя нет ПК - лучше попробуй собрать ПК, если для тебя портативность не является решающим фактором.
    Также можешь посмотреть на switch - там есть мутиплеер и есть свои эксклюзивы.
    Ответ написан
    1 комментарий
  • Расскажите, что это за ошибка и как ее исправить?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Похоже, у вас версия java до 17 :

    ...
    
        /**
         * The modifier {@code sealed}
         * @since 17
         */
        SEALED,
    
    
    ...
    Ответ написан
    2 комментария
  • Как изменить структуру кода?

    vabka
    @vabka Куратор тега Rust
    Нет, нельзя. Модули в Rust оперируют функциями/типами/трейтами, но не отдельными кусками кода.
    Ты можешь вынести функции f1 и f2 в отдельные файлы:

    main.rs
    mod m01;
    mod m02;
    mod m03;
    
    fn main() {
        m01::f1();
        m02::f2();
        let (i, p) = m03::f3();
        println!("i = {:?}", i);
        println!("p = {:?}", p);
    }


    m01.rs
    pub fn f1() {
     let num: u8 = 12;
     println!("num = {:?}", num);
    }


    m03.rs
    pub fn f2() {
     let s: String = "abc".to_string();
     println!("s = {:?}", s);
    }


    В случае m03 ты можешь попробовать сделать функцию, которая будет возвращать значения переменных i и p:
    pub fn f3() -> (u8, String) {
      let i: u8 = 88;
      let p: String = "xyz".to_string();
      (i, p)
    }


    PS: Я уже было хотел предложить макрос вида:
    macro_rules! f4 {
      () => {
        let i: u8 = 88;
        let p: String = "xyz".to_string();
      }
    }

    Но он работать не будет, ибо гигиена.

    Но можно сделать так:
    macro_rules! f4 {
      ($a: ident, $b: ident) => {
        let $a: u8 = 88;
        let $b: String = "xyz".to_string();
      }
    }
    
    fn main() {
        f4!(i, p);
        println!("{} {}", i, p);
    }


    PPS: ну и ещё есть макрос include!, который буквально решает твою задачу - вставить кусок кода из файла, но его я не советую использовать.
    Ответ написан
    2 комментария
  • Как обойти размер файла и хеш? Как сделать чит?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Чтоб подогнать файл под хеш надо сначала знать алгоритм хеширования.

    А вообще - ты мелкий хулиган :) Найди себе нормальную работу лучше.
    Ответ написан
    4 комментария