sql >> Database teknologi >  >> RDS >> Mysql

Perfekt måde at bruge MySQL-dataopdatering/lagring uden forsinkelse og fejl ved opdatering af statistik

Først og fremmest:

Så vidt jeg kan se, lukker du forbindelsen hver gang, efter du har udført en forespørgsel/opdatering. Dette er desværre ret imperformant. Det ville være bedre, hvis du åbnede en MySQL-forbindelse, når plugin'et starter, og lukker den igen, når plugin'et stopper.

Jeg har personligt lavet det på denne måde:(Betyder ikke, at du skal gøre det på denne måde)

Forbindelsesvariablen:

private static Connection connection;

Tilslutningsfunktionen:

    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());
        }

    });
}

Min funktion til at opdatere/skrive poster i databasen:

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

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

}

Min funktion til at forespørge oplysninger fra databasen:

Som du kan se, er denne funktion ikke asynkron. Det lykkedes mig desværre ikke nu at få denne funktion asynkron. Men du kan nemt omgå dette ved blot at gøre funktionskaldet asynkront. eks: 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;
}

Luk-funktionen:

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

En ulempe ved denne måde er, at du kun kan oprette forbindelse til én database ad gangen (hvilket var fint i mit tilfælde).

Håber det hjælper dig. Jeg kæmpede også meget med mærkelige MySQL-fejl. Heldigvis fungerer alt fint med denne kode.

For at besvare dit spørgsmål:

[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.

Så vidt jeg ved betyder det, at forbindelsen til MySQL-serveren er lukket, selvom plugin'et forsøger at bruge det. Som nævnt ovenfor, skal det løses ved at åbne en forbindelse i starten og lade den være åben, indtil plugin'et stopper.



  1. Blokerer '0000-00-00' fra MySQL-datofelter

  2. Oracle FOR LOOP REVERSE Eksempel

  3. MySQL InnoDB-tabeller er korrupte - hvordan rettes det?

  4. SQL - tæl i flere kolonner