sql >> Database >  >> RDS >> Mysql

Perfecte manier om MySQL-gegevens bij te werken/op te slaan zonder vertraging en fouten bij het bijwerken van statistieken

Allereerst:

Voor zover ik kan zien, sluit je de verbinding elke keer nadat je een Query/Update hebt uitgevoerd. Dit is helaas nogal imperformant. Het zou beter zijn als u een MySQL-verbinding opent wanneer de plug-in start en deze weer sluit wanneer de plug-in stopt.

Ik heb het persoonlijk zo gemaakt:(Betekent niet dat je het zo moet doen)

De verbindingsvariabele:

private static Connection connection;

De verbindingsfunctie:

    public static void connect(String host, String user, String password, String database) {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {

        //close Connection if still active
        if (connection != null) {
            close();
        }

        //connect to database host
        try {
            Class.forName("com.mysql.jdbc.Driver");

            connection = DriverManager.getConnection("jdbc:mysql://" + host + "/" + database, user, password);

        } catch (SQLException e) {
          System.out.println(e.getMessage());
        }

    });
}

Mijn functie om gegevens in de database bij te werken/te schrijven:

    public void Update(final String qry) {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
        try {
            Statement stnt = connection.createStatement();
            stnt.executeUpdate(qry);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    });

}

Mijn functie om informatie uit de database op te vragen:

Zoals je kunt zien is deze functie niet asynchroon. Het is me helaas nog niet gelukt om deze functie asynchroon te krijgen. Maar u kunt dit eenvoudig omzeilen door de functieaanroep gewoon asynchroon te maken. ex: Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> { Query("your query"); });

    public ResultSet Query(String qry) {
    ResultSet rs = null;

    try {
        Statement stnt = connection.createStatement();
        rs = stnt.executeQuery(qry);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return rs;
}

De sluitfunctie:

    public static void close() {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
        try {
            connection.close();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    });
}

Een nadeel van deze manier is dat je maar met één database tegelijk verbinding kunt maken (wat in mijn geval prima was).

Hoop dat het je helpt. Ik worstelde ook veel met rare MySQL-fouten. Gelukkig werkt met deze code alles prima.

Om je vraag te beantwoorden:

[22:31:18] [Craft Scheduler Thread - 71/WARN]: Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

Voor zover ik weet betekent dit dat de verbinding met de MySQL-server is gesloten, ook al probeert de plug-in deze te gebruiken. Zoals hierboven vermeld, zou het openen van een verbinding aan het begin en open laten staan ​​​​tot de plug-in stopt dit probleem oplossen.



  1. Prestatieverschillen tussen gelijk (=) en IN met één letterlijke waarde

  2. Hoe schrijf je meerdere kolommen in een clausule met sqlalchemy

  3. Groepen opeenvolgende records selecteren met een gemeenschappelijk attribuut?

  4. MySQLdb installeren op Mac OS X