2017-02-28 6 views
1

マイSpringConfig.xmlは言う:MongoDBの接続春ブーツに閉鎖なっていない

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
    xsi:schemaLocation="http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/data/mongo 
      http://www.springframework.org/schema/data/mongo/spring-mongo-1.10.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <mongo:mongo-client id="mongo" host="127.0.0.1" port="27017" > 

<mongo:client-options 
    connections-per-host="8" 
    threads-allowed-to-block-for-connection-multiplier="4" 
    connect-timeout="1000" 
    max-wait-time="1500" 
    socket-keep-alive="true" 
    socket-timeout="1500" 
    /> 
</mongo:mongo-client> 

    <mongo:db-factory dbname="test" mongo-ref="mongo" /> 

<bean id="mappingContext" 
    class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> 

<bean id="defaultMongoTypeMapper" 
    class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> 
    <constructor-arg name="typeKey"><null/></constructor-arg> 
</bean> 

<bean id="mappingMongoConverter" 
    class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mappingContext" ref="mappingContext" /> 
    <property name="typeMapper" ref="defaultMongoTypeMapper" /> 
</bean> 

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mongoConverter" ref="mappingMongoConverter" /> 
</bean> 

</beans> 

私は一度だけ私のサービスのコンストラクタでこれを呼び出しています:

ApplicationContext ctx; 
public DoctorService() { 

    ctx = new GenericXmlApplicationContext("SpringConfig.xml"); 
} 

そしてを使用してctx like:

MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate"); 
Query searchUserQuery = new Query(Criteria.where("_id").is(new ObjectId(userId))); 

Keys k = new Keys(); 
Doctor doctor = mongoOperation.findOne(searchUserQuery, Doctor.class); 
k.setSessionId(doctor.getSessionid()); 
k.setToken(doctor.getToken()); 
List<Keys> keys = new ArrayList<Keys>(); 
keys.add(k); 
return keys; 

ただし、タイムアウト期間が経過しても接続は閉じられません。

おかげ

+1

あなたの期待は何ですか?各クエリに新しい接続をしますか?私はdb.serverStatus()。接続を実行したときに、私は – Veeram

+0

@Veeramが、私は、現在のキーの下に増加した接続を取得し、私はこれがあなたのために有用であろうと思います! – Satya

答えて

1

あり、それぞれのmongoテンプレートの最大100サイズの接続プールは、(デフォルトとして)であり、それはあなたのmongoでconnections-per-host="8"あり、これらはスピードのために再び再び&を再利用しているので、接続はクローズされませんクライアントオプション。だからあなたは最大8つの接続を持ち、あなたのアプリが残っている限り、彼らは長く滞在します。自動

EDITました:接続を殺すために、あなたがそれらをタイマーmaxConnectionIdleTime: 1000で自殺を持っているので、アイドル時間を持っている任意のアイドル状態の接続には、次のプロパティを使用することができます> 1000msでは殺されると、これはありません仕事、私は&をテストした接続プールのサイズの変更は以下に見ることができます。サーバの再起動後に

enter image description here

スパイクは私の負荷試験であり、それはその完全な接続プールの限界に達していなかった、とピークに達した後、接続が殺されました。接続の作成が実際に本当に高コストであることを言わなければなりませんが、私の応答時間が百倍以上に増加し、これだけ長い間、非アクティブ後maxConnectionIdleTimeやや長いを持っている方が良いでしょうかかわらない最良の解決策は、接続プールを持っていませんあなたは接続を殺すようになり、また、minConnectionsPerHostという値を持っているので、接続プールの準備が整っているので、必要ならばそれを増やしてから、サーバがアクティブでないときに余分なものを取り除き、すすいで繰り返してください!

+0

@Satyaが、私は私の答えを更新しました要求を送信し、以前より –

関連する問題