使用 persistence.xml 连接到 Docker 容器中的 MongoDB 运行
Connecting to MongoDB running in a Docker Container using persistence.xml
我在 JBoss WildFly 16.0 上部署了 Java EE 11 应用程序并 运行。0.Final 在 Docker 容器中。
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES 867d2b0c179b gostophandle:latest "/opt/jboss/wildfly/…"
4 seconds ago Up 3 seconds 0.0.0.0:32826->8080/tcp
elegant_shtern
我在 Docker 容器中也有一个 MongoDB 的实例 运行。
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
1c064a161638 mongo "docker-entrypoint.s…" 2
minutes ago Up 2 minutes 27017/tcp goStopHandle
这是我的 'persistence.xml',我用它连接到 MongoDB 的 'localhost' 实例:
<persistence-unit name="goStopHandleMongoDBPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
<properties>
<!-- <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.2"/> -->
<property name="jboss.as.jpa.providerModule" value="org.hibernate:5.3"/>
<!-- <property name="wildfly.jpa.hibernate.search.module" value="org.hibernate.search.orm:5.8"/> -->
<property name="wildfly.jpa.hibernate.search.module" value="org.hibernate.search.orm:5.10"/>
<!-- <property name="hibernate.transaction.jta.platform" value="JBossTS"/> -->
<!-- <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAS"/> -->
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
<property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/>
<property name="hibernate.ogm.datastore.grid_dialect" value="org.hibernate.ogm.datastore.mongodb.MongoDBDialect"/>
<property name="hibernate.ogm.datastore.database" value="goStopHandleDB"/>
<property name="hibernate.ogm.datastore.host" value="127.0.0.1:27017"/>
</properties>
</persistence-unit>
我 运行:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' aea9f245ff90
并得到 MongoDB 容器的 IP 地址:
172.17.0.2
我将 persistence.xml 更改为使用:
<property name="hibernate.ogm.datastore.host" value="172.17.0.2:27017"/>
当我启动我的 WildFly 容器时,我得到:
[0m[0m19:39:18,823 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle: Name or service not known
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle: Name or service not known
at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
[0m[0m19:39:19,327 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle
at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
[0m[0m19:39:28,841 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle: Name or service not known
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle: Name or service not known
at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
[0m[0m19:39:29,344 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle
at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
关于如何配置 'persistence.xml' 有什么建议吗?
Hibernate OGM 生成的 MongoClient 可能有问题。
解决这个问题的一种方法是确保您用于客户端的配置是正确的,也许可以通过创建客户端并检查它是否正确连接的测试来实现。
比使用 OGM 中的属性应用相同的配置。您可以使用前缀 hibernate.ogm.mongodb.driver.*
为驱动程序设置 属性。要获得 OGM 中所有可用属性的列表,我会让您查看文档:https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html_single/#_configuring_mongodb
您还可以扩展 class MongoDBDatastoreProvider
并覆盖方法:
protected MongoClient createMongoClient(MongoDBConfiguration config) { ... }
然后将新的class传递给属性hibernate.ogm.datastore.provider
。
类似于我在尝试使用 Robo 3T 连接到 MongoDB 容器时遇到的问题。
需要暴露端口:
docker run --name my-mongo -p 27017:27017 -d mongo
现在 Robo 3T 和我的 EAR 都连接到 MongoDB 数据库。
我在 JBoss WildFly 16.0 上部署了 Java EE 11 应用程序并 运行。0.Final 在 Docker 容器中。
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES 867d2b0c179b gostophandle:latest "/opt/jboss/wildfly/…" 4 seconds ago Up 3 seconds 0.0.0.0:32826->8080/tcp
elegant_shtern
我在 Docker 容器中也有一个 MongoDB 的实例 运行。
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES 1c064a161638 mongo "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 27017/tcp goStopHandle
这是我的 'persistence.xml',我用它连接到 MongoDB 的 'localhost' 实例:
<persistence-unit name="goStopHandleMongoDBPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
<properties>
<!-- <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.2"/> -->
<property name="jboss.as.jpa.providerModule" value="org.hibernate:5.3"/>
<!-- <property name="wildfly.jpa.hibernate.search.module" value="org.hibernate.search.orm:5.8"/> -->
<property name="wildfly.jpa.hibernate.search.module" value="org.hibernate.search.orm:5.10"/>
<!-- <property name="hibernate.transaction.jta.platform" value="JBossTS"/> -->
<!-- <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAS"/> -->
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
<property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/>
<property name="hibernate.ogm.datastore.grid_dialect" value="org.hibernate.ogm.datastore.mongodb.MongoDBDialect"/>
<property name="hibernate.ogm.datastore.database" value="goStopHandleDB"/>
<property name="hibernate.ogm.datastore.host" value="127.0.0.1:27017"/>
</properties>
</persistence-unit>
我 运行:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' aea9f245ff90
并得到 MongoDB 容器的 IP 地址:
172.17.0.2
我将 persistence.xml 更改为使用:
<property name="hibernate.ogm.datastore.host" value="172.17.0.2:27017"/>
当我启动我的 WildFly 容器时,我得到:
[0m[0m19:39:18,823 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle: Name or service not known
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle: Name or service not known
at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
[0m[0m19:39:19,327 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle
at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
[0m[0m19:39:28,841 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle: Name or service not known
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle: Name or service not known
at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
[0m[0m19:39:29,344 INFO [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ca50be6c9e77c00671d9ec5', description='null'}-gostophandle:27017) Exception in monitor thread while connecting to server gostophandle:27017: com.mongodb.MongoSocketException: gostophandle
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.UnknownHostException: gostophandle
at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298)
at org.hibernate.ogm.mongodb:5.4@5.4.1.Final//com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)
... 5 more
关于如何配置 'persistence.xml' 有什么建议吗?
Hibernate OGM 生成的 MongoClient 可能有问题。
解决这个问题的一种方法是确保您用于客户端的配置是正确的,也许可以通过创建客户端并检查它是否正确连接的测试来实现。
比使用 OGM 中的属性应用相同的配置。您可以使用前缀 hibernate.ogm.mongodb.driver.*
为驱动程序设置 属性。要获得 OGM 中所有可用属性的列表,我会让您查看文档:https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html_single/#_configuring_mongodb
您还可以扩展 class MongoDBDatastoreProvider
并覆盖方法:
protected MongoClient createMongoClient(MongoDBConfiguration config) { ... }
然后将新的class传递给属性hibernate.ogm.datastore.provider
。
类似于我在尝试使用 Robo 3T 连接到 MongoDB 容器时遇到的问题。
需要暴露端口:
docker run --name my-mongo -p 27017:27017 -d mongo
现在 Robo 3T 和我的 EAR 都连接到 MongoDB 数据库。