Oracle getConnection бавен

В Java проект използвам ojdbc6 jar

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
        <scope>compile</scope>
    </dependenc>

Първият път, когато стартирам за един ден, dataSource.getConnection() е бърз. Вторият път обикновено е добре. Следващите няколко пъти отнемат около 45 секунди. След това отнема няколко минути. След като стартирам ПЪРВОТО свързване на дадено приложение, всички нови връзки, които получавам, са много много бързи. Това забавяне е получаване само на ПЪРВАТА връзка за дадено изпълнение.

Какво прави първата ми връзка толкова бавна?

Гледам netstat и не виждам никаква връзка да виси след успешно изпълнение. Опитах няколко различни пула за свързване (DBCP, C3PO) без успех. При отстраняване на грешки чрез изходния код, забавянето е 100% на реда на org.springframework.jdbc.datasource.DataSourceUtils:

Connection con = dataSource.getConnection();

Някакви идеи?

Редактирано за повече подробности

1) Използвам набор от връзки (DBCP или C3PO), който запазва връзките за бъдеща употреба. Когато говоря за получаване на нова връзка, имам предвид, докато първата връзка се използва.. Трябва да отида до DB и да получа НОВА връзка. Разбира се, мога да се върна и да получа същата връзка от пула за връзки отново и отново. Но получаването на втори по едно и също време също е бързо.

2) Не знам с колко връзки моята база данни ми позволява да бъда влязъл. Някаква идея къде е този имот в Oracle?


person bwawok    schedule 31.03.2011    source източник
comment
Вероятно тази статия Как да проверя максималният брой разрешени връзки към база данни на Oracle? е интересен за вас   -  person lkdg    schedule 01.04.2011


Отговори (3)


Това се дължи на това, че Java използва /dev/random вместо /dev/urandom, за да направи ssh връзка с базата данни.... превключването към /dev/urandom поправи това

person bwawok    schedule 13.04.2011
comment
Струва си да споменем, че можете да използвате JVM аргумента -Djava.security.egd=file:/dev/./urandom, за да постигнете това. Обърнете внимание на допълнителния '.' в аргумента. Вижте stackoverflow.com /questions/137212/. - person Ryan; 09.07.2014

2 въпроса.

Първо, след като получите първата връзка, какво правите с нея? Затваряте ли го правилно (ВКЛЮЧИТЕЛНО всички ресурси, които сте отворили с него, като Statement и ResultSet)?

Второ, колко връзки ви позволява вашата база данни за идентификационните данни, с които сте влезли?

Причината да задам тези въпроси е, че закъсненията във времето може да са времето, необходимо на DB да изчисти след вас (защото може да не сте го направили правилно) и да освободи връзка, която да ви даде. Голяма част от това може просто да е изчакване, преди принудително да освободи ресурси.

person rfeak    schedule 31.03.2011

Надвишавате ли максималните си активни връзки във вашия пул връзки и трябва да изчакате програмата ви да освободи стари връзки?

person Ray    schedule 31.03.2011
comment
Пускам програмите си веднага след друга. Изглежда, че затваря всичко правилно, но не съм напълно сигурен как да разбера. - person bwawok; 31.03.2011
comment
Ако използвате DBCP, можете да отпечатате datasource.getNumActive() (трябва първо да го прехвърлите към BasicDataSource), преди да опитате да получите друга връзка отново. - person Ray; 01.04.2011