- Баллы
- 76
Всем привет
Есть такая проблема..
Имеется самописный плагин, внедряющий новую механику в игру. Каждый раз, когда игрок взаимодействует с данной механикой, плагин обращается к бд mysql
В последнее время я заметил, что сервер крашится и офается, а причиной краша является долгий ответ от бд, причем после старта сервера какое-то время (мб час, два или больше, не измерял) все нормально, без крашей. Сама бд стоит на соседней машине, и по сути задержки должны быть минимальны
Вот сам краш
А вот ошибка после краша
Вот сам код метода createStatement, который нулит
HikariDataSource инициализируется посредством вызова метода initialize в onEnable главного класса, тут косяка тоже нет.
Ну и такой еще вопрос: может быть стоило бы сделать систему кеширования нужных для плагина данных, чтобы каждые несколько тиков не обращаться к бд (пускай даже в асинхроне)? Работать это будет так: при включении плагина из бд подтягивается вся нужная инфа и хранится в мапах, листах и т.д., а при выключении плагина из этих мап, листов и т.д. вся инфа сохраняется обратно в бд, тем самым обращение к бд будет только 2 раза. Может, причина крашей как раз в этом: много обращений к бд?
Есть такая проблема..
Имеется самописный плагин, внедряющий новую механику в игру. Каждый раз, когда игрок взаимодействует с данной механикой, плагин обращается к бд mysql
В последнее время я заметил, что сервер крашится и офается, а причиной краша является долгий ответ от бд, причем после старта сервера какое-то время (мб час, два или больше, не измерял) все нормально, без крашей. Сама бд стоит на соседней машине, и по сути задержки должны быть минимальны
Вот сам краш
Код:
[Paper Watchdog Thread/ERROR]: ------------------------------
[Paper Watchdog Thread/ERROR]: Current Thread: Server thread
[Paper Watchdog Thread/ERROR]: PID: 17 | Suspended: false | Native: false | State: TIMED_WAITING
[Paper Watchdog Thread/ERROR]: Stack:
[Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
[Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234)
[Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.SynchronousQueue$TransferQueue.awaitFulfill(SynchronousQueue.java:761)
[Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.SynchronousQueue$TransferQueue.transfer(SynchronousQueue.java:689)
[Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
[Paper Watchdog Thread/ERROR]: com.zaxxer.hikari.util.ConcurrentBag.borrow(ConcurrentBag.java:151)
[Paper Watchdog Thread/ERROR]: com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:180)
[Paper Watchdog Thread/ERROR]: com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
[Paper Watchdog Thread/ERROR]: com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:100)
[Paper Watchdog Thread/ERROR]: ru.rezero.mec.database.Table.getConnection(Table.java:157)
[Paper Watchdog Thread/ERROR]: ru.rezero.mec.database.Table.createStatement(Table.java:152)
[Paper Watchdog Thread/ERROR]: ru.rezero.mec.database.Permissions.load(Permissions.java:133)
[Paper Watchdog Thread/ERROR]: ru.rezero.mec.listeners.Events.onLoggedIn(Events.java:1068)
[Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor989.execute(Unknown Source)
[Paper Watchdog Thread/ERROR]: app//org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69)
[Paper Watchdog Thread/ERROR]: app//org.bukkit.plugin.EventExecutor$$Lambda$4895/0x0000000841192840.execute(Unknown Source)
[Paper Watchdog Thread/ERROR]: app//co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:76)
[Paper Watchdog Thread/ERROR]: app//org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70)
[Paper Watchdog Thread/ERROR]: app//org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:624)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.PlayerList.postChunkLoadJoin(PlayerList.java:357)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.PlayerList.lambda$a$1(PlayerList.java:304)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.PlayerList$$Lambda$6994/0x0000000842285040.run(Unknown Source)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.PlayerConnection.tick(PlayerConnection.java:316)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.NetworkManager.a(NetworkManager.java:592)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.ServerConnection.c(ServerConnection.java:173)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.MinecraftServer.b(MinecraftServer.java:1582)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.DedicatedServer.b(DedicatedServer.java:439)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.MinecraftServer.a(MinecraftServer.java:1402)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1134)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:292)
[Paper Watchdog Thread/ERROR]: app//net.minecraft.server.v1_16_R3.MinecraftServer$$Lambda$3142/0x0000000840860c40.run(Unknown Source)
А вот ошибка после краша
Код:
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: java.sql.SQLTransientConnectionException: HikariPool-3 - Connection is not available, request timed out after 30000ms.
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:100)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.database.Table.getConnection(Table.java:157)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.database.Table.createStatement(Table.java:152)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.database.Towns.load(Towns.java:193)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.groups.TownInfo.load(TownInfo.java:760)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.managers.InfoManager.getInfoByTown(InfoManager.java:88)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.managers.InfoManager.getInfo(InfoManager.java:40)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.groups.GroupInfo.getWar(GroupInfo.java:344)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at ru.rezero.mec.managers.NameTagManager$2$1.run(NameTagManager.java:145)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftTask.run(CraftTask.java:100)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:58)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[02:01:47] [Craft Scheduler Thread - 91 - Mechanic/WARN]: at java.base/java.lang.Thread.run(Thread.java:829)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: java.lang.NullPointerException
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.database.Table.createStatement(Table.java:152)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.database.Towns.load(Towns.java:193)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.groups.TownInfo.load(TownInfo.java:760)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.managers.InfoManager.getInfoByTown(InfoManager.java:88)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.managers.InfoManager.getInfo(InfoManager.java:40)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.groups.GroupInfo.getWar(GroupInfo.java:344)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at ru.rezero.mec.managers.NameTagManager$2$1.run(NameTagManager.java:145)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftTask.run(CraftTask.java:100)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:58)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[02:01:47] [Craft Scheduler Thread - 76 - Mechanic/WARN]: at java.base/java.lang.Thread.run(Thread.java:829)
[02:01:47] [Craft Scheduler Thread - 44 - Mechanic/WARN]: [Mechanic] Plugin Mechanic v1.2.0 generated an exception while executing task 135
java.lang.NullPointerException: null
at ru.rezero.mec.database.Table.createStatement(Table.java:152) ~[?:?]
at ru.rezero.mec.database.Towns.getColumn(Towns.java:158) ~[?:?]
at ru.rezero.mec.database.Towns.save(Towns.java:727) ~[?:?]
at ru.rezero.mec.managers.SaveManager.execute(SaveManager.java:34) ~[?:?]
at ru.rezero.mec.managers.SaveManager$1.run(SaveManager.java:23) ~[?:?]
at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftTask.run(CraftTask.java:100) ~[patched_1.16.5.jar:git-Airplane-"9f0a29b"]
at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:58) ~[patched_1.16.5.jar:git-Airplane-"9f0a29b"]
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[patched_1.16.5.jar:git-Airplane-"9f0a29b"]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:829) [?:?]
Вот сам код метода createStatement, который нулит
Код:
public PreparedStatement createStatement(String sql) throws SQLException {
return this.getConnection().prepareStatement(sql);
}
public Connection getConnection() {
try {
return hikariDataSource.getConnection();
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
Ну и такой еще вопрос: может быть стоило бы сделать систему кеширования нужных для плагина данных, чтобы каждые несколько тиков не обращаться к бд (пускай даже в асинхроне)? Работать это будет так: при включении плагина из бд подтягивается вся нужная инфа и хранится в мапах, листах и т.д., а при выключении плагина из этих мап, листов и т.д. вся инфа сохраняется обратно в бд, тем самым обращение к бд будет только 2 раза. Может, причина крашей как раз в этом: много обращений к бд?