Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 5 6 7 8 9 [10] 11 12 13 14 .. 134   вперед  Ctrl
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
mayton
А сколко примерно операций в секунду должен отработать OnMessage(...) ?

на такой вопрос - у меня есть только улыбка. я так понимаю, меня пытаются убедить, что это будет узким горлышком....
перебор 50++ if/case будет медленней , и когда мне советовали использовать шаблоны, которые , как оказалось, реально являются тормозом...
27 мар 19, 17:33    [21845294]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
mayton
Member

Откуда: loopback
Сообщений: 42888
вадя
mayton
А сколко примерно операций в секунду должен отработать OnMessage(...) ?

на такой вопрос - у меня есть только улыбка. я так понимаю, меня пытаются убедить, что это будет узким горлышком....
перебор 50++ if/case будет медленней , и когда мне советовали использовать шаблоны, которые , как оказалось, реально являются тормозом...

Ты интересный человек. Я спросил цифру - ты ответил метафорой "дофига".
Сколько это дофига - я не знаю. Но я также советовал выше лесенку из if-else
заменять хеш-мапой.

Я на самом деле не хочу тебя разубеждать что-то переделывать. Если такой код
у тебя в продуктиве - то пускай он работает. Но имплементация Class.forName
может быть изменена в будущем. Опять-же в части усложнения. И я не исключаю
варианта что то что работало сегодя быстро и примитивно завтра будет работать
медленнее. Класслоадер это тонкий и сложный инструмент и у него интересный
flow. И в данном случае лучше не завязываться на него напрямую а сделать
хоть какой-то прокси или адаптер.
27 мар 19, 18:00    [21845309]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2708
mayton
Везде где идёт конкатенация строк в SQL выражение и везде где пользователь может
влиять на это выражение есть потенциальная угроза хакерской атаки. Например
если закрыть кавычку то потенциально можно вставить вместо имени свой собственный
SQL код который выполнится у вас в базе. Какой будет результат - трудно сказать.
Зависит от тип DBMS и от изощренности того пацана на другом конце атаки.
Но в любом случае такой код признают опасным и не рекомендуют к применению.

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

А это репутация...

ну это и называется опыт,откуда стажеру про это знать.А на меня тут накинулись ,как будто я сказал что c# лучше java)
27 мар 19, 18:10    [21845312]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
lleming
Member

Откуда:
Сообщений: 1654
Озверин
вадя
пропущено...
что ты не мог прочитать в трёх строчках
 cl = Class.forName(Singleton.ListCommand.get(command_).getClass().getName());
   method = cl.getMethod(command_, java.lang.String.class, Session.class);
   method.invoke(Singleton.ListCommand.get(command_), data_, userSession);


пропущено...
какие ошибки?


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

в 10й раз - ошибки рефакторинга: изменение имени метода, сигнатуры метода, чего угодно метода. Непонятно, есть ли у методы checked exception`ы, примитивно даже нельзя перейти в метод и посмотреть, что он там делает. Я понимаю, что ты пишешь проект так, что после тебя - хоть потоп...но в мире немного иные подходы.


вадя
если тебе не понятно, это не означает, что другим не понятно.


Другим тоже непонятно, Вадя ты просто не осилил его комент, а имелось ввиду ясно что вызывается динамически метод по имени, но какая именно бизнес логика выполняется можно узнать только в конкретном контексте (читай в рантайме)
27 мар 19, 18:28    [21845328]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
mayton
Ты интересный человек. Я спросил цифру - ты ответил метафорой "дофига".
Сколько это дофига - я не знаю. Но я также советовал выше лесенку из if-else
заменять хеш-мапой.
к сожалению реально оценить какую нагрузку может выдержать такая конструкция мне не удалось выяснить....
поэтому и такая оценка.
mayton
Но имплементация Class.forName
может быть изменена в будущем. Опять-же в части усложнения. И я не исключаю
варианта что то что работало сегодя быстро и примитивно завтра будет работать
медленнее. Класслоадер это тонкий и сложный инструмент и у него интересный
flow.
ну в нынешней ситуации с java трудно давать оценку на будущее :)

заменить хеш-мапой идея имеет право на существование, но для небольшого количества вызовов методов.
и хотелось бы оценить скорость по сравнению с if/case, понятно, что это поиск блох, но всё же интересно.

в моём случае это просто неудобно . я свой вариант написал в начале проекта и забыл про него, просто добавляю классы/методы . с мапой же при добавлении/удалении метода надо менять и мапу со всеми последствиями.
я могу в проект просто добавить jsp(как основу страницы) и класс с методами - и всё будет работать. причем эту страницу может разработать другой прогер.
27 мар 19, 18:31    [21845331]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
lleming
а имелось ввиду ясно что вызывается динамически метод по имени, но какая именно бизнес логика выполняется можно узнать только в конкретном контексте (читай в рантайме)
это я понял, вот только фишка как раз в этом и заключается. я могу раздать разработку страниц команде, и сборка конечного продукта будет в простом копировании jsp и java файлов в проект.... без всякого дополнительного изменения в коде
27 мар 19, 18:36    [21845333]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
lleming
Member

Откуда:
Сообщений: 1654
вадя
lleming
а имелось ввиду ясно что вызывается динамически метод по имени, но какая именно бизнес логика выполняется можно узнать только в конкретном контексте (читай в рантайме)
это я понял, вот только фишка как раз в этом и заключается. я могу раздать разработку страниц команде, и сборка конечного продукта будет в простом копировании jsp и java файлов в проект.... без всякого дополнительного изменения в коде


Вот к этой фишке и претензии чтото делается а что непонятно (узнаем когда запустим)

Насколько я понял у Вас претензии к тому что нет возможности (не удалось найти?) при работе с вебсокетами разделить сообщения на логические группы и каждой назначить своего отдельного хандлера желательно прозрачно с помощью конфигурации с автодокументированием чтобы разрабы jsp видели в какую группу сообщения отправлять.

Видимо поэтому пришлось и создать волшебный контроллер ("волшебный сервлет" - Горький вкус Java)
27 мар 19, 18:44    [21845337]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
lleming
Вот к этой фишке и претензии чтото делается а что непонятно (узнаем когда запустим)

в общем-то в данном куске и не важно, что где-то что-то работает. главное что б этот кусок отработал.
lleming
Насколько я понял у Вас претензии к тому что нет возможности (не удалось найти?) при работе с вебсокетами разделить сообщения на логические группы и каждой назначить своего отдельного хандлера желательно прозрачно с помощью конфигурации с автодокументированием чтобы разрабы jsp видели в какую группу сообщения отправлять.
нет . тут несколько другое. ws передаёт либо строку , либо бинарные данные.
в строке зашит метод, которым должны обработаны данные и сами данные. строка в моём варианте это "как бы json".
разрабам просто даётся префикс названия методов - они эти методы скидывают в файл-класс - для каждой страницы свой класс.
27 мар 19, 19:25    [21845378]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
mayton
Member

Откуда: loopback
Сообщений: 42888
вадя
заменить хеш-мапой идея имеет право на существование, но для небольшого количества вызовов методов.
и хотелось бы оценить скорость по сравнению с if/case, понятно, что это поиск блох, но всё же интересно.

Вадя, ты о чем? Скорость доступа к элементу хеш-мапы оценивается в константу.
Это-же основы Java. А ты как считал?
27 мар 19, 19:29    [21845383]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
mayton
Вадя, ты о чем?
не внимательно посмотрел, каюсь...
27 мар 19, 19:43    [21845396]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
mayton
Member

Откуда: loopback
Сообщений: 42888
вадя
в моём случае это просто неудобно . я свой вариант написал в начале проекта и забыл про него, просто добавляю классы/методы . с мапой же при добавлении/удалении метода надо менять и мапу со всеми последствиями.
я могу в проект просто добавить jsp(как основу страницы) и класс с методами - и всё будет работать. причем эту страницу может разработать другой прогер.

Если внутренняя сетка то хорошо. Если сервис для внешнего мира то некорректное его
использование может вызвать реакцию ClassLoader с размоткой стека и с зафлуживанием лога
ненужными сообщениями. Это еще не vulnerability но уже поинт чтобы обсудить возможность
закрытия потенциального слабого места. Есть популярные атаки на application servers
когда заход на страницу с ошибкой внезапно умножал нагрузку на application. Эффект
сложный. И часто невидимый для безопасности потому что обычно все смотрят в успешные
http requests а на неуспешные просто забивают болт.
27 мар 19, 19:51    [21845403]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
mayton
вадя
заменить хеш-мапой идея имеет право на существование, но для небольшого количества вызовов методов.
и хотелось бы оценить скорость по сравнению с if/case, понятно, что это поиск блох, но всё же интересно.

Вадя, ты о чем? Скорость доступа к элементу хеш-мапы оценивается в константу.
Это-же основы Java. А ты как считал?


вадя считает так производительность: это быстро, а это нет. все.
27 мар 19, 19:51    [21845404]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
Озверин
вадя считает так производительность: это быстро, а это нет. все.
я считаю производительность всей системы в целом. и надо знать какой выйгрыш/пройгрыш каждой части системы влияет на производительность всей системы.
27 мар 19, 20:00    [21845410]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2708
Озверин,
вообщем освежил я ваш рефакторинг,подалатал и все заработало)
осталось домучать класс BaseDate и сделать закрытие Connection
на данном этапе код выглядит вот так

import java.io.Closeable;
import java.io.IOException;
import java.sql.*;

public class BaseDate implements Closeable {

   private static final String url = 
   private static final String name=
   private static final String password=

    private Connection con;
    ResultSet res;


    public BaseDate() throws SQLException {
        init();
    }
    public void init()throws SQLException{
        con = DriverManager.getConnection(url, name, password);
    }






    public  void update(String sql) throws SQLException  {
       try (Statement statement=con.createStatement()){
           statement.executeUpdate(sql);
       }
       }





//    public Map<Integer, String> getData(String sql) throws SQLException {
//        Map<Integer, String> data = new HashMap<>();
//        try (Statement statement = con.createStatement()) {
//            ResultSet res = statement.executeQuery(sql);
//            res.next();
//            ResultSetMetaData resultSetMetaData = res.getMetaData();
//            for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
//                data.put(i, res.getString(i));
//            }
//        }return data;
//    }
public void getData(String sql) throws SQLException{
        try (Statement statement=con.createStatement()){
          res= statement.executeQuery(sql);
            res.next();
        }


}


    @Override
    public void close() throws IOException {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}


бот запускается но в запросы выкидывают эксепшн

java.sql.SQLException: Operation not allowed after ResultSet closed

или

java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.


убираешь имплемент closable ,убиаешь resource try/catch и все работает.
можно коненчо и так оставить - но умом понимаю что нужно закрывать connection ? но как бы не пытался нифига не получается
27 мар 19, 20:01    [21845411]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
mayton
Если внутренняя сетка то хорошо. Если сервис для внешнего мира то некорректное его
использование может вызвать реакцию ClassLoader с размоткой стека и с зафлуживанием лога
ненужными сообщениями. Это еще не vulnerability но уже поинт чтобы обсудить возможность
закрытия потенциального слабого места. Есть популярные атаки на application servers
когда заход на страницу с ошибкой внезапно умножал нагрузку на application. Эффект
сложный. И часто невидимый для безопасности потому что обычно все смотрят в успешные
http requests а на неуспешные просто забивают болт.
всё это учтено.
27 мар 19, 20:04    [21845413]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
asv79,
надо типа такого
public void getData(String sql) throws SQLException{
        try (
Connection con = dataSource.getConnection();
Statement statement=con.createStatement()){
          res= statement.executeQuery(sql);
            res.next();
        }


}

тогда коннекшен будет закрыт
27 мар 19, 20:08    [21845421]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
asv79,

вот только тут
public void getData(String sql) throws SQLException{
        try (Statement statement=con.createStatement()){
          res= statement.executeQuery(sql);
            res.next();
        }

всё не правильно
из этого метода ничего не передаётся, потому что try/catch resource закрывает всё что в нём открыто
поэтому нужно возвращать что-то типа мапы или уже готовый результат
27 мар 19, 20:14    [21845426]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2708
вадя
asv79,

вот только тут
public void getData(String sql) throws SQLException{
        try (Statement statement=con.createStatement()){
          res= statement.executeQuery(sql);
            res.next();
        }

всё не правильно
из этого метода ничего не передаётся, потому что try/catch resource закрывает всё что в нём открыто
поэтому нужно возвращать что-то типа мапы или уже готовый результат

ничего не получается база сыпется и так и этак
не хочет оно рабоать если я пытаюсь закрыть соедение
я правильно понимаю при мы в трае создаем соедиенение - тогда нам метод Init не нужен?
27 мар 19, 20:39    [21845444]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
asv79, https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
27 мар 19, 20:56    [21845457]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
mayton
Member

Откуда: loopback
Сообщений: 42888
asv79, у тебя по этой ссылке https://github.com/apb12/TeleBot в основном бранче 2 дня не было изменений.

А где последние изменения?
27 мар 19, 20:57    [21845460]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
asv79
вадя
asv79,

вот только тут
public void getData(String sql) throws SQLException{
        try (Statement statement=con.createStatement()){
          res= statement.executeQuery(sql);
            res.next();
        }

всё не правильно
из этого метода ничего не передаётся, потому что try/catch resource закрывает всё что в нём открыто
поэтому нужно возвращать что-то типа мапы или уже готовый результат

ничего не получается база сыпется и так и этак
не хочет оно рабоать если я пытаюсь закрыть соедение
я правильно понимаю при мы в трае создаем соедиенение - тогда нам метод Init не нужен?

после скобки } закрывающей try происходит закрвтие statment и соответственно res. со всеми вытекающими.
con при этом не закрывается.
27 мар 19, 20:59    [21845461]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2708
mayton
asv79, у тебя по этой ссылке https://github.com/apb12/TeleBot в основном бранче 2 дня не было изменений.

А где последние изменения?

щас добью BaseConnect и выгружу.
27 мар 19, 22:58    [21845513]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
mayton
Member

Откуда: loopback
Сообщений: 42888
Go ahead.
27 мар 19, 23:46    [21845531]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2708
mayton,
https://github.com/apb12/TeleBot

все готово.
1.убрал ифы
2.сделал датабейс конекшн close
3.имя пользователя теперь не получиться записать в базу как sql запрос
4.resultset хранится в мапе


жду критики) что еще можно изменить в рамках познаний джуна.
константы в Keys в виде json или xml?
вместо свича сделать мапу?
28 мар 19, 02:28    [21845601]     Ответить | Цитировать Сообщить модератору
 Re: Где взять опыт?)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16785
asv79,
я бы так сделал
    private void lider(SendMessage message, long chatId) {

        try (Connection con = DriverManager.getConnection(url, name, password);
                Statement statement = con.createStatement()) {
            ResultSet res = statement.executeQuery("select Username,data from users ORDER BY data asc limit 1");
            res.next();

            message.setChatId(chatId).setText("Лидер :\n " + res.getString(1) + " Бросил курить : " + res.getString(2) + "\n  Наш канал @nosmok1ng");

            execute(message);
        } catch (TelegramApiException | SQLException e) {
            e.printStackTrace();
        }

    }

исключив лишние переприсваивания
ну и ограничить количество возвращаемых данных (limit 1)
28 мар 19, 10:26    [21845803]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 5 6 7 8 9 [10] 11 12 13 14 .. 134   вперед  Ctrl
Все форумы / Java Ответить