Ответы пользователя по тегу Java
  • Как правильно работать с MySQL в Java?

    @bromzh
    Drugs-driven development
    Первый вопрос: скажите пожалуйста правильно ли я построил схему работу с базой?

    Нет. Потому что:
    у меня после каждого запроса в терминале висит куча Sleep соединений:


    Надо соединяться через пул соединений, он сам должен регулировать соединения. Пул лучше взять готовый (можно и самому написать, но это не так-то просто, всё-таки многопоточное программирование не самая простая вещь).
    Потом ещё стоит подключить к этому пулу менеджер транзакций, который в принципе тоже сам умеет распределять ресурсы для обеспечения транзакции для запросов.
    Ответ написан
    3 комментария
  • Запуск Java на сервере?

    @bromzh
    Drugs-driven development
    Если планируется сокет-сервер, то стоит посмотреть в сторону Netty. Быстрый асинхронный фреймворк с поддержкой многих протоколов, как низкого уровня, типа TCP, так и более высокого, типа вебсокетов.
    Ответ написан
    Комментировать
  • Стоит использовать исключения или if/else?

    @bromzh
    Drugs-driven development
    Скиньте пожалуйста где почитать/посмотреть


    Кей Хорстманн, Гари Корнелл "Java. Библиотека профессионала". 9 издание. Том 1. Глава 11.

    В частности, там есть раздел с заголовком "Рекомендации по обработке исключений", где всё доходчиво объяснено.
    Ответ написан
    Комментировать
  • Java.Lang.NullPointerException, Что мне делать с этой проказой?

    @bromzh
    Drugs-driven development
    Это знак свыше, что наступило время начать учиться использовать дебаггер.
    Ответ написан
    Комментировать
  • Стоит ли использовать Java для высоко нагруженных приложений?

    @bromzh
    Drugs-driven development
    Java намного производительнее Python/PHP/Ruby. Особенно, если выкинуть полноценый Application Seriver и взять вместо него простой контейнер сервлетов. undertow, например, весит меньше мегабайта ( в виде jar) и жрёт 4 Мб памяти при старте. Да и вообще, вот тут, java всегда в топе по производительности.
    Ответ написан
    Комментировать
  • Если ли хорошая реализация ленивой монады в Java?

    @bromzh
    Drugs-driven development
    Можно взять Rx. Там есть такая штука, как BehaviorSubject. Все новые подписчики будут получать значение из "кэша". При обновлении данных все подписчики получат их.
    Единственная проблема - BehaviorSubject нужно инициализировать начальными данными.
    Но также в Rx есть так называемые "холодные" Observable. Там цепочка вычислений/действий не будет вызвана, пока нет подписчиков. Т.е. это та ленивость, что нужна. И скорее всего, есть способ сделать и ленивость и кэш с помощью Rx, просто я не так хорошо знаю эту либу. Но гугл должен знать.
    Ответ написан
    Комментировать
  • Какие инструменты и язык использовать для RESTful api с нуля?

    @bromzh
    Drugs-driven development
    Попробуй spark
    import static spark.Spark.*;
    
    public class HelloWorld {
        public static void main(String[] args) {
            get("/hello", (req, res) -> "Hello World");
        }
    }
    Ответ написан
    1 комментарий
  • Поясните код Java?

    @bromzh
    Drugs-driven development
    Сперва вычисляется выражение справа от присваивания, потом оно записывается в переменную, указанную слева. При этом, так как эти переменные - числа, то они неизменяемы. Т.е. сами значения таких переменных изменить нельзя, можно лишь присвоить им новые. Вычисление выражений использует старое значение идентификатора. Новое значение присвоится только после всех вычислений.
    Тут сначала вычислится выражение b (оно будет равно первоначальному значению b, т.е. 2) и его значение сохранится в переменной a (которая вторая по-счёту). Но так как это тоже часть выражения, то в первой a будет ещё старое значение. Оно складывается с результатом выражения 0*(a=b), получается снова старое значение a, которое и присвоится идентификатору b.
    Ответ написан
    Комментировать
  • Как указать путь до JSP?

    @bromzh
    Drugs-driven development
    Что за помойка в проекте? Изучи мавен, посмотри какая структура у стандартного мавеновского проекта.
    Если используешь Jetty, то можно так (при условии, что структура проекта у тебя нормальная, а не как щас):
    1) Создай в папке src/main/resources папку, с именем webapp, например
    2)
    // Application.java
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    
    import javax.servlet.Servlet;
    
    class Application implements Runnable {
        Server server;
        ServletContextHandler handler;
    
        public Application() {
            server = new Server(8080);
            handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
            server.setHandler(handler);
        }
    
        @Override
        void run() {
            try {
                server.start();
                server.join();
            } finally {
                server.destroy();
            }
        }
    
        void addServlet(String path, Servlet servlet) {
            handler.addServlet(new ServletHolder(servlet), path);
        }
    
        void addServlet(String path, Class<? extends Servlet> servletClass) {
            handler.addServlet(new ServletHolder(servletClass), path);
        }
    }
    
    // Main.java
    import org.eclipse.jetty.servlet.DefaultServlet;
    
    public class Main {
        public static void main(String args[]) {
            Application app = new Application();
    
            app.handler.setContextPath("/");
            app.handler.setResourceBase(Main.class.classLoader.getResource("webapp").toExternalForm());
    
            app.handler.addServlet("/*", DefaultServlet.class);
            app.handler.addServlet("/api/v1/*", JerseyServlet.class);
            app.handler.addServlet("/ws/*", WSServlet.class);
    
            app.run();
        }
    }

    3) Собирай всё в jar-ник, в манифесте пропиши главный файл. Вообще, я собирал всё это градлом с плагином application:
    apply plugin:'application'
    ...
    mainClassName = "your.package.app.Main"

    PS код был на Groovy, я переписал, но мб где-то мог накосячить.
    Ответ написан
    Комментировать
  • Нужно ли в Hibernate для транзакций выделять отдельный поток?

    @bromzh
    Drugs-driven development
    Если ты используешь EJB, то все запросы от ORM к БД оборачиваются в транзакцию, если тип в persistence-unit добавить аттрибут transaction-type="JTA. Иначе транзакциями вручную будешь рулить. Достаточно лишь получить транзакцию, ну и начать/закоммитить/сделать роллбек. Менеджер транзакций уже настроен. Если не используешь EJB, а обходишься спрингом, то в нём есть свой менеджер трнзакций, хз, надо ли его отдельно конфигурить.
    Вот эти самые менеджеры транзакций и менеджеры ресурсов и рулят потоками, пулами соединений и т.д. Он сам отслеживает любые попытки обращения к БД и оборачивает в транзакцию (если есть запущенная транзакция, при чём неважно, запустил ты её сам, или сервер приложений это сделал за тебя). Эти менеджеры поддерживают как локальные, так и распределённые транзакции, и, при этом, всё потокобезопасно.

    Если не используешь JPA и EntityManager, только Hibernate, то можно взять реализацию менеджера транзакций, например Atomikos, сконфигурить и создать его ручную, а потом так же вручную запускать транзакции.

    Использовать 1 транзакцию на всё приложение глупо. Пропадёт многопоточность (ведь 1 транзакцию нельзя к нескольким потокам привязать), да и много действий внутри 1 транзакции делать плохо.

    В общем, нужно использовать всё с умом. Если нужны транзакции - используй. Только правильно: в 1 транзакции должно быть 1 логическая операция.

    PS Ах да, если я не ошибаюсь, то количество потоков зависит больше от менеджера ресурсов, а не от менеджера транзакций. Ресурсами же могут быть, например, БД, а могут и сообщения JMS. Как настроишь DataSource, так и будет.
    Ответ написан
    Комментировать
  • Расскажите про создание исполняемого файла в JAVA?

    @bromzh
    Drugs-driven development
    Ответ написан
    Комментировать
  • Какой стек выбрать для разработки обучающей веб-игры?

    @bromzh
    Drugs-driven development
    Java, Spark, Jackson, PostgreSQL (он теперь умеет в json- и jsonb-поля), Hibernate, Angular1.x+webpack+es6 или Angular2 + TS.
    Ответ написан
    Комментировать
  • Какие инструменты/фреймворки разбирать для веба?

    @bromzh
    Drugs-driven development
    Spring, JavaEE, Akka, Netty. Первые два охватывают большую область применения, последние два - довольно узкоспециализированные вещи.
    Из серверов сейчас обычно выбирают маленькие, встраиваемые и шустрые, типа tomcat, jetty или undertow (который при 1Мб jar-ника и 4Mb потребления heap space'а по скорости рвёт почти все другие, и, помимо поддержки Servlet API 3.0, ещё и свой асинхронный API имеет).
    Хотя, если нужно, то можно взять и большие сервера приложений. Undertow, например, является частью WildFly.
    Ответ написан
    Комментировать
  • Объясните использование интерфейса RequestDispatcher в JAVA?

    @bromzh
    Drugs-driven development
    https://ideone.com/6wVcrt
    /* package whatever; // don't place package name! */
    
    import java.util.*;
    import java.lang.*;
    import java.io.*;
    
    /* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
    	static interface Foo {
    		public void foo();
    	}
    	static class Bar implements Foo {
    		@Override
    		public void foo() {
    			System.out.println("Bar");
    		}
    	}
    	static class Qux implements Foo {
    		@Override
    		public void foo() {
    			System.out.println("Qux");
    		}
    	}
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		Foo bar = new Bar();
    		Foo qux = new Qux();
    		bar.foo();
    		qux.foo();
    	}
    }


    Примерно так. Только у тебя не конструктор, а метод, который вернёт экземпляр какого-то класса, который реализует интерфейс RequestDispatcher. Реализацию можно найти по-разному. Иногда сервер приложений подставляет свою, иногда нужно настроить какую-то фабрику, иногда реализация внедряется как зависимость, иногда используют анонимный класс, чтобы на месте реализовать интерфейс.

    Если в Idea ты зажмёшь ctrl и нажмёшь на слово "RequestDispatcher", то перейдёшь к определению этого интерфейса. Слева от строки с началом интерфейса скорее всего будет стрелка "вниз". Если нажать, то Idea покажет все доступные реализации этого интерфейса (хотя не всегда это удаётся).
    Ответ написан
    Комментировать
  • Серверные языки - как не запутаться и что изучить?

    @bromzh
    Drugs-driven development
    Выбор сильно зависит от конечной цели, бэкенд очень многогранен. Java будет хорошим выбором в большинстве областей. Но её долго учить. И даже после основ самого языка придётся изучать инструменты, которые используются в той или иной области. Зато вакансии всегда есть и они обычно более высокооплачиваемые.
    Да и вообще, это очень востребованный язык, который используется в самых разных областях (и не только на бэкенде). Ну и java который год на первом-втором месте по популярности и сдавать позиции особо не намерен.
    Если хочется что-то по-быстрому, то питон вполне подойдёт.
    Ответ написан
    Комментировать
  • На чем лучше генерить SQL?

    @bromzh
    Drugs-driven development
    Если ты хочешь что-то типа такого:
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Book> q = cb.createQuery(Book.class);
    Root<Book> b = q.from(Book.class);
    q.select(b).orderBy(cb.desc(b.get("id")));
    TypedQuery<Book> findAllBooks = em.createQuery(q);

    Т.е. строить запросы программно, то гугли что-то типа "JPA динамические запросы". Как их правильно использовать, смотри тут.
    А чтобы посмотреть, что же нагенерил тебе твой ORM-провайдер, то у Query есть метод unwrap, который вернёт тебе имплементацию JPA-провайдера (самый популярный - это hibernate). А далее, можно получить сгенерированный SQL. Подробнее тут (со слов "Getting the JPQL/SQL Strin....
    Ответ написан
    Комментировать
  • Java Servlet Json трудности с приемом json объекта на веб странице?

    @bromzh
    Drugs-driven development
    response.setContentType("text/plain; charset=utf-8");

    А должен быть "application/json"
    Ответ написан
  • Как грамотно оформить класс Event и listener на языке Java для "прослушки" принтера?

    @bromzh
    Drugs-driven development
    Лучше делать сервер, используя NIO.
    Пример: www.java2s.com/Tutorial/Java/0320__Network/UDPEcho...
    Ответ написан
    Комментировать
  • Как создавать правильно таблицы с помощью Hibernate?

    @bromzh
    Drugs-driven development
    Возможно. Целесообразно, если модели и связи более-менее простые. Нужно просто задать проперти с именем "hbm2ddl.auto" значение "update".
    Достигается путём добавления строчки в конфиг persistence.xml:
    <property name="hbm2ddl.auto" value="update"/>
    Можно ещё и программно настроить, погугли как.
    Ответ написан