使用 JDBC 连接到托管在云中的 MongoDB 时出错

Posted

技术标签:

【中文标题】使用 JDBC 连接到托管在云中的 MongoDB 时出错【英文标题】:Error connecting to MongoDB hosted in the cloud, using JDBC 【发布时间】:2016-07-03 22:32:47 【问题描述】:

我正在尝试使用 JDBC 连接到托管在云中的 MongoDB。 但是,身份验证失败。

我的开发环境: Mac OSX 蚀 驱动程序: junit-3.8.1.jar mongodb-driver-3.2.2.jar mongodb-driver-core-3.2.2.jar bson-3.2.2.jar 我正在使用以下网址建议的驱动程序: http://mongodb.github.io/mongo-java-driver/?_ga=1.221045400.1622521490.1456732063 实际上,驱动程序由以下依赖声明更新,由 Maven 构建: org.mongodb mongodb-驱动程序 3.2.2

这是我的 Java 代码:

private static void test() 


    String url = "mongodb://user:pwd@host:19468/heroku_dbname";
    MongoClient mongoClient = new MongoClient(new MongoClientURI(url));


    // get handle to "heroku_dbname" database
    MongoDatabase database = mongoClient.getDatabase("heroku_dbname");


    // get a handle to the "book" collection
    MongoCollection<Document> collection = database.getCollection("book");

    // make a document and insert it
    Document doc = new Document("title", "Good Habits")
                   .append("author", "Akbar");

    collection.insertOne(doc);

    // get it (since it's the only one in there since we dropped the rest earlier on)
    Document myDoc = collection.find().first();
    System.out.println(myDoc.toJson());

    // release resources
    mongoClient.close();

当我执行时,我得到以下异常:

2016 年 3 月 17 日 7:15:31 PM com.mongodb.diagnostics.logging.JULLogger 日志 信息:使用设置 hosts=[ds019468.mlab.com:19468]、mode=SINGLE、requiredClusterType=UNKNOWN、serverSelectionTimeout='30000 ms'、maxWaitQueueSize=500 创建的集群 2016 年 3 月 17 日 7:15:31 PM com.mongodb.diagnostics.logging.JULLogger 日志 信息:WritableServerSelector 从集群描述 ClusterDescriptiontype=UNKNOWN, connectionMode=SINGLE, all=[ServerDescriptionaddress=ds019468.mlab.com:19468, type=UNKNOWN, state=CONNECTING] 中没有选择服务器。在超时前等待 30000 毫秒 2016 年 3 月 17 日 7:15:33 PM com.mongodb.diagnostics.logging.JULLogger 日志 信息:连接到服务器 ds019468.mlab.com:19468 时,监视器线程出现异常 com.mongodb.MongoSecurityException: 异常验证 MongoCredentialmechanism=null, userName='db_userName', source='heroku_dbName', password=,mechanismProperties= 在 com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:61) 在 com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32) 在 com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:99) 在 com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:44) 在 com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) 在 com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128) 在 java.lang.Thread.run(Thread.java:745) 原因:com.mongodb.MongoCommandException:命令失败,错误 18:“身份验证失败。”在服务器 ds019468.mlab.com:19468 上。完整的响应是 "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." 在 com.mongodb.connection.CommandHelper.createCommandFailureException(CommandHelper.java:170) 在 com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:123) 在 com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32) 在 com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:95) 在 com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:45) ... 6 更多 线程“main”com.mongodb.MongoTimeoutException 中的异常:在等待与 WritableServerSelector 匹配的服务器时 30000 毫秒后超时。集群状态的客户端视图是 type=UNKNOWN, servers=[address=ds019468.mlab.com:19468, type=UNKNOWN, state=CONNECTING, exception=com.mongodb.MongoSecurityException: Exception authenticationing MongoCredentialmechanism=null, userName='db_userName', source='heroku_dbName', password=,mechanicalProperties=,由 com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' 引起。在服务器 ds019468.mlab.com:19468 上。完整的响应是 "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." ] 在 com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369) 在 com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101) 在 com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:75) 在 com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:71) 在 com.mongodb.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:68) 在 com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:219) 在 com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168) 在 com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74) 在 com.mongodb.Mongo.execute(Mongo.java:781) 在 com.mongodb.Mongo$2.execute(Mongo.java:764) 在 com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:515) 在 com.mongodb.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:306) 在 com.mongodb.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:297) 在 com.chozhan.test.mongodb.MongoJdbcRemote.test(MongoJdbcRemote.java:64) 在 com.chozhan.test.mongodb.MongoJdbcRemote.main(MongoJdbcRemote.java:43)

我能够通过 mLab 网络界面使用相同的用户 ID 和密码成功登录,并且工作正常。

但是,只有 JDBC 尝试失败。

谁能帮忙,这里有什么问题?

【问题讨论】:

【参考方案1】:

当您创建客户端连接时,您需要添加身份验证详细信息。

MongoCredential credential = MongoCredential.createCredential(user, heroku_dbname, pwd);
MongoClient mongoClient = new MongoClient(new ServerAddress(), Arrays.asList(credential));

或者只是更新您的网址:

MongoClientURI uri = new MongoClientURI("mongodb://user1:pwd1@host1/?authSource=db1");

【讨论】:

谢谢!将代码更改为: MongoClient mongoClient = new MongoClient(new ServerAddress(), Arrays.asList(credential)); System.out.println("mongoClient:" + mongoClient); System.out.println("mongoClient.getAddress():" + mongoClient.getAddress());第二个 System.out... 没有被执行。发生同样的异常。【参考方案2】:

该问题已由 mLab 支持人员解决。我正在使用 mLab 的“Web 界面用户 ID 密码”。有人建议我创建一个“单独的数据库用户 ID/密码”来连接。它与新创建的数据库用户 ID / 密码一起使用。

【讨论】:

【参考方案3】:

对我有用的是将application.properties 中的 URL 从:

spring.data.mongodb.uri=mongodb://username:password@host:port/database_name

收件人:

spring.data.mongodb.uri=mongodb+srv://username:password@host:port/database?retryWrites=true&w=majority

我读到**MongoDB** 默认数据库是test。 在我的应用程序中,我将 host:port 替换为从 mongodb.com 获得的 URI,尽管 URL 不包含 port 的值,但它仍然有效。

【讨论】:

以上是关于使用 JDBC 连接到托管在云中的 MongoDB 时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 Nowjs 托管的 Node.js 服务器连接到 MongoDB Atlas DB

从 Elastic Beanstalk 连接到托管在 AWS ec2 上的 MongoDB

使用 mongoose 和 Fixie(Heroku 插件)连接到 mongodb

Django 无法连接到 mongoDB 地图集

如何在 Go 中使用 .crt 文件通过 ssl 连接到 mongoDB

在 openshift 上将 jdbc 连接到 MySql 服务器时出现问题