Minecraft Plugin'de MySQL: HikariCP ile Veritabanı Bağlantısı
Minecraft plugin'lerinde YAML veri depolama başlangıç için yeterli olsa da büyük ve çok sunuculu sistemler için MySQL şarttır. HikariCP, Java uygulamalarında kullanılan en hızlı bağlantı havuzu kütüphanesidir.
pom.xml'e HikariCP Ekleme
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
Bağlantı Havuzu Sınıfı
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DatabaseManager {
private HikariDataSource dataSource;
public DatabaseManager(String host, int port, String db, String user, String pass) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://" + host + ":" + port + "/" + db);
config.setUsername(user);
config.setPassword(pass);
config.setMaximumPoolSize(10);
config.setMinimumIdle(2);
config.setConnectionTimeout(30000);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
dataSource = new HikariDataSource(config);
}
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public void close() {
if (dataSource != null) dataSource.close();
}
}
Veri Okuma
try (Connection conn = dbManager.getConnection();
PreparedStatement ps = conn.prepareStatement(
"SELECT balance FROM players WHERE uuid = ?")) {
ps.setString(1, player.getUniqueId().toString());
ResultSet rs = ps.executeQuery();
if (rs.next()) {
double balance = rs.getDouble("balance");
}
} catch (SQLException e) {
getLogger().severe("Veritabanı hatası: " + e.getMessage());
}
Veri Yazma
try (Connection conn = dbManager.getConnection();
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO players (uuid, name, balance) VALUES (?, ?, ?) " +
"ON DUPLICATE KEY UPDATE name = ?, balance = ?")) {
ps.setString(1, player.getUniqueId().toString());
ps.setString(2, player.getName());
ps.setDouble(3, 1000.0);
ps.setString(4, player.getName());
ps.setDouble(5, 1000.0);
ps.executeUpdate();
} catch (SQLException e) {
getLogger().severe("Kayıt hatası: " + e.getMessage());
}
Async İşlemler
DB işlemleri asla main thread'de çalıştırmayın — TPS düşer:
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
// DB işlemi burada
double balance = getBalance(player.getUniqueId());
Bukkit.getScheduler().runTask(plugin, () -> {
// UI güncelleme main thread'de
player.sendMessage("Bakiyeniz: " + balance);
});
});
💡 Etkileşim için giriş yap.