Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Базы данных

AdMiRaLL

Активный участник
Пользователь
Баллы
68
Имя в Minecraft
AdMiRaLLL
Для подключения к бд использую такой код
Код:
public class DataBases {

    static Connection conn = null;
    static ResultSet rs = null;

    public static Connection connect() throws SQLException {
        Properties connInfo = new Properties();

        connInfo.put("characterEncoding", "UTF8");
        connInfo.put("user", "asdf"); 
        connInfo.put("password", "asdf");
        return  DriverManager.getConnection("jdbc:mysql://5.9.58.48/asdf",
                connInfo);
    }

    public static void disconnect() throws SQLException {
        if (conn != null)
            conn.close();
        if (rs != null)
            rs = null;
    }

    public static ResultSet dbGet(String query) throws SQLException {
        try {
            return conn.createStatement().executeQuery(query);
        } catch (SQLException e) {
            Bukkit.getConsoleSender().sendMessage((e.toString()));
            return null;
        }
    }

    public static boolean dbSet(String query) throws SQLException {
        try {
            return conn.createStatement().execute(query);
        } catch (SQLException e) {
            System.out.println(e.toString());
            return false;
        }
    }

    public static void setSQL(String query) throws SQLException {
        if (conn != null) {
            if (conn.isClosed())
                conn = connect();
        } else {
            conn = connect();
        }
        dbSet(query);
    }

    public static ResultSet getSQL(String query) throws SQLException {
        if (conn != null) {
            if (conn.isClosed())
                conn = connect();
        } else {
            conn = connect();
        }
        ResultSet r = dbGet(query);
        return r;
    }
}

Но через раз (не всегда) у меня появляется вот такая ошибка в консоли, ну то есть я не получаю никаких данных из базы. Я так понимаю я просто не получаю коннект к бд. Как бороться с этим? Как проверить состояние коннекта и отправил ли я запрос, чтобы бороться с этим. А то переодически такие ошибки появляются

Код:
[20:27:07 INFO]: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Commun
ications link failure

The last packet successfully received from the server was 137а412 milliseconds a
go.  The last packet sent successfully to the server was 0 milliseconds ago.
 
Погуглить в интернете об такой ошибке.

Не держать соединение открытым.
 
Погуглить в интернете об такой ошибке.

Не держать соединение открытым.
Почему не держать его открытым? Каждый раз открывать закрывать?
Погуглить в интернете об такой ошибке.

Не держать соединение открытым.
И что значит открытым? делать .disconnect?
 
Не держать соединение открытым.
А разве не выгоднее наоборот держать соединение открытым, повысив время до таймаута, чтобы не тратить каждый раз ресурсы сервера на установку соединения?
 
А разве не выгоднее наоборот держать соединение открытым, повысив время до таймаута, чтобы не тратить каждый раз ресурсы сервера на установку соединения?

Люди не хотят разбираться с ошибками, а хотят чтобы сразу всё работало. Не однократно правил чужие плагины, в которых соединение открывалось и не закрывалось и приводило на некоторых машинах к ошибкам. Самый простой способ избавиться от подобных ошибок - закрывать соединение.

И по поводу производительности с открывающимися соединениями могу сказать одно: ни один из плагинов, который работал с бд не вызывал подлагиваний с бд.

Есть так называемые "good practice" всегда можно там поглядеть, как и что работает, но вывод делать самому.

Я в последних плагинах не работаю с jdbc, а работаю с orm.
 
А если например Hibernate?
А смысл? У тебя есть встроенная система ebean, с помощью которой происходит похожая работа с бд с меньшим количеством проблем.

Если ты не работал с jpa, то плагины - это довольно плохое место для тренировки, в особенности для разбирания работы с hibernate.
 

Поделиться этой страницей

Назад
Верх