Skip to content

Commit e09499e

Browse files
authored
Merge pull request #20 from JavaJava19/fix/mysql_connection
MySQLのコネクションが閉じられない問題
2 parents 3da00c7 + 84f3fd3 commit e09499e

File tree

1 file changed

+69
-100
lines changed

1 file changed

+69
-100
lines changed

src/main/java/com/github/elic0de/thejpspit/database/MySqlDatabase.java

Lines changed: 69 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,15 @@
77
import com.github.elic0de.thejpspit.player.PitPlayer;
88
import com.github.elic0de.thejpspit.player.Preferences;
99
import com.zaxxer.hikari.HikariDataSource;
10+
import org.bukkit.Bukkit;
11+
import org.bukkit.entity.Player;
12+
1013
import java.nio.charset.StandardCharsets;
11-
import java.sql.Connection;
12-
import java.sql.PreparedStatement;
13-
import java.sql.ResultSet;
14-
import java.sql.SQLException;
15-
import java.sql.Statement;
14+
import java.sql.*;
1615
import java.util.Optional;
1716
import java.util.Properties;
1817
import java.util.UUID;
19-
import java.util.concurrent.CompletableFuture;
2018
import java.util.logging.Level;
21-
import org.bukkit.Bukkit;
22-
import org.bukkit.entity.Player;
2319

2420
public class MySqlDatabase extends Database {
2521

@@ -41,8 +37,7 @@ private void setConnection() {
4137
final Settings settings = plugin.getSettings();
4238

4339
// Create jdbc driver connection url
44-
final String jdbcUrl = "jdbc:mysql://" + settings.getMySqlHost() + ":" + settings.getMySqlPort() + "/"
45-
+ settings.getMySqlDatabase() + settings.getMySqlConnectionParameters();
40+
final String jdbcUrl = "jdbc:mysql://" + settings.getMySqlHost() + ":" + settings.getMySqlPort() + "/" + settings.getMySqlDatabase() + settings.getMySqlConnectionParameters();
4641
dataSource = new HikariDataSource();
4742
dataSource.setJdbcUrl(jdbcUrl);
4843

@@ -104,45 +99,38 @@ public Optional<PitPlayer> getPitPlayer(Player player) {
10499

105100
@Override
106101
public Optional<PitPlayer> getPitPlayer(UUID uuid) {
107-
try (PreparedStatement statement = getConnection().prepareStatement(
108-
format("""
102+
try (Connection connection = getConnection()) {
103+
try (PreparedStatement statement = connection.prepareStatement(format("""
109104
SELECT `kills`, `streaks`, `bestStreaks`, `deaths`, `rating`, `bestRating`, `xp`, `preferences`
110105
FROM `%user_data%`
111106
WHERE `uuid`=?"""))) {
112107

113-
statement.setString(1, uuid.toString());
114-
115-
final ResultSet resultSet = statement.executeQuery();
116-
if (resultSet.next()) {
117-
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
118-
return Optional.of(new PitPlayer(Bukkit.getPlayer(uuid),
119-
resultSet.getLong("kills"),
120-
resultSet.getLong("streaks"),
121-
resultSet.getLong("bestStreaks"),
122-
resultSet.getLong("deaths"),
123-
resultSet.getDouble("rating"),
124-
resultSet.getDouble("bestRating"),
125-
resultSet.getDouble("xp"),
126-
Optional.of(plugin.getGson().fromJson(preferences, Preferences.class))
127-
));
108+
statement.setString(1, uuid.toString());
109+
110+
final ResultSet resultSet = statement.executeQuery();
111+
if (resultSet.next()) {
112+
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
113+
return Optional.of(new PitPlayer(Bukkit.getPlayer(uuid), resultSet.getLong("kills"), resultSet.getLong("streaks"), resultSet.getLong("bestStreaks"), resultSet.getLong("deaths"), resultSet.getDouble("rating"), resultSet.getDouble("bestRating"), resultSet.getDouble("xp"), Optional.of(plugin.getGson().fromJson(preferences, Preferences.class))));
114+
}
128115
}
129116
} catch (SQLException e) {
130-
Bukkit.getLogger().log(Level.SEVERE,
131-
"Failed to fetch a player from uuid from the database", e);
117+
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch a player from uuid from the database", e);
132118
}
133119
return Optional.empty();
134120
}
135121

136122
@Override
137123
public Optional<PitPreferences> getPitPreferences() {
138-
try (PreparedStatement statement = getConnection().prepareStatement(format("""
139-
SELECT `preferences`
140-
FROM `%pit_data%`
141-
"""))) {
142-
final ResultSet resultSet = statement.executeQuery();
143-
if (resultSet.next()) {
144-
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
145-
return Optional.of(plugin.getGson().fromJson(preferences, PitPreferences.class));
124+
try (Connection connection = getConnection()) {
125+
try (PreparedStatement statement = connection.prepareStatement(format("""
126+
SELECT `preferences`
127+
FROM `%pit_data%`
128+
"""))) {
129+
final ResultSet resultSet = statement.executeQuery();
130+
if (resultSet.next()) {
131+
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
132+
return Optional.of(plugin.getGson().fromJson(preferences, PitPreferences.class));
133+
}
146134
}
147135
} catch (SQLException e) {
148136
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch user data from table by UUID", e);
@@ -152,46 +140,37 @@ public Optional<PitPreferences> getPitPreferences() {
152140

153141
@Override
154142
public Optional<OfflinePitPlayer> getOfflinePitPlayer(UUID uuid) {
155-
try (PreparedStatement statement = getConnection().prepareStatement(
156-
format("""
143+
try (Connection connection = getConnection()) {
144+
try (PreparedStatement statement = connection.prepareStatement(format("""
157145
SELECT `kills`, `streaks`, `bestStreaks`, `deaths`, `rating`, `bestRating`, `xp`
158146
FROM `%user_data%`
159147
WHERE `uuid`=?"""))) {
160148

161-
statement.setString(1, uuid.toString());
162-
163-
final ResultSet resultSet = statement.executeQuery();
164-
if (resultSet.next()) {
165-
return Optional.of(new OfflinePitPlayer(uuid,
166-
resultSet.getLong("kills"),
167-
resultSet.getLong("streaks"),
168-
resultSet.getLong("bestStreaks"),
169-
resultSet.getLong("deaths"),
170-
resultSet.getDouble("rating"),
171-
resultSet.getDouble("bestRating"),
172-
resultSet.getDouble("xp")
173-
));
149+
statement.setString(1, uuid.toString());
150+
151+
final ResultSet resultSet = statement.executeQuery();
152+
if (resultSet.next()) {
153+
return Optional.of(new OfflinePitPlayer(uuid, resultSet.getLong("kills"), resultSet.getLong("streaks"), resultSet.getLong("bestStreaks"), resultSet.getLong("deaths"), resultSet.getDouble("rating"), resultSet.getDouble("bestRating"), resultSet.getDouble("xp")));
154+
}
174155
}
175156
} catch (SQLException e) {
176-
Bukkit.getLogger().log(Level.SEVERE,
177-
"Failed to fetch a player from uuid from the database", e);
157+
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch a player from uuid from the database", e);
178158
}
179159
return Optional.empty();
180160
}
181161

182162
@Override
183163
public Optional<Integer> getPlayerRanking(PitPlayer player, RankType type) {
184-
try {
164+
try (Connection connection = getConnection()) {
185165
String test = """
186-
SELECT uuid, rank
187-
FROM(SELECT `uuid`,
188-
RANK()
189-
OVER(ORDER BY %type% DESC)
190-
AS rank FROM `%user_data%`)
191-
WHERE `uuid`=?;
192-
""";
193-
try (PreparedStatement statement = getConnection().prepareStatement(
194-
format(test.replaceAll("%type%", type.name().toLowerCase())))) {
166+
SELECT uuid, rank
167+
FROM(SELECT `uuid`,
168+
RANK()
169+
OVER(ORDER BY %type% DESC)
170+
AS rank FROM `%user_data%`)
171+
WHERE `uuid`=?;
172+
""";
173+
try (PreparedStatement statement = connection.prepareStatement(format(test.replaceAll("%type%", type.name().toLowerCase())))) {
195174
statement.setString(1, player.getUniqueId().toString());
196175

197176
final ResultSet resultSet = statement.executeQuery();
@@ -200,54 +179,47 @@ public Optional<Integer> getPlayerRanking(PitPlayer player, RankType type) {
200179
}
201180
}
202181
} catch (SQLException e) {
203-
Bukkit.getLogger().log(Level.SEVERE,
204-
"Failed to fetch a player from uuid from the database", e);
205-
}
206-
return Optional.empty();
182+
Bukkit.getLogger().log(Level.SEVERE, "Failed to fetch a player from uuid from the database", e);
183+
} return Optional.empty();
207184
}
208185

209186
@Override
210187
public void createPitPlayer(Player player) {
211188
// Insert new player data into the database
212-
try {
213-
try (PreparedStatement statement = getConnection().prepareStatement(
214-
format("""
215-
INSERT INTO `%user_data%` (`uuid`,`username`,`preferences`)
216-
VALUES (?,?,?);"""))) {
189+
try (Connection connection = getConnection()) {
190+
try (PreparedStatement statement = connection.prepareStatement(format("""
191+
INSERT INTO `%user_data%` (`uuid`,`username`,`preferences`)
192+
VALUES (?,?,?);"""))) {
217193

218194
statement.setString(1, player.getUniqueId().toString());
219195
statement.setString(2, player.getName());
220196
statement.setBytes(3, plugin.getGson().toJson(Preferences.getDefaults()).getBytes(StandardCharsets.UTF_8));
221197
statement.executeUpdate();
222198
}
223199
} catch (SQLException e) {
224-
Bukkit.getLogger().log(Level.SEVERE,
225-
"Failed to insert a player into the database", e);
200+
Bukkit.getLogger().log(Level.SEVERE, "Failed to insert a player into the database", e);
226201
}
227202
}
228203

229204
@Override
230205
public void createPitPreferences(PitPreferences pitPreferences) {
231-
try {
232-
try (PreparedStatement statement = getConnection().prepareStatement(
233-
format("""
234-
INSERT INTO `%pit_data%` (`preferences`)
235-
VALUES (?);"""))) {
206+
try (Connection connection = getConnection()) {
207+
try (PreparedStatement statement = connection.prepareStatement(format("""
208+
INSERT INTO `%pit_data%` (`preferences`)
209+
VALUES (?);"""))) {
236210

237211
statement.setBytes(1, plugin.getGson().toJson(pitPreferences).getBytes(StandardCharsets.UTF_8));
238212
statement.executeUpdate();
239213
}
240214
} catch (SQLException e) {
241-
Bukkit.getLogger().log(Level.SEVERE,
242-
"Failed to insert a player into the database", e);
215+
Bukkit.getLogger().log(Level.SEVERE, "Failed to insert a player into the database", e);
243216
}
244217
}
245218

246219
@Override
247220
public void updateUserData(PitPlayer player) {
248-
try {
249-
try (PreparedStatement statement = getConnection().prepareStatement(
250-
format("""
221+
try (Connection connection = getConnection()) {
222+
try (PreparedStatement statement = connection.prepareStatement(format("""
251223
UPDATE `%user_data%`
252224
SET `kills`=?, `streaks`=?, `bestStreaks`=?, `deaths`=?, `rating`=?, `bestRating`=?, `xp`=?, `preferences`=?
253225
WHERE `uuid`=?"""))) {
@@ -263,18 +235,15 @@ public void updateUserData(PitPlayer player) {
263235
statement.setString(9, player.getUniqueId().toString());
264236
statement.executeUpdate();
265237
}
266-
267238
} catch (SQLException e) {
268-
Bukkit.getLogger().log(Level.SEVERE,
269-
"Failed to update user data for " + player.getName() + " on the database", e);
239+
Bukkit.getLogger().log(Level.SEVERE, "Failed to update user data for " + player.getName() + " on the database", e);
270240
}
271241
}
272242

273243
@Override
274244
public void updateUserData(OfflinePitPlayer player) {
275-
try {
276-
try (PreparedStatement statement = getConnection().prepareStatement(
277-
format("""
245+
try (Connection connection = getConnection()) {
246+
try (PreparedStatement statement = connection.prepareStatement(format("""
278247
UPDATE `%user_data%`
279248
SET `kills`=?, `streaks`=?, `deaths`=?, `rating`=?, `xp`=?
280249
WHERE `uuid`=?"""))) {
@@ -287,21 +256,21 @@ public void updateUserData(OfflinePitPlayer player) {
287256
statement.setString(6, player.getUniqueId().toString());
288257
statement.executeUpdate();
289258
}
290-
291259
} catch (SQLException e) {
292-
Bukkit.getLogger().log(Level.SEVERE,
293-
"Failed to update user data for " + player.getUniqueId().toString() + " on the database", e);
260+
Bukkit.getLogger().log(Level.SEVERE, "Failed to update user data for " + player.getUniqueId().toString() + " on the database", e);
294261
}
295262
}
296263

297264
@Override
298265
public void updatePitPreferences(PitPreferences pitPreferences) {
299-
try (PreparedStatement statement = getConnection().prepareStatement(format("""
300-
UPDATE `%pit_data%`
301-
SET `preferences` = ?
302-
"""))) {
303-
statement.setBytes(1, plugin.getGson().toJson(pitPreferences).getBytes(StandardCharsets.UTF_8));
304-
statement.executeUpdate();
266+
try (Connection connection = getConnection()) {
267+
try (PreparedStatement statement = connection.prepareStatement(format("""
268+
UPDATE `%pit_data%`
269+
SET `preferences` = ?
270+
"""))) {
271+
statement.setBytes(1, plugin.getGson().toJson(pitPreferences).getBytes(StandardCharsets.UTF_8));
272+
statement.executeUpdate();
273+
}
305274
} catch (SQLException e) {
306275
Bukkit.getLogger().log(Level.SEVERE, "Failed to update preferences in table", e);
307276
}

0 commit comments

Comments
 (0)