Datenbanken

SQL

Sponge stellt eine bequeme Abstraktion für JDBC-Datenbank-Verbindungen bereit, die die Komplexität des Verbindungsaufbaus einer effizienten Verbindung von einer JDBC-URL behandelt.

Während der SQL-Dienst JDBC-Connector unterstützt, wird die Forge-Umsetzung von Sponge nur mit dem am häufigsten Verwendeten ausgeliefert:

  • MySQL
  • SQLite
  • H2

Warnung

Da SQLite viele Einschränkungen hat, ist dringend von der Verwendung abgeraten, außer in Fällen, in denen Kompatibilität mit älteren Daten erforderlich ist. H2 ist unsere empfohlene dateibasierte Datenbankimplementierung.

Verwendung

Auf eine Datenquelle kann über den Plugin-Dienstmanager zugegriffen werden:

import org.spongepowered.api.Sponge;
import org.spongepowered.api.service.sql.SqlService;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;

private SqlService sql;
public DataSource getDataSource(String jdbcUrl) throws SQLException {
    if (sql == null) {
        sql = Sponge.getServiceManager().provide(SqlService.class).get();
    }
    return sql.getDataSource(jdbcUrl);
}

// Later on
public void myMethodThatQueries() throws SQLException {
    String uri = "jdbc:h2:imalittledatabaseshortandstout.db";
    String sql = "SELECT * FROM test_tbl";

    try (Connection conn = getDataSource(uri).getConnection();
         PreparedStatement stmt = conn.prepareStatement(sql);
         ResultSet results = stmt.executeQuery()) {

        while (results.next()) {
            // ...
        }

    }

}

JDBC URLs should be obtained from SqlService#getConnectionUrlFromAlias(String), with an alias that matches one of the JDBC URL aliases listed in Sponge’s global configuration (config/sponge/global.conf) under the sponge.sql.aliases key.

The SQL service provides a pooled connection, so getting a connection from the returned DataSource is not expensive. Therefore, we recommended not keeping connections around, and closing them soon after use as shown above. Any PreparedStatement and ResultSet created should also be closed after use, with object.close() or, preferably, through a try-with-resources block.

NoSQL

Sponge does not currently provide any special abstraction over NoSQL databases (MongoDB etc.). Plugins that wish to use NoSQL databases must provide their own connectors.