

私が開発しているシステムは以下のようにDBに接続するのですが、システムテストフェーズでテストを流してみてエラーが発生しました。調べましたが、OSGiフレームワークをもとに作られたJNDIの機能に関係があるそうです。OSGiのサービスは使用数量の上限値（Integerの上限値)があってそのサービスを呼び出すごとに使用数量を累計されます。でも何かの原因でどんどん累計して一回も開放されたことがないようです。しかし、OSGi、それともJNDIの動きが全く理解できないので、原因を判断できません。心当たりのある方がいらっしゃたら教授していただけませんか？

**ソースコード**

[code]

    InitialContext ctx = new InitialContext();
    DataSource dataSource = (DataSource) ctx.lookup(dsName);
    return dataSource.getConnection();
    
[/code]

**エラーログ**

[code]

    Caused by: org.osgi.framework.ServiceException: The use count for the service overflowed.
        at org.eclipse.osgi.internal.serviceregistry.ServiceUse.incrementUse(ServiceUse.java:154)
        at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:91)
        at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:45)
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:496)
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:461)
        at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:619)
        at org.apache.aries.jndi.Utils$4.run(Utils.java:195)
        at java.security.AccessController.doPrivileged(AccessController.java:594)
        at org.apache.aries.jndi.Utils.getServicePrivileged(Utils.java:193)
        at org.apache.aries.jndi.ContextHelper.getContextProvider(ContextHelper.java:177)
        at org.apache.aries.jndi.ContextHelper.getInitialContext(ContextHelper.java:141)
        at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:51)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:695)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:324)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:352)
        at javax.naming.InitialContext.lookup(InitialContext.java:428)
        at jp.co.abc.dao.query.ConnectionUtils.getConnection(ConnectionUtils.java:130)
    
[/code]


CC BY-SA 4.0
2020-03-17T00:57:14.137
63920
2020-03-17T14:19:15.033
38243
question
java
JNDIでDataSourceを取得する際、エラーが発生する（org.osgi.framework.ServiceException: The use count for the service overflowed.)


お約束ですが、コネクションプールが枯渇してませんか？  
リバティは利用したことは無いので、管理コンソールの有無がわかりませんが、コネクションプールの状態を確認されることからだと思います。参考まで、こんな方法があるようです。

<http://6h324.hatenablog.com/entry/2017/08/25/113626>

追記：  
ソースコードをみると該当の箇所は

[code]

    void incrementUse() {
        if (useCount == Integer.MAX_VALUE) {
            throw new ServiceException(Msg.SERVICE_USE_OVERFLOW);
        }
        useCount++;
    }
    
[/code]

となっており、整数の整数最大値まで回しているようですね。  
さらに、ServiceFactoryUse.javaを見ると  
サービスが呼ばれるごとにサービスオブジェクトがキャッシュされる仕様になっています。  
反対の処理をするdecrementはサービスをungetする際によばれているので、解放処理などを怠った結果、実に(2の31乗-1)もの回数を回し切ったということのようです。

確認：この状態になるまでどのぐらいの間稼働させたのでしょうか。


CC BY-SA 4.0
2020-03-17T12:51:21.853
63937
2020-03-17T14:19:15.033
2020-03-17T14:19:15.033
10174
10174
63920
answer