使用 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