Вопрос Лакпермс калькуляторы и mysql

manul694

Premium
Сообщения
1 171
Решения
34
Я сделал контекст, который берёт из базы данных и в зависимости от полученного значения решает, будет ли доступно право. Это очень сильно нагружает сервер, мспт идёт вплоть до 800.
Дальше я решил что бы при входе он получал это значение, записывал в мап и лакпермс будет брать уже оттуда, но несмотря на это сервер всё равно нагружается, пусть и не так сильно и спустя 3 секунды возвращается в нормальное состояние. Функцию на получение значения я сделал примерно так: берётся из мапы, а если нет там такого игрока то из базы данных.
Как можно ещё снизить нагрузку?
 
Напишите нормально свой вопрос. Ничего не понятно. Желательно с примерами кода.
Калькулятор:
Код:
private static final String KEY = "manulbuilds:isreligion-";

    @Override
    public void calculate(@NotNull Player target, @NotNull ContextConsumer contextConsumer) {
        String tname = target.getName();
        Religion religion = ReligionManager.getInstance().getPlayerReligionFromMap(tname);
        for (Religion religion1 : Religion.values()) {
            if(religion == null) contextConsumer.accept(KEY + religion1.getName(), "RELIGION_IS_NULL");
            contextConsumer.accept(KEY + religion1.getName(), String.valueOf(religion == religion1));
        }
    }

    @Override
    public @NotNull ContextSet estimatePotentialContexts() {
        ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
        for (Religion religion1 : Religion.values()) {
            builder
                    .add(KEY + religion1.getName(), String.valueOf(true))
                    .add(KEY + religion1.getName(), String.valueOf(false))
                    .add(KEY + religion1.getName(), "RELIGION_IS_NULL");
        }
        return builder.build();
    }

Функция получения значения:

Код:
public Religion getPlayerReligionFromMap(String name) {
        return religionMap.getOrDefault(name, null);
    }

При входе игрока в игру выполняется это:
Код:
public static void religions_asyncsetreligion(String playername) {
        Bukkit.getScheduler().runTaskAsynchronously(ManulBuilds.getInstance(), new Runnable() {
            @Override
            public void run() {
                int result = 0;
                try {
                    String sql = "SELECT * FROM religion WHERE nick = ?;";
                    PreparedStatement stmt = connection.prepareStatement(sql);
                    stmt.setString(1, playername);
                    ResultSet results = stmt.executeQuery();
                    //if (!results.next()) result = 0;
                    if (!results.next()) return;
                } catch (SQLException ex) {
                    ex.printStackTrace();
                    return;
                }
                try {
                    String sql = "SELECT * FROM religion WHERE nick = ?;";
                    PreparedStatement stmt = connection.prepareStatement(sql);
                    stmt.setString(1, playername);
                    ResultSet results = stmt.executeQuery();
                    if(results.next()) result = results.getInt("religion");
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
                Religion religion = Religion.getReligions().get(result);
                ReligionManager.getInstance().setPlayerToMap(playername, religion);
            }
        });
    }
 
Скинь тайминги
Так оно и не успеет записать. У меня мспт только на пару секунд повышается. Можно 5 секунд спарком записать, но чёт сомневаюсь в результативности.
и все остальные классы.
У меня их 40
 
Решил проблему.
Java:
try {
                    String sql = "SELECT * FROM religion WHERE nick = ?;";
                    PreparedStatement stmt = connection.prepareStatement(sql);
                    stmt.setString(1, playername);
                    ResultSet results = stmt.executeQuery();
                    //if (!results.next()) result = 0;
                    if (!results.next()) return;
                } catch (SQLException ex) {
                    ex.printStackTrace();
                    return;
                }
                try {
                    String sql = "SELECT * FROM religion WHERE nick = ?;";
                    PreparedStatement stmt = connection.prepareStatement(sql);
                    stmt.setString(1, playername);
                    ResultSet results = stmt.executeQuery();
                    if(results.next()) result = results.getInt("religion");
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }

В этом коде я 2 раза обращаюсь к базе данных, хотя можно было это всё за 1 сделать. Убрал первый try
 
Назад
Сверху Снизу