Как определить, какая часть трассировки стека вызывает утечку соединения в WebLogc 8.1 - PullRequest
1 голос
/ 23 мая 2011

У меня есть утечка соединения, которая, к счастью, обнаружена BEA WebLogic. Тем не менее, после прочтения некоторой литературы, я все еще пытаюсь выяснить, какая часть трассировки стека может подсказать, какую часть кодов я могу просматривать.

        ####<May 21, 2011 1:16:06 PM EST> <Warning> <JDBC> <svrl003.sia.com> <svr3> <Finalizer> <<anonymous>> <> <BEA-001074> <A JDBC pool connection leak was detected. A connection leak occurs when a connection obtained from the pool was not closed explicitly by calling close() and then was disposed by the garbage collector and returned to the connection pool. The following stack trace at create shows where the leaked connection was created.  Stack trace at connection create:

        at weblogic.jdbc.wrapper.PoolConnection.init(PoolConnection.java:61)
        at weblogic.jdbc.pool.Driver.allocateConnection(Driver.java:254)
        at weblogic.jdbc.pool.Driver.connect(Driver.java:164)
        at weblogic.jdbc.jts.Driver.getNonTxConnection(Driver.java:540)
        at weblogic.jdbc.jts.Driver.connect(Driver.java:139)
        at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:329)
        at com.oco.util.BEndOcDBConnectionPool.getConnection(BEndOcDBConnectionPool.java:188)
        at com.oco.util.BEndOcDBConnectionPool.getConnection(BEndOcDBConnectionPool.java:144)
        at com.oco.util.BEndConnectionManager.getConnection(BEndConnectionManager.java:38)
        at com.oco.ejb.confirmation.OrderConfirmationBean.saveConsents(OrderConfirmationBean.java:10213)
        at com.oco.ejb.confirmation.OrderConfirmationBean.saveConsents(OrderConfirmationBean.java:10172)
        at com.oco.ejb.confirmation.OrderConfirmation_9rmehc_EOImpl.saveConsents(OrderConfirmation_9rmehc_EOImpl.java:2178)
        at com.oco.ejb.confirmation.OrderConfirmation_9rmehc_EOImpl_WLSkel.invoke(Unknown Source)
        at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:492)
        at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)
        at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:435)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
        at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:430)
        at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:35)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
    > 

Похоже, что мне стоит посмотреть com.oco.ejb.confirmation.OrderConfirmationBean.saveConsents , но могу ли я быть уверен, что это может быть com.oco.ejb. translation.OrderConfirmationBean.saveConsents ?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

Stacktrace всегда показывает вам, что текущий поток делал в тот момент. Так что прохождение трассировки стека за строкой - это довольно хорошее исследование для вашей конкретной проблемы.

В вашей трассировке стека есть 5 рабочих строк, чтобы вы могли понять - через которые я пробежусь.

at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:329)

Это класс Weblogic Internal, представляющий начало вызова для получения соединения из пула, после чего Weblogic не обнаруживает ни одного доступного из-за утечки

at com.oco.util.BEndOcDBConnectionPool.getConnection(BEndOcDBConnectionPool.java:188)
at com.oco.util.BEndOcDBConnectionPool.getConnection(BEndOcDBConnectionPool.java:144)
at com.oco.util.BEndConnectionManager.getConnection(BEndConnectionManager.java:38)

Это 3 строки из кода вашего приложения, который является ConnectionManager, который выбирает соединение. Я полагаю, что это центральная ответственность за управление всеми соединениями JDBC в вашем приложении - так что именно здесь вы должны посмотреть, что пошло не так.

at com.oco.ejb.confirmation.OrderConfirmationBean.saveConsents(OrderConfirmationBean.java:10213)

Эта конкретная строка no 10213 метода OrderConfirmationBean saveConsents выполняет вызов к BEndConnectionManager - это само по себе может и не быть проблемой, то, что происходит, когда он делает вызов, вызывает проблему.

Итак, подведем итог: начните со строки № 10213 OrderConfirmationBean saveConsents, и вы увидите, что вызов BEndConnectionManager может не закрывать соединения - теперь проверьте ваш код на , чтобы проверить, выполнены ли закрывающиеся соединения или нужно быть сделано в OrderConfirmationBean или самим BEndConnectionManager.

Обновление со ссылкой на BEA-001074

Я сосредоточился больше на трассировке стека, чем на BEA-001074.

Таким образом, BEA-001074 - это сообщение Finalizer , выдаваемое при запуске сборщика мусора (GC). Итак, мое понимание того, что происходит:

Соединение было использовано, но не закрыто в коде, поэтому некоторая ссылка остается в куче JVM сервера Weblogic. Через некоторое время, когда GC запускается, он понимает, что соединение больше не активно, и запускает Finalizer непосредственно перед сборкой мусора. Затем BEA выдает ошибку BEA-001074, чтобы сообщить нам, что потенциальная утечка была устранена путем удаления ссылки и возврата соединения в пул.

Чтобы прояснить ваш вопрос, похоже, что это НЕ во время получения нового соединения, как предполагал мой первоначальный ответ.

Weblogic способен воспроизводить трассировку стека , ссылаясь на точку, в которой соединение (которое должно было быть закрыто) было фактически открыто .

Некоторое чтение на форумах Oracle показывает, что в некоторых версиях 8.1 они не могут воспроизводить трассировку стека, которая показывает Null exception passed - так что в вашем случае это хорошо и работает, что вы можете увидеть фактический стек.

1 голос
/ 23 мая 2011

Убедитесь, что вы на самом деле освобождаете свои соединения.Убедитесь, что вы используете блок finally в блоке try / catch, чтобы освободить соединение для перехвата сценариев исключений.

0 голосов
/ 02 октября 2018

Избегайте финализаторов, см. Книгу Блоха «Эффективная Java». Нет никакой гарантии, что финализатор будет работать, поэтому вы можете удерживать соединения дольше, чем вы думаете, что приведет к утечке

...