そのため、アプリケーションの複数の使用 (ページ アクセス) にわたって持続する Mongo 接続を作成しようとしています。テスト中に構築されたこれらすべての接続にうんざりしており、その単一の永続的な接続を確立することにより、適切な手順を使用したいと考えています。ベストプラクティスとそのすべて。
ここに私が持っているものがあります:
web.xml
<listener>
<listener-class>com.core.tools.MyServletContextListener</listener-class>
</listener>
com.core.tools.MyServletContextListener
public class MyServletContextListener implements ServletContextListener {
private static Logger log = org.apache.log4j.Logger.getLogger(MyServletContextListener.class);
public void contextInitialized( ServletContextEvent sce ){
try {
EntityManager.setupMongoClient(sce);
} catch (UnknownHostException e) {
log.error("Error setting up Servlet Context");
}
}
public void contextDestroyed( ServletContextEvent sce ){
EntityManager.closeMongoClient(sce);
}
}
エンティティマネージャー
public class EntityManager {
private static MongoClient mongoConnection = null;
private static Jongo jongoDatasource = null;
public static void setupMongoClient( ServletContextEvent sce ) throws UnknownHostException{
if( sce.getServletContext().getAttribute("mongo") == null ){
mongoConnection = new MongoClient("localhost");
sce.getServletContext().setAttribute("mongo", mongoConnection );
}else if (mongoConnection == null) {
mongoConnection = (MongoClient) sce.getServletContext().getAttribute("mongo");
}
}
public static Jongo getJongoDatasource(){
if( jongoDatasource == null ){
jongoDatasource = new Jongo(mongoConnection.getDB("coreTest"));
}
return jongoDatasource;
}
public static void closeMongoClient( ServletContextEvent sce ){
if( sce.getServletContext().getAttribute("mongo") != null ){
mongoConnection = (MongoClient) sce.getServletContext().getAttribute("mongo");
mongoConnection.close();
}
}
}
何が起こるのですか:
良いニュースです。サーバーを閉じると、接続がクリーンアップされるようになりました。
悪いニュース - 私はまだたくさんの接続を作成し続けています. ボタンを押すたびに、新しい接続が作成されます...ただし、約4または5接続のみです。その後、しばらくの間、新しい接続の追加が突然停止します。その後、さらに3つ追加されます。それから待ってください。それから別の 2。それから何もない。それから数分後、突然さらに 5 つの接続が追加されます。
紛らわしい: どうやってそれらの接続を確立しているのかさえわかりません。メソッド呼び出しの追跡- Apache サーバーの起動時に一度setupMongoClient
だけ呼び出されます。を設定するのは、システム全体で唯一の場所です。mongoConnection
ボタンを押すたびに、mongoConnection
設定されません。それでも、データは mongo データベースから取得され、テストの結果、mongoConnection
null ではないことがわかりました。
どのようにmongoConnection
nullではありませんか? そして、なぜ新しいつながりが散発的に作られているのでしょうか?