数据库

SQL

Sponge 为建立 JDBC 数据库连接提供了一个方便的抽象,它处理了从 JDBC URL 建立高效化连接池的复杂度。

虽然 SQL 服务支持任何 JDBC 连接器,但是 Sponge 的 Forge 实现只包含最常见的:

  • MySQL

  • SQlite

  • H2

警告

因为 SQLite 有着诸多的限制,所以强烈建议不要使用它,除非是为了向旧版本兼容。H2 是我们建议的文件支持的数据库实现。

使用方法

可以通过插件的服务管理器访问数据源(Data Source):

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 URL,你应该调用 SqlService#getConnectionUrlFromAlias(String) 方法,并传入一个对应特定 JDBC URL 的别名,相应别名的映射表存储在 Sponge 的全局配置文件( config/sponge/global.conf )中,并位于 sponge.sql.aliases 下。

SQL 服务提供池连接,因此从返回的 DataSource 中获取连接不需要付出多大代价。因此,我们建议不要保持连接,而像上面的示例那样做,也就是使用完就关闭它们。所有的 PreparedStatementResultSet 也应该在使用完后关闭,你可以使用 object.close() ,也可以使用一个 Try With Resources 块,事实上我们更建议后者。

NoSQL

Sponge 目前不提供任何特别的针对 NoSQL 数据库(MongoDB 等)的抽象。希望使用 NoSQL 数据库的插件必须自己处理数据库连接。