MongoDB 인스턴스에 대한 클라이언트가 유효한지 어떻게 확인합니까?
특히, 저는 현재 다음 기능을 사용하여 클라이언트에 대한 연결이 유효한지 확인하려고 합니다.
def mongodb_connect(client_uri):
try:
return pymongo.MongoClient(client_uri)
except pymongo.errors.ConnectionFailure:
print "Failed to connect to server {}".format(client_uri)
그런 다음 다음 이 기능을 사용합니다.
def bucket_summary(self):
client_uri = "some_client_uri"
client = mongodb_connect(client_uri)
db = client[tenant_id]
ttb = db.timebucket.count() # If I use an invalid URI it hangs here
잘못된 URI가 제공될 경우 마지막 줄에서 예외를 포착하고 던질 수 있는 방법이 있습니까?저는 처음에 이것이 연결 실패의 원인이라고 생각했는데(연결할 때 이것이 잡힐 수 있습니다) 제가 잘못 생각했습니다.
잘못된 URI로 프로그램을 실행하면 실행되지 않고 키보드 실행인터럽트 수율:
File "reportjob_status.py", line 58, in <module>
tester.summarize_timebuckets()
File "reportjob_status.py", line 43, in summarize_timebuckets
ttb = db.timebucket.count() #error
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1023, in count
return self._count(cmd)
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 985, in _count
with self._socket_for_reads() as (sock_info, slave_ok):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 699, in _socket_for_reads
with self._get_socket(read_preference) as sock_info:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 106, in select_servers
self._condition.wait(common.MIN_HEARTBEAT_INTERVAL)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 358, in wait
_sleep(delay)
그serverSelectionTimeoutMS
의 키워드 매개 변수는 드라이버가 서버에 연결을 시도하는 시간을 제어합니다.기본값은 30초입니다.
오류를 즉시 보고하려면 일반적인 연결 시간()과 호환되는 매우 낮은 값으로 설정합니다.연결 시도를 트리거하려면 DB를 쿼리해야 합니다.
>>> maxSevSelDelay = 1 # Assume 1ms maximum server selection delay
>>> client = pymongo.MongoClient("someInvalidURIOrNonExistantHost",
serverSelectionTimeoutMS=maxSevSelDelay)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> client.server_info()
이거 올라갑니다.
∙ 설정 중임serverSelectionTimeoutMS
로.0
서버의 대기 시간이 매우 짧은 경우에도 작동할 수 있습니다(예: 로드가 매우 적은 "로컬" 서버의 경우).
그 예외를 포착하고 적절하게 처리하는 것은 당신에게 달려 있습니다.그런 것들:
try:
client = pymongo.MongoClient("someInvalidURIOrNonExistantHost",
serverSelectionTimeoutMS=maxSevSelDelay)
client.server_info() # force connection on a request as the
# connect=True parameter of MongoClient seems
# to be useless here
except pymongo.errors.ServerSelectionTimeoutError as err:
# do whatever you need
print(err)
다음을 표시합니다.
No servers found yet
안녕하세요. 연결이 설정되었는지 확인하기 위해 이 작업을 수행할 수 있습니다.
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
client = MongoClient()
try:
# The ismaster command is cheap and does not require auth.
client.admin.command('ismaster')
except ConnectionFailure:
print("Server not available")
서버선택시간 초과 MS
예외를 적용하기 전에 서버 선택을 차단할 기간을 정의합니다.기본값은 30,000(밀리초)입니다.클라이언트 수준에서 구성할 수 있어야 합니다.데이터베이스 개체, 컬렉션 개체 수준 또는 개별 쿼리 수준에서 구성할 수 없습니다.
이 기본값은 일반적인 서버 기본 선택을 완료하기에 충분하도록 선택되었습니다.서버가 선택 속도를 향상시키면 이 숫자가 아래로 수정될 수 있습니다.
토폴로지가 유동적일 때 서버 선택에 대한 긴 지연을 허용할 수 있는 사용자는 이 값을 더 높게 설정할 수 있습니다.토폴로지가 유동적일 때 "빠른 실패"를 원하는 사용자는 이 값을 작은 수로 설정할 수 있습니다.
서버 선택0의 시간 초과 MS는 일부 운전자에게 특별한 의미를 가질 수 있습니다. 이 규격에서는 0의 의미를 정의하지 않았지만 모든 운전자가 0의 의미를 문서화해야 합니다.
# pymongo 3.5.1
from pymongo import MongoClient
from pymongo.errors import ServerSelectionTimeoutError
client = MongoClient("mongodb://localhost:27000/", serverSelectionTimeoutMS=10, connectTimeoutMS=20000)
try:
info = client.server_info() # Forces a call.
except ServerSelectionTimeoutError:
print("server is down.")
# If connection create a new one with serverSelectionTimeoutMS=30000
serverSelectionTimeoutMS
제게 적합하지 않습니다(Python 2.7.12, MongoDB 3.6.1, Pymongo 3.6.0).A. Jesse Jiryu Davis는 GitHub 이슈에서 리트머스 테스트로 소켓 수준 연결을 먼저 시도할 것을 제안했습니다.이것은 저에게 도움이 됩니다.
def throw_if_mongodb_is_unavailable(host, port):
import socket
sock = None
try:
sock = socket.create_connection(
(host, port),
timeout=1) # one second
except socket.error as err:
raise EnvironmentError(
"Can't connect to MongoDB at {host}:{port} because: {err}"
.format(**locals()))
finally:
if sock is not None:
sock.close()
# elsewhere...
HOST = 'localhost'
PORT = 27017
throw_if_mongodb_is_unavailable(HOST, PORT)
import pymongo
conn = pymongo.MongoClient(HOST, PORT)
print(conn.admin.command('ismaster'))
# etc.
이렇게 하면 발견되지 않는 많은 문제가 있지만, 서버가 실행되고 있지 않거나 연결할 수 없는 경우 바로 표시됩니다.
다음 방법으로도 확인할 수 있습니다.
from pymongo import MongoClient
from pymongo.errors import OperationFailure
def check_mongo_connection(client_uri):
connection = MongoClient(client_uri)
try:
connection.database_names()
print('Data Base Connection Established........')
except OperationFailure as err:
print(f"Data Base Connection failed. Error: {err}")
check_mongo_connection(client_uri)
pymongo >= 4.0의 경우 선호되는 방법은ping
사용되지 않는 명령 대신 명령:
from pymongo.errors import ConnectionFailure
client = MongoClient()
try:
client.admin.command('ping')
except ConnectionFailure:
print("Server not available")
실패를 를 포함합니다.OperationFailure
:
except OperationFailure as err:
print(f"Database error encountered: {err}")
원본: mongo_client.파이의
언급URL : https://stackoverflow.com/questions/30539183/how-do-you-check-if-the-client-for-a-mongodb-instance-is-valid
'programing' 카테고리의 다른 글
mongodb 쉘은 어떻게 시작하나요? (0) | 2023.05.28 |
---|---|
레이블과 텍스트 블록의 차이 (0) | 2023.05.28 |
HEAD 커밋 ID를 표시하는 Git 명령? (0) | 2023.05.28 |
tf.app.run()은 어떻게 작동합니까? (0) | 2023.05.28 |
GET 요청 대신 OPTIONS 요청을 받는 이유는 무엇입니까? (0) | 2023.05.28 |