Skip to content
This repository was archived by the owner on Mar 9, 2026. It is now read-only.

Commit 226a7c9

Browse files
committed
cache mongoclient & fix long serialization
1 parent e0b539d commit 226a7c9

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

src/main/java/net/plexverse/enginebridge/modules/datastore/DataStorageModuleImpl.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.io.ByteArrayInputStream;
5555
import java.io.InputStream;
5656
import java.lang.reflect.Field;
57+
import java.lang.reflect.Modifier;
5758
import java.time.Instant;
5859
import java.util.ArrayList;
5960
import java.util.Date;
@@ -280,6 +281,10 @@ public <T extends StorableStructuredData> void storeStructuredData(@NonNull fina
280281
final String keyFieldName = keyField.getName();
281282
dataDocument.remove(keyFieldName);
282283

284+
// Ensure long fields are stored as int64 (not int32)
285+
// MongoDB's Document.parse() may convert small numbers to int32
286+
ensureLongFieldsAsInt64(dataDocument, data.getClass());
287+
283288
// Create document with _id and all data fields (excluding key field)
284289
final Document document = new Document("_id", key);
285290
document.putAll(dataDocument);
@@ -296,6 +301,41 @@ public <T extends StorableStructuredData> void storeStructuredData(@NonNull fina
296301
}
297302
}
298303

304+
/**
305+
* Ensures that long fields in the entity are stored as int64 (Long) in the MongoDB document,
306+
* not int32 (Integer). MongoDB's Document.parse() may convert small numbers to int32.
307+
*
308+
* @param document the MongoDB document to fix
309+
* @param entityClass the entity class to check for long fields
310+
*/
311+
private void ensureLongFieldsAsInt64(@NonNull final Document document, @NonNull final Class<?> entityClass) {
312+
for (final Field field : entityClass.getDeclaredFields()) {
313+
// Skip transient and static fields
314+
if (Modifier.isTransient(field.getModifiers()) ||
315+
Modifier.isStatic(field.getModifiers())) {
316+
continue;
317+
}
318+
319+
// Check if field is long or Long
320+
if (field.getType() == long.class || field.getType() == Long.class) {
321+
final String fieldName = field.getName();
322+
final Object value = document.get(fieldName);
323+
324+
// If the value is an Integer (int32), convert it to Long (int64)
325+
if (value instanceof Integer) {
326+
document.put(fieldName, ((Integer) value).longValue());
327+
log.debug("[DataStorage] Converted field {} from int32 to int64: {}", fieldName, value);
328+
}
329+
}
330+
}
331+
332+
// Also check parent class if it exists
333+
final Class<?> superclass = entityClass.getSuperclass();
334+
if (superclass != null && superclass != Object.class) {
335+
ensureLongFieldsAsInt64(document, superclass);
336+
}
337+
}
338+
299339
@Override
300340
@Synchronized
301341
public void resetObjectMapper(@NonNull final Consumer<JsonMapper.Builder> mapperCustomizer) {

src/main/java/net/plexverse/enginebridge/modules/manageddb/ManagedDBModuleImpl.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.mineplex.studio.sdk.modules.manageddb.models.MongoDatabaseConnectionInfo;
66
import com.mineplex.studio.sdk.modules.manageddb.models.MySQLDatabaseConnectionInfo;
77
import com.mineplex.studio.sdk.modules.manageddb.models.PostgreSQLDatabaseConnectionInfo;
8+
import com.mongodb.client.MongoClient;
89
import com.mongodb.client.MongoClients;
910
import com.mongodb.client.MongoDatabase;
1011
import com.google.common.base.Preconditions;
@@ -85,6 +86,7 @@ private static int getMd5Hash(String input) {
8586
private final Map<String, MySQLDatabaseConnectionInfo> mySQLDatabaseConnectionInfos = new ConcurrentHashMap<>(4);
8687
private final Map<String, PostgreSQLDatabaseConnectionInfo> postgreSQLDatabaseConnectionInfos = new ConcurrentHashMap<>(4);
8788
private final Map<String, HikariDataSource> existingHikariPools = new ConcurrentHashMap<>(4);
89+
private final Map<String, MongoClient> existingMongoClients = new ConcurrentHashMap<>(4);
8890
private final Map<String, MongoDatabase> existingMongoPools = new ConcurrentHashMap<>(4);
8991
private final JavaPlugin plugin;
9092

@@ -100,6 +102,8 @@ public void teardown() {
100102
postgreSQLDatabaseConnectionInfos.clear();
101103
existingHikariPools.values().forEach(HikariDataSource::close);
102104
existingHikariPools.clear();
105+
existingMongoClients.values().forEach(MongoClient::close);
106+
existingMongoClients.clear();
103107
existingMongoPools.clear();
104108
log.info("ManagedDBModule torn down");
105109
}
@@ -167,7 +171,11 @@ public MongoDatabase openManagedMongoClient(@NonNull final String databaseName)
167171
return existingMongoPools.computeIfAbsent(databaseName, (k) -> {
168172
MongoDatabaseConnectionInfo mongoDatabaseConnectionInfo = getMongoDatabaseConnectionInfo(databaseName).join();
169173
String connectionURI = mongoDatabaseConnectionInfo.getConnectionUri();
170-
return MongoClients.create(connectionURI).getDatabase(mongoDatabaseConnectionInfo.getSchemaName());
174+
// Cache MongoClient per database to reuse connections
175+
MongoClient mongoClient = existingMongoClients.computeIfAbsent(databaseName, (key) -> {
176+
return MongoClients.create(connectionURI);
177+
});
178+
return mongoClient.getDatabase(mongoDatabaseConnectionInfo.getSchemaName());
171179
});
172180
}
173181

0 commit comments

Comments
 (0)