Menü
💬 Forum 📦 Kaynaklar 🛒 Mağaza ⛏️ Sunucular ⚔️ Klanlar 📰 Blog 🏆 Liderlik 👥 Üyeler 🎖️ Rütbeler
0 üye online 👥 15 toplam üye 📝 Bugün 0 konu 💬 Bugün 0 mesaj

📖 Rehber Minecraft Plugin'de MySQL Kullanımı: HikariCP ile Bağlantı Havuzu

orginscorel · 29 gün önce · 1 gönderi · 9 görüntülenme
#1

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

Cevap yazabilmek için giriş yap.