У меня странная проблема с моим приложением, работающим на JBoss 6.1, которое использует Hibernate и Spring. Я также использую c3p0 для пула соединений.
У меня есть источник данных, определенный в JBoss. Источником данных является C3P0PooledDataSource. Обратите внимание, что maxpoolsize равен 20, и исходный размер пула также равен 20.
<mbean code="com.mchange.v2.c3p0.jboss.C3P0PooledDataSource"
name="jboss.jca:service=DataSourceBinding,name=db/MED_POOLED">
<attribute name="JndiName">java:db/MED_POOLED</attribute>
<attribute name="JdbcUrl">jdbc:oracle:thin:@dbhost:1521:SID</attribute>
<attribute name="DriverClass">oracle.jdbc.driver.OracleDriver</attribute>
<attribute name="User">xxx</attribute>
<attribute name="Password">xxx</attribute>
<attribute name="AutomaticTestTable">POOL_TEST</attribute>
<attribute name="CheckoutTimeout">30000</attribute>
<attribute name="Description">Pooled Datasource for med</attribute>
<attribute name="IdleConnectionTestPeriod">180</attribute>
<attribute name="InitialPoolSize">20</attribute>
<attribute name="MaxPoolSize">20</attribute>
<attribute name="MinPoolSize">20</attribute>
<attribute name="TestConnectionOnCheckin">true</attribute>
<attribute name="MaxIdleTime">3600</attribute>
<depends>jboss:service=Naming</depends>
</mbean>
В моем файле конфигурации spring источник данных извлекается с использованием имени jndi:
<bean id="defaultDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>db/MED_POOLED</value></property>
</bean>
а затем используется для создания LocalSessionFactoryBean
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="defaultDataSource"/>
<property name="namingStrategy" ref="namingStrategy"/>
<property name="configLocations">
<list>
<value>classpath:hibernate.cfg.xml</value>
<value>classpath:jbpm.hibernate.cfg.xml</value>
</list>
</property>
<property name="mappingDirectoryLocations">
<list><value>WEB-INF/classes</value></list>
</property>
</bean>
В hibernate.cfg.xml источник данных не определен, поэтому следует использовать свойство dataSource в org.springframework.orm.hibernate3.LocalSessionFactoryBean.
Когда я запускаю свой сервер приложений, происходит что-то странное (по крайней мере, странное для меня):
JBoss запускается, вижу в логе эту строчку
[com.mchange.v2.c3p0.jboss.C3P0PooledDataSource] Связал C3P0 PooledDataSource с именем 'java:db/MED_POOLED'. Начиная...
и если я проверю базу данных, 20 сеансов присутствуют.
- Когда создается LocalSessionFactoryBean, внезапно появляется 40 подключений к базе данных, но в моей конфигурации источника данных я указал создание максимум 20 подключений.
Я думаю, что каким-то образом источник данных повторно инициализируется при создании LocalSessionFactoryBean, но я не понимаю, почему, и когда JBoss запускается, у меня ровно вдвое больше соединений, чем я хочу.
Вы знаете, что происходит? Что-то не так с моей конфигурацией?
Я использую JBoss 6.1, последнюю доступную версию c3p0 (0.9.5), Spring 3.0.3.RELEASE и Hibernate 3.5.3-Final.
org.springframework
и посмотрите, выделяется ли в журналах что-нибудь необычное. - person Andrei Stefan   schedule 01.07.2014