My S Q L Score Service に関するサービス層・業務処理を担当します。

13Fields
3Constructors
42Methods
789Lines
Package
com.example.rankingplugin
Source
MySQLScoreService.java
Kind
class
Roles
DB / 永続化非同期 / スケジューラ初期化 / ブートストラップサービス層
このクラスにも章立て解説を追加しています。 自動抽出の一覧だけでなく、下の『重点クラスの詳細解説』で読む順番・内部サブシステム・変更時の注意点まで追えます。 全クラス章立てガイドを見る
サブシステム横断ガイドもあります。 このクラスを含む上位の流れは こちらの処理遷移図ページ から読むと把握しやすいです。

クラス説明

クラス直前の Javadoc は見つかりませんでした。ソースとメソッド構成から責務を補完しています。

責務と見どころ

重点クラスの詳細解説

My S Q L Score Service に関するサービス層・業務処理を担当します。(root) パッケージの中でも 789 行規模の中核クラスで、永続化境界・スケジューラが一か所に集まっています。中規模クラス群の中では変更影響が広く、章立てで読む価値が高いため重点解説へ追加しています。

最初に追う読む順番

  1. MySQLScoreService
    依存オブジェクトと初期状態を束ね、このクラスが担当するランタイムの前提を固めます。
  2. initTablesAndCaches
    不足テーブル・設定・内部状態を先に揃える入口です。変更を入れる前提条件の確認地点になります。
  3. loadLastRolloverMonth
    実体や対象状態を作る段階で、後続フローがどのデータを前提に動くかを掴めます。
  4. loadMonthlyTop
    実体や対象状態を作る段階で、後続フローがどのデータを前提に動くかを掴めます。
  5. enqueueDelta
    enqueueDelta の主要処理を担当します。
  6. saveScore
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。
  7. saveLastRolloverMonth
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。
  8. saveMonthlyHistory
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。
  9. saveAll
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。

内部サブシステムの地図

代表フロー詳解

変更時の注意点

外部接点

主な永続化テーブル

SQL 文字列から抽出できた主要テーブルです。スキーマ変更時の確認用です。

scoresmonthly_scoreshighscoresreward_recordsIF

フィールド

VisibilityTypeName役割
privateDataSourcedsDB 接続元を保持します。
privateJavaPluginpluginプラグイン本体参照です。
privateVerifiedScorePlayersverifiedPlayersverifiedPlayers の状態を保持します。
privateConcurrentMap<String, Long>cacheプレイヤー→スコア(メイン参照はここ)
privateAtomicReference<ConcurrentHashMap<String, Long>>pendingDeltaRefpendingDeltaRef の状態を保持します。
privateAtomicReference<ConcurrentHashMap<String, Long>>pendingSetRefpendingSetRef の状態を保持します。
privateBukkitTaskflushTask非同期処理やスケジューラ制御に使うハンドルです。
privateBukkitTaskexternalRefreshTask非同期処理やスケジューラ制御に使うハンドルです。
privateAtomicLongrevisionrevision の状態を保持します。
privateObjectsnapshotLocksnapshotLock の状態を保持します。
privateLiveSnapshotliveSnapshotliveSnapshot の状態を保持します。
privateMonthlyTopSnapshotmonthlyTopSnapshotmonthlyTopSnapshot の状態を保持します。
privateZoneIdSCORE_TZSCORE_TZ の状態を保持します。

コンストラクタ / 初期化

Signature説明主要呼び出し
public MySQLScoreService(JavaPlugin plugin, DataSource ds)推奨:共有 DataSource 受け取りコンストラクタ主要呼び出しなし
public MySQLScoreService(JavaPlugin plugin, DataSource ds, VerifiedScorePlayers verifiedPlayers)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。initTablesAndCaches → getScheduler → runTaskTimerAsynchronously → flushAllPending → getLogger → warning
public MySQLScoreService(JavaPlugin plugin, MySQLConfig cfg)互換:古い呼び出し用(内部で共有プールに委譲)init

メソッド索引

NameVisibilityKind説明
getDataSourcepublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
MySQLScoreServicepublicコンストラクタ推奨:共有 DataSource 受け取りコンストラクタ
MySQLScoreServicepublicコンストラクタ依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
MySQLScoreServicepublicコンストラクタ互換:古い呼び出し用(内部で共有プールに委譲)
isEligiblePlayerNameprivateメソッド条件判定を行い、後続処理の分岐に使える真偽値を返します。
initTablesAndCachesprivateメソッド初期化と各種登録を行い、機能を有効化します。
getScorepublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getRankpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
saveScorepublicメソッド★重要: 以前は saveScore() が即DBへ「絶対値更新」していたが、 addScore() が「deltaバッチ反映」になった時点で saveScore() と addScore() の順序が崩れると「後からdeltaが足される」事故が起きる。
addScorepublicメソッドaddScore の主要処理を担当します。
flushpublicメソッドflush の主要処理を担当します。
flushAllPendingprivateメソッドDB への問い合わせまたは更新処理を担当します。
loadLastRolloverMonthpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
saveLastRolloverMonthpublicメソッド状態を永続化または更新し、最新状態へ反映します。
saveMonthlyHistorypublicメソッド状態を永続化または更新し、最新状態へ反映します。
getAllScorespublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getTopScorespublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getCacheViewpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getRevisionpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getTopScoresCachedpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getRanksCachedpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getLiveSnapshotpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
refreshFromExternalDbprivateメソッドrefreshFromExternalDb の主要処理を担当します。
hasScoresTaggedForMonthpublicメソッド条件判定を行い、後続処理の分岐に使える真偽値を返します。
getScoresForStoredMonthpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
clearCurrentScoresForMonthpublicメソッドDB への問い合わせまたは更新処理を担当します。
saveAllpublicメソッド状態を永続化または更新し、最新状態へ反映します。
saveMonthlyScorespublicメソッド状態を永続化または更新し、最新状態へ反映します。
updateHighScorespublicメソッド状態を永続化または更新し、最新状態へ反映します。
clearCurrentScorespublicメソッドDB への問い合わせまたは更新処理を担当します。
getMonthlyToppublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getMonthlyTopCachedpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
loadMonthlyTopprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getHighToppublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
shutdownpublicメソッド共有プールはここでは閉じない(DbPool.
fetchMapprivateメソッドDB への問い合わせまたは更新処理を担当します。
fetchTopprivateメソッドfetchTop の主要処理を担当します。
enqueueDeltapublicメソッドenqueueDelta の主要処理を担当します。
hasMonthlyScorespublicメソッド条件判定を行い、後続処理の分岐に使える真偽値を返します。
hasAnyCurrentScorespublicメソッド条件判定を行い、後続処理の分岐に使える真偽値を返します。
wasBackfilledpublicメソッドDB への問い合わせまたは更新処理を担当します。
markBackfilledpublicメソッドDB への問い合わせまたは更新処理を担当します。

メソッド詳細

getDataSource

メソッドpublic
public DataSource getDataSource()

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

MySQLScoreService

コンストラクタpublic
public MySQLScoreService(JavaPlugin plugin, DataSource ds)

推奨:共有 DataSource 受け取りコンストラクタ

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

MySQLScoreService

コンストラクタpublic
public MySQLScoreService(JavaPlugin plugin, DataSource ds, VerifiedScorePlayers verifiedPlayers)

依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。

引数

throws

なし

主要な呼び出し順

initTablesAndCachesgetSchedulerrunTaskTimerAsynchronouslyflushAllPendinggetLoggerwarningrefreshFromExternalDb

MySQLScoreService

コンストラクタpublic
public MySQLScoreService(JavaPlugin plugin, MySQLConfig cfg)

互換:古い呼び出し用(内部で共有プールに委譲)

引数

throws

なし

主要な呼び出し順

init

isEligiblePlayerName

メソッドprivate
private boolean isEligiblePlayerName(String name)

条件判定を行い、後続処理の分岐に使える真偽値を返します。

引数

throws

なし

主要な呼び出し順

isEligibleStoredPlayerName

initTablesAndCaches

メソッドprivate
private void initTablesAndCaches()

初期化と各種登録を行い、機能を有効化します。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdatescoresmonthly_scoreshighscoresreward_recordsgetLogger

getScore

メソッドpublic
public long getScore(String player)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

isEligiblePlayerNamegetConnectionprepareStatementsetStringexecuteQuerynextgetLong

getRank

メソッドpublic
public int getRank(String playerName)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

isEligiblePlayerNamegetLiveSnapshotranksgetOrDefault

saveScore

メソッドpublic
public void saveScore(String player, long score)

★重要: 以前は saveScore() が即DBへ「絶対値更新」していたが、 addScore() が「deltaバッチ反映」になった時点で saveScore() と addScore() の順序が崩れると「後からdeltaが足される」事故が起きる。

引数

throws

なし

主要な呼び出し順

isEligiblePlayerNamegetOrDefaultpublishScoreChangedremoveincrementAndGet

addScore

メソッドpublic
public long addScore(String player, long delta)

addScore の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getScoreisEligiblePlayerNamegetOrDefaultmergepublishScoreChangedincrementAndGet

flush

メソッドpublic
public void flush()

flush の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

flushAllPending

flushAllPending

メソッドprivate
private void flushAllPending()

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getAndSetisEmptynowscoresgetConnectionsetAutoCommitprepareStatemententrySet

loadLastRolloverMonth

メソッドpublic
public YearMonth loadLastRolloverMonth(ZoneId tz)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementexecuteQuerynextgetStringisBlankparsenow

saveLastRolloverMonth

メソッドpublic
public void saveLastRolloverMonth(YearMonth ym)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementtoStringsetStringexecuteUpdateprintStackTrace

saveMonthlyHistory

メソッドpublic
public void saveMonthlyHistory(YearMonth month, Map<String, Long> scores)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

formatgetYeargetMonthValueformattedgetConnectioncreateStatementsetAutoCommitexecuteUpdate

getAllScores

メソッドpublic
public Map<String, Long> getAllScores()

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

entrySetisEligiblePlayerNamegetKeygetValueunmodifiableMap

getTopScores

メソッドpublic
public List<Entry<String, Long>> getTopScores(int lim)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

maxgetLiveSnapshottopList

getCacheView

メソッドpublic
public Map<String, Long> getCacheView()

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

getRevision

メソッドpublic
public long getRevision()

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

getTopScoresCached

メソッドpublic
public List<Map.Entry<String, Long>> getTopScoresCached(int limit, long ttlMs)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

getLiveSnapshottopList

getRanksCached

メソッドpublic
public Map<String, Integer> getRanksCached(long ttlMs, int topLimit)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

getLiveSnapshotranks

getLiveSnapshot

メソッドpublic
public LiveSnapshot getLiveSnapshot(int topLimit, long ttlMs)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

maxcurrentTimeMillisrevisionlimitcreatedAtMsentrySetisEligiblePlayerNamegetKey

refreshFromExternalDb

メソッドprivate
private void refreshFromExternalDb()

refreshFromExternalDb の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

fetchMapisEmptyaddAllkeySetentrySetgetKeyisEligiblePlayerNamecontains

hasScoresTaggedForMonth

メソッドpublic
public boolean hasScoresTaggedForMonth(YearMonth ym)

条件判定を行い、後続処理の分岐に使える真偽値を返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetStringtoStringexecuteQuerynextprintStackTrace

getScoresForStoredMonth

メソッドpublic
public Map<String, Long> getScoresForStoredMonth(YearMonth ym)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetStringtoStringexecuteQuerynextgetStringisEligiblePlayerName

clearCurrentScoresForMonth

メソッドpublic
public void clearCurrentScoresForMonth(YearMonth ym)

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetStringtoStringexecuteUpdateprintStackTracerefreshFromExternalDb

saveAll

メソッドpublic
public void saveAll()

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

flushAllPendingprintStackTracecancel

saveMonthlyScores

メソッドpublic
public void saveMonthlyScores(YearMonth month, Map<String, Long> scores)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

monthly_scoresgetConnectionprepareStatementsetAutoCommitentrySetisEligiblePlayerNamegetKeysetString

updateHighScores

メソッドpublic
public void updateHighScores(Map<String, Long> highs)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

highscoresgetConnectionprepareStatementsetAutoCommitentrySetisEligiblePlayerNamegetKeysetString

clearCurrentScores

メソッドpublic
public void clearCurrentScores()

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteprintStackTraceclearincrementAndGet

getMonthlyTop

メソッドpublic
public List<Map.Entry<String, Long>> getMonthlyTop(YearMonth month, int limit)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

loadMonthlyTop

getMonthlyTopCached

メソッドpublic
public List<Map.Entry<String, Long>> getMonthlyTopCached(YearMonth month, int limit, long ttlMs)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

currentTimeMillismonthequalslimitcreatedAtMstopListsubListmin

loadMonthlyTop

メソッドprivate
private List<Map.Entry<String, Long>> loadMonthlyTop(YearMonth month, int limit)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetIntgetYeargetMonthValueexecuteQuerynextgetString

getHighTop

メソッドpublic
public List<Entry<String, Long>> getHighTop(int lim)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

fetchTop

shutdown

メソッドpublic
public void shutdown()

共有プールはここでは閉じない(DbPool.

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

fetchMap

メソッドprivate
private Map<String, Long> fetchMap(String tbl, String c1, String c2)

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteQuerynextgetStringgetLongprintStackTrace

fetchTop

メソッドprivate
private List<Map.Entry<String, Long>> fetchTop(String tbl, String keyColumn, String valueColumn, int limit)

fetchTop の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

fetchMapentrySetisEligiblePlayerNamegetKeyentrygetValuesortcomparingByValue

enqueueDelta

メソッドpublic
public void enqueueDelta(String player, long delta)

enqueueDelta の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

isEligiblePlayerNamemerge

hasMonthlyScores

メソッドpublic
public boolean hasMonthlyScores(YearMonth ym)

条件判定を行い、後続処理の分岐に使える真偽値を返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetIntgetYeargetMonthValueexecuteQuerynextprintStackTrace

hasAnyCurrentScores

メソッドpublic
public boolean hasAnyCurrentScores()

条件判定を行い、後続処理の分岐に使える真偽値を返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementexecuteQuerynextprintStackTrace

wasBackfilled

メソッドpublic
public boolean wasBackfilled(YearMonth ym)

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetStringexecuteQuerynextprintStackTrace

markBackfilled

メソッドpublic
public void markBackfilled(YearMonth ym)

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementsetStringexecuteUpdateprintStackTrace

代表的な処理フロー

  1. 初期化フロー
    MySQLScoreService → initTablesAndCaches → getScheduler → runTaskTimerAsynchronously → flushAllPending → getLogger
    依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
  2. 初期化フロー
    MySQLScoreService → init
    互換:古い呼び出し用(内部で共有プールに委譲)
  3. initTablesAndCaches フロー
    initTablesAndCaches → getConnection → createStatement → executeUpdate → scores → monthly_scores
    初期化と各種登録を行い、機能を有効化します。
  4. loadLastRolloverMonth フロー
    loadLastRolloverMonth → getConnection → prepareStatement → executeQuery → next → getString
    必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
  5. loadMonthlyTop フロー
    loadMonthlyTop → getConnection → prepareStatement → setInt → getYear → getMonthValue
    必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

外部との接点

Web ルート

このクラス内に目立つ Web ルート定義は見つかりませんでした。

SQL / テーブル

scoresmonthly_scoreshighscoresreward_recordsIFscoreDB

関連クラス

補足