sql >> Databasteknik >  >> RDS >> Mysql

Perfekt sätt att använda MySQL-datauppdatering/lagring utan fördröjning och fel vid uppdatering av statistik

Först och främst:

Såvitt jag kan se stänger du anslutningen varje gång efter att du kört en fråga/uppdatering. Detta är tyvärr ganska imperformant. Det skulle vara bättre om du öppnade en MySQL-anslutning när plugin-programmet startar och stänger igen när plugin-programmet slutar.

Jag gjorde det personligen så här:(Betyder inte att du måste göra på det här sättet)

Anslutningsvariabeln:

private static Connection connection;

Anslutningsfunktionen:

    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 för att uppdatera/skriva 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 för att söka information från databasen:

Som du kan se är denna funktion inte asynkron. Jag har tyvärr inte lyckats med det nu för att få den här funktionen asynkron. Men du kan enkelt lösa detta genom att bara göra funktionsanropet asynkront. 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;
}

Stängfunktionen:

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

En nackdel med det här sättet är att du bara kan ansluta till en databas åt gången (vilket var bra i mitt fall).

Hoppas det hjälper dig. Jag kämpade också mycket med konstiga MySQL-fel. Lyckligtvis fungerar allt bra med den här koden.

För att svara på din fråga:

[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å vitt jag vet betyder detta att anslutningen till MySQL-servern är stängd trots att plugin-programmet försöker använda den. Som nämnts ovan bör det lösa detta genom att öppna en anslutning i början och lämna den öppen tills plugin-programmet slutar.



  1. PHPExcel och textomslag

  2. Det korrekta sättet att implementera en unik begränsning som tillåter flera NULL-värden i SQL Server

  3. Django + MySQL - Okänd kodning:utf8mb4

  4. MySQL hämtningstid optimering