1

そのため、アプリケーションの複数の使用 (ページ アクセス) にわたって持続する 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 データベースから取得され、テストの結果、mongoConnectionnull ではないことがわかりました。

どのようにmongoConnectionnullではありませんか? そして、なぜ新しいつながりが散発的に作られているのでしょうか?

4

1 に答える 1