2013-01-18 2 views
1

Я настроил Tomcat ГСБД как:ДБХП Tomcat Пулы соединений removeAbandoned не работает

<Resource 
name="jdbc/myoracle" 
auth="Container" 
type="javax.sql.DataSource" 
driverClassName="oracle.jdbc.OracleDriver" 
url="jdbc:oracle:thin:@127.0.0.1:1521:mysid" 
username="abc" 
password="abc" 
maxActive="20" 
maxIdle="4" 
minIdle="0" 
maxWait="4" 
removeAbandoned="true" 
logAbandoned="true" 
removeAbandonedTimeout="3" 
/> 

Я не знаю, я определил вышеуказанные параметры, как правильно или нет. Я использую struts 2, веб-страница имеет ссылку меню и вызывает класс действия, где я выполняю все операции db и открываю/закрываю соединения из/в объединение. Проблема заключается в том, что если я постоянно продолжаю нажимать ссылку на меню, скажем 40-50 раз, соединения растут там, где один щелчок мыши, а затем ожидание ответа, делает все (т.е. не увеличивая соединения).

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

(Непрерывное нажатие на те же результаты ссылки на меню :) Как я определил maxActive as 20, Connections продолжатся до 24 (как я помню), и после того, как этот пул исчерпан, то есть новое соединение/запрос ждет бесконечно, чтобы получить соединение из исчерпанного пула.

Здесь я сомневаюсь, почему removeAbandoned не закрывал соединения как я указал removeAbandonedTimeout = 3. Если i Предположим, что у меня есть утечка памяти для подключения или я не закрываю какие-либо соединения сознательно, тогда removeAbandoned убьет все эти открытые соединения или нет?

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

ответ

2

Я бы сказал, что значение параметра maxWait слишком мало. Согласно documentation, его единица измерения равна миллисекундам. Когда все доступные соединения выделены, в вашем случае он будет ждать только 4 миллисекунды и выдает исключение.

Кроме того, я бы рекомендовал увеличить значение параметра minIdle, чтобы в любое время было доступно несколько «подготовленных» соединений. Конечно, вам может потребоваться дополнительно увеличить значение значения параметра maxIdle.

Что касается параметра removeAbandonedTimeout, убедитесь, что его значение равно более - количество секунд, необходимое для запуска любой операции с базой данных.

Еще одна вещь, о которой нужно помнить, заключается в том, что установка logAbandoned в true добавляет некоторые накладные расходы к процессу заимствования соединения.

+0

Я попытался немного увеличить значения, но все равно будет. Я понимаю, что removeAbandonedTimeout значение должно быть больше, чем нет. секунд, которые необходимы для запуска любой операции db, чтобы избежать нарушения соединения. Но не удаляетAbandonedTimeout = "3" означает закрывать соединения/или отбирать обратно даже соединения режима работы в пул? –

+0

Почему после 50-60 непрерывных щелчков мыши пул соединений исчерпан и перестает выделять больше соединений? –

+0

Что вы имеете в виду, говоря «увеличение значений немного»? Дело в том, что все ваши значения намного меньше, чем значения по умолчанию (removeAbandonedTimeout = 60, maxActive = 100, maxIdle = maxActive = 100, minIdle = initialSize = 10, maxWait = 30000). Есть ли у вас какая-либо конкретная причина использовать значения, намного меньшие, чем стандартные? Итог, если вам нужно больше подключений, почему бы не выделить больше? –

Смежные вопросы