#sql #jboss #datasource #jmx
#sql #jboss #источник данных #jmx
Вопрос:
Я определил два источника данных в *-ds.xml в jboss 4.2.3 (redhat 4.3) оба источника данных идентичны. Различаются только jndi-name, Каждое определяет min = max = 10
<xa-datasource>
<jndi-name>com.trax.hibernate.DataSource</jndi-name>
<track-connection-by-tx>true</track-connection-by-tx>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521:orcl10</xa-datasource-property>
<xa-datasource-property name="User"> xxxx </xa-datasource-property>
<xa-datasource-property name="Password"> xxxx </xa-datasource-property>
<min-pool-size>10</min-pool-size>
<max-pool-size>10</max-pool-size>
<prefill>true</prefill>
<blocking-timeout-millis>60000</blocking-timeout-millis>
<ih3e-timeout-minutes>15</ih3e-timeout-minutes>
<valid-connection-checker-class-name> org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker </valid-connection-checker-class-name>
<check-valid-connection-sql>select 1 from gtw_cust</check-valid-connection-sql>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<no-tx-separate-pools/>
</xa-datasource>
<xa-datasource>
<jndi-name>AuditTrail.DataSource</jndi-name>
<track-connection-by-tx>true</track-connection-by-tx>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521:orcl10</xa-datasource-property>
<xa-datasource-property name="User">xxxx</xa-datasource-property>
<xa-datasource-property name="Password"> xxxx </xa-datasource-property>
<min-pool-size>10</min-pool-size>
<max-pool-size>10</max-pool-size>
<prefill>true</prefill>
<blocking-timeout-millis>60000</blocking-timeout-millis>
<ih3e-timeout-minutes>15</ih3e-timeout-minutes>
<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name>
<check-valid-connection-sql>select 1 from gtw_cust</check-valid-connection-sql>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<no-tx-separate-pools/>
</xa-datasource>
Проблема:
В jmx-консоли имя =com.trax.hibernate.Источник данных, service =ManagedConnectionPool, информация показывает 20 подключений, а не 10, как ожидалось.
Я бы ожидал, что максимальное значение созданных подключений будет равно 10 (MaxSize). Здесь кажется, что количество фактических подключений в два раза больше максимального, и соединения были созданы и уничтожены (40 созданных и 20 уничтоженных)
Что я делаю не так? Как вы можете это объяснить?
com.trax.hibernate.DataSource:
AvailableConnectionCount 20
ConnectionCount 20
MinSize 10
MaxSize 10
MaxConnectionsInUseCount 11
InUseConnectionCount 0
ConnectionCreatedCount 40
ConnectionDestroyedCount 20
AuditTrail.DataSource:
AvailableConnectionCount 10
ConnectionCount 10
MinSize 10
MaxSize 10
MaxConnectionsInUseCount 8
InUseConnectionCount 0
ConnectionCreatedCount 20
ConnectionDestroyedCount 10
Комментарии:
1. При развертывании только источника данных без приложения два источника данных создают точно максимальные соединения. только при развертывании приложения первый источник данных создает соединения двойного максимального размера, поэтому это действительно зависит от того, как приложение использует источник данных, хотя оба источника данных определены как XA — oracle.jdbc.xa.client. OracleXADataSource
Ответ №1:
Это из-за свойства <no-tx-separate-pools/>
. Смотрите документацию по источникам данных XA в Руководстве по настройке сервера JBoss:
<no-tx-separate-pools>
Объединяйте транзакционные и нетранзакционные соединения отдельно
Предупреждение
Использование этой опции приведет к тому, что ваш общий размер пула будет в два раза больше максимального размера пула, поскольку будут созданы два фактических пула.
Комментарии:
1. Хорошо, я вижу, что использую это свойство. однако я использую его в обоих источниках данных, и только первый удваивается…
2. Я бы предположил, что это потому, что вы используете подключение AuditTrail по-другому, чем основной пул. Есть ли что-то особенное в AuditTrail? Является ли это частью основной транзакции?
3. Что ж, первый источник данных используется через Hibernate и jboss JTA, в то время как другой используется другой (сторонней) библиотекой программного обеспечения, так что вы можете быть правы … есть идеи о том, как я могу это проверить?
4. Не уверен. Возможно, просматривая документацию этой сторонней библиотеки. Посмотрите, пытается ли он присоединиться к существующей транзакции JTA или нет. Держу пари, что это не так. Другой способ, конечно, просто удалить эту опцию и посмотреть пул 🙂
5. Хорошо, теперь относительно значения ConnectionDestroyedCount… почему источник данных должен создавать вдвое больше соединений, чем ему нужно, а затем уничтожать 50%? я бы ожидал, что он никогда не создаст больше, чем MaxSize…