#java #mongodb #quarkus
#java #mongodb #quarkus
Вопрос:
Я использую quarkus для создания приложения, которому необходимо подключиться к MongoDB.
Однако, просматривая документацию, я не смог найти ни одного модуля или руководства, которые показали бы мне, как я могу это сделать:
Есть руководство по hibernate и JPA, но ничего о mongodb.
Кому-нибудь удается это сделать? Можете ли вы поделиться со мной репозиторием с примером?
Комментарии:
1. В настоящее время нет поддержки MongoDB, но я думаю, что есть планы добавить ее в будущем. Поддержка чего-либо в Quarkus означает, что предпринимаются шаги для обеспечения того, чтобы это работало и в собственном режиме, вот почему вы не видите поддержки для «всего мира»
Ответ №1:
В последних версиях Quarkus добавлена поддержка MongoDB.
Ответ №2:
Я использовал следующее для доступа к базам данных mongodb в некотором демонстрационном коде quarkus:
@ApplicationScoped
public class MongoClientFactory {
@Inject
private Logger logger;
@Inject
@ConfigProperty(name="mongo.user")
private String mongoUser;
@Inject
@ConfigProperty(name="mongo.password")
private String mongoPassword;
@Inject
@ConfigProperty(name="mongo.host")
private String mongoHost;
@Inject
@ConfigProperty(name="mongo.port", defaultValue="27017")
private int mongoPort;
@Inject
@ConfigProperty(defaultValue="admin")
private String mongoAdminDb;
private MongoClient mongoClient;
private ServerAddress serverAddress;
private MongoCredential mongoCredential;
@PostConstruct
void buildMongoClient() {
logger.info("Building MongoClientFactory");
serverAddress = new ServerAddress(mongoHost, mongoPort);
mongoCredential = MongoCredential.createCredential(mongoUser, mongoAdminDb, mongoPassword.toCharArray());
}
@Produces
public MongoClient produceMongoClient() {
if (mongoClient == null) {
mongoClient = new MongoClient(serverAddress, mongoCredential, MongoClientOptions.builder().build());
logger.info("Connected to MongoDB server on {}:{}", mongoHost, mongoPort);
}
return mongoClient;
}
@PreDestroy
void cleanup() {
if (mongoClient != null) {
mongoClient.close();
}
}
}
Тогда я могу просто внедрить клиент там, где это когда-либо было необходимо:
public class SomBusinessObject {
@Inject
private MongoClient mongoClient;
...
}
Драйвер Mongo также добавлен в pom:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.2</version>
</dependency>
Я еще не тестировал это в собственной сборке. Автономный jar, похоже, работает нормально.
Обновить
GraalVM версии 1.0.0-rc15 CE не нравится драйвер mongo. Похоже, на это повлияла ошибка: в куче изображений не разрешены экземпляры для класса, который инициализируется или повторно инициализируется во время выполнения изображения: sun.security.provider.NativePRNG #712.
Кроме того, анализатор зависимостей Quarkus, похоже, поглощает optional
зависимости, такие как com.github.jnr:jnr-unixsocket
и org.xerial.snappy:snappy-java
.
Комментарии:
1. Неплохое решение, но как насчет биений сердца и поведения повторного подключения. @micronautfw решает эти задачи за вас.
2. Текущие версии драйвера MongoDB Java реализуют настраиваемые частоты сердечных сокращений и объединение пулов соединений. Мой код немного устарел, поскольку на момент написания мне приходилось поддерживать более старые версии серверов Mongo.
MongoClientFactory
Реализация заключалась в основном в предоставлении конфигурации. Это было для POC, поэтому оно не включает в себя все настраиваемое поведение, предоставляемое драйвером Java.