Używam natywnego sterownika node-mongodb z MongoDB do napisania strony internetowej.
Mam kilka pytań na temat zarządzania połączeniami:
Czy wystarczy użyć tylko jednego połączenia MongoDB dla wszystkich żądań? Czy są jakieś problemy z wydajnością? Jeśli nie, to czy mogę skonfigurować globalne połączenie do użycia w całej aplikacji?
Jeśli nie, to czy dobrze jest otworzyć nowe połączenie, gdy nadejdzie żądanie, i zamknąć je, gdy zostanie obsłużone? Czy otwieranie i zamykanie połączenia jest drogie?
Czy powinienem używać globalnej puli połączeń? Słyszałem, że sterownik ma rodzimą pulę połączeń. Czy to dobry wybór?
Jeśli korzystam z puli połączeń, ile połączeń należy użyć?
Czy są jeszcze inne rzeczy, które powinienem zauważyć?
Odpowiedzi:
Główny committer do node-mongodb-native mówi :
Tak więc, aby bezpośrednio odpowiedzieć na twoje pytanie, ponownie wykorzystaj wynikowy obiekt db
MongoClient.connect()
. Zapewnia to tworzenie puli i zapewnia zauważalny wzrost prędkości w porównaniu z połączeniami otwierania / zamykania przy każdej akcji db.źródło
req.db
tym oprogramowaniu pośrednim: github.com/floatdrop/express-mongo-dbOtwórz nowe połączenie po uruchomieniu aplikacji Node.js i ponownie użyj istniejącego
db
obiektu połączenia:/server.js
/api/users.js
Źródło: Jak otwierać połączenia z bazą danych w aplikacji Node.js / Express
źródło
Oto kod, który będzie zarządzał Twoimi połączeniami MongoDB.
Po uruchomieniu serwera zadzwoń
initPool
Następnie w dowolnym innym module możesz wykonać następujące czynności:
Jest to oparte na dokumentacji MongoDB . Spójrz na to.
źródło
Zarządzaj pulami połączeń mongo w jednym samodzielnym module. Takie podejście zapewnia dwie korzyści. Po pierwsze sprawia, że Twój kod jest modułowy i łatwiejszy do przetestowania. Po drugie, nie musisz mieszać połączenia z bazą danych w obiekcie żądania, który NIE jest miejscem dla obiektu połączenia z bazą danych. (Biorąc pod uwagę naturę JavaScript, uważam, że bardzo niebezpieczne jest mieszanie czegokolwiek z obiektem zbudowanym przez kod biblioteki). Dlatego wystarczy wziąć pod uwagę moduł, który eksportuje dwie metody.
connect = () => Promise
aget = () => dbConnectionObject
.Za pomocą takiego modułu możesz najpierw połączyć się z bazą danych
Podczas lotu aplikacja może po prostu zadzwonić,
get()
gdy potrzebuje połączenia DB.Jeśli skonfigurujesz moduł db w ten sam sposób, co poniżej, nie tylko zapewnisz, że aplikacja nie uruchomi się, chyba że masz połączenie z bazą danych, ale masz także globalny sposób na dostęp do puli połączeń z bazą danych, która spowoduje błąd jeśli nie masz połączenia.
źródło
get()
, otrzymujemy pulę połączeń, a nie pojedyncze połączenie. Pula połączeń, jak sama nazwa wskazuje, jest logicznym zbiorem połączeń z bazą danych. Jeśli w puli nie ma połączeń, sterownik spróbuje je otworzyć. Po otwarciu tego połączenia zostanie ono użyte i zwrócone do puli. Przy następnym dostępie do puli połączenie to może zostać ponownie wykorzystane. Fajną rzeczą jest to, że pula zarządza dla nas naszymi połączeniami, więc jeśli połączenie zostanie zerwane, możemy się nigdy nie dowiedzieć, ponieważ pula otworzy dla nas nowe.Jeśli masz Express.js, możesz użyć express-mongo-db do buforowania i udostępniania połączenia MongoDB między żądaniami bez puli (ponieważ zaakceptowana odpowiedź mówi, że jest to właściwy sposób udostępniania połączenia).
Jeśli nie - możesz spojrzeć na jego kod źródłowy i użyć go w innym środowisku.
źródło
Korzystam z generycznej puli z połączeniami redis w mojej aplikacji - bardzo ją polecam. Jest ogólny i zdecydowanie wiem, że działa z mysql, więc nie sądzę, abyś miał z tym jakieś problemy i mongo
https://github.com/coopernurse/node-pool
źródło
Powinieneś utworzyć połączenie jako usługę, a następnie użyć go w razie potrzeby.
moja próbka App.js
i używaj go gdziekolwiek chcesz
źródło
W moim projekcie zaimplementowałem poniższy kod, aby zaimplementować pule połączeń w moim kodzie, aby utworzył minimalne połączenie w moim projekcie i ponownie używał dostępnego połączenia
źródło
Najlepszym podejściem do wdrożenia puli połączeń jest utworzenie jednej globalnej zmiennej tablicowej, która przechowuje nazwę db z obiektem połączenia zwróconym przez MongoClient, a następnie ponownie wykorzystuje to połączenie, ilekroć trzeba skontaktować się z bazą danych.
W swojej Server.js zdefiniuj var global.dbconnections = [];
Utwórz połączenie usługi ServiceService.js. Będzie miał 2 metody getConnection i createConnection. Kiedy więc użytkownik wywoła getConnection (), znajdzie szczegóły w globalnej zmiennej połączenia i zwróci szczegóły połączenia, jeśli już istnieje, wywoła metodę createConnection () i zwróci szczegóły połączenia.
Wywołaj tę usługę, używając nazwy_db, a zwróci obiekt połączenia, jeśli już ma, utworzy nowe połączenie i zwróci go.
Mam nadzieję, że to pomoże :)
Oto kod connectionService.js:
źródło
mongodb.com -> nowy projekt -> nowy klaster -> nowa kolekcja -> połącz -> adres IP: 0.0.0.0/0 i db cred -> połącz swoją aplikację -> skopiuj parametry połączenia i wklej do pliku .env swojego węzła aplikacji i pamiętaj, aby zastąpić „” rzeczywistym hasłem użytkownika, a także „/ test” nazwą db
utwórz nowy plik .env
źródło
Jeśli używasz ekspresu, istnieje inna prostsza metoda, która polega na wykorzystaniu wbudowanej funkcji Express do udostępniania danych między trasami i modułami w aplikacji. Istnieje obiekt o nazwie app.locals. Możemy dołączać do niego właściwości i uzyskiwać do nich dostęp z naszych tras. Aby z niego skorzystać, utwórz połączenie mongo w pliku app.js.
To połączenie z bazą danych, a nawet wszelkie inne dane, które chcesz udostępnić wokół modułów Twojej aplikacji, są teraz dostępne na twoich trasach,
req.app.locals
jak poniżej, bez potrzeby tworzenia i wymagania dodatkowych modułów.Ta metoda zapewnia, że połączenie z bazą danych jest otwarte na czas trwania aplikacji, chyba że zdecydujesz się ją zamknąć w dowolnym momencie. Jest łatwo dostępny
req.app.locals.your-collection
i nie wymaga tworzenia żadnych dodatkowych modułów.źródło