2017-08-12 8 views
-3

私の問題は、サーバが70%のtpsの損失を遅らせるように、取得レベルで更新のトロイがあるということです。MySQLの遅れget(SELECT)

public static int getCoins(Player player) { 
    try { 
     PreparedStatement q = Main.sql.prepareStatement("SELECT Coins FROM Players WHERE Players_UUID = ?"); 
     q.setString(1, player.getUniqueId().toString()); 

     int coins= 0; 
     ResultSet rs = q.executeQuery(); 

     while(rs.next()){ 
      balance = rs.getInt("Coins"); 
     } 

     q.close(); 

     return coins; 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return 0; 
} 
+0

質問は分かりません。 – Shadow

+0

コインテーブルにはいくつのエントリがありますか? – chrki

+0

Players_UUID列にユニークなインデックスがありますか? –

答えて

0

あなただけのデータでintまたはハッシュマップのフィールドを作成し、データが変更された場合は、すべてのX時間をチェックし、SQLクエリにコインを取得するたびに行う必要はありません。

変更があれば、mysqlサーバに更新を送信し、そのデータが2つのハッシュマップ/ intフィールドのように保存されたことをマークします。

hashmap1 =データベースのデータ hashmap2 = hashmap1とhashmap2が更新されません同じである場合は、サーバーのデータ

更新は、schedulerAsyncやthreadのような非同期関数で行います。ここで

同様の例:私はそのではないでしょう1秒ごとに取得しないので、もしあなたがBDD内のデータを変更した場合ので、それがサーバー上で変更されませんを行う方法が表示されない

package test; 

import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Map.Entry; 
import java.util.UUID; 
import java.util.concurrent.ConcurrentHashMap; 

import org.bukkit.entity.Player; 
import org.bukkit.entity.Zombie; 
import org.bukkit.event.EventHandler; 
import org.bukkit.event.Listener; 
import org.bukkit.event.entity.EntityDeathEvent; 
import org.bukkit.plugin.java.JavaPlugin; 
import org.bukkit.scheduler.BukkitRunnable; 

import com.mysql.jdbc.Connection; 

public class Event extends JavaPlugin implements Listener { 

    // Mysql update data 
    public static ConcurrentHashMap<UUID, Integer> player_zombiekills = new ConcurrentHashMap<UUID, Integer>(); 

    // Mysql connection data 
    public static Connection connection; 
    private String host = "localhost"; 
    private String database = "DB"; 
    private String username = "user"; 
    private String password = "123"; 
    private int port = 3306; 

    //Kill zombie event 
    @EventHandler 
    public void zombieDeath(EntityDeathEvent eve) { 
     if (!(eve.getEntity() instanceof Zombie)) return; // Stop if death is not zombie 
     if (!(eve.getEntity().getKiller() instanceof Player)) return; // Stop if killer is not player 
     UUID uid = eve.getEntity().getKiller().getUniqueId(); // Save player uuid 
     if (player_zombiekills.contains(uid)) player_zombiekills.put(uid, 0); // Set kills 0 if not exist in hashmap 
     player_zombiekills.put(uid, player_zombiekills.get(uid) + 1); // plus 1 kills value 
    } 

    //On enable connection 
    public void onEnable() { 
     try { 
      if (connection != null && !connection.isClosed()) return; 
      Class.forName("com.mysql.jdbc.Driver"); 
      connection = (Connection) DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password); 
      if (!connection.isClosed()) System.out.println("[MySQL] " + "Connected to '" + database + "'"); 
     } catch (Exception e) { 
      System.err.println("[MySQL] " + e.getMessage()); 
     } 

     new BukkitRunnable() { 
      public void run() { 
       // for updates 
       for (Entry<UUID, Integer> ent : player_zombiekills.entrySet()) { 
        try { 
         // send update 
         connection.createStatement().executeUpdate("UPDATE `tablename` SET `zombiekills`=`zombiekills`+" + ent.getValue() + " WHERE `uuid`='" + ent.getKey().toString() + "'"); 
         // Sucess remove entry from hashmap to reset kills 
         player_zombiekills.remove(ent.getKey()); 
        } catch (SQLException e) { // If error 
         System.err.println("[MySQL] " + e.getMessage()); // Print error in console 
        } 
       } 
      } 
     }.runTaskTimerAsynchronously(this, 20, 20 * 60 * 10); // Run async loop every 10 minutes 
    } 
} 
-1

私は非同期で最適化しましたが、返品なしにコインを取得するには...

+0

は "pending_get_list"のようなリストにプレーヤーを追加し、次の非同期タスクではmysqlが任意のフィールドにデータを選択して保存します。 "pending_sync_list"のような別のリストへの変更を修正し、次の非同期タスクでmysqlを更新する場合。 – xXNurioXx

+0

可能な例はありますか? – Mael

+0

私はすでにhttps://stackoverflow.com/a/45652166/7343009の例を送っています – xXNurioXx