【发布时间】:2014-08-21 20:43:15
【问题描述】:
我的应用程序有一个奇怪的问题,它在使用 Hibernate 和 Spring 的 JBoss 6.1 上运行。我也在使用 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中没有定义数据源,所以应该使用org.springframework.orm.hibernate3.LocalSessionFactoryBean的dataSource属性。
当我启动我的应用程序服务器时,发生了一些奇怪的事情(至少对我来说很奇怪):
-
JBoss 启动,我在日志中看到这一行
[com.mchange.v2.c3p0.jboss.C3P0PooledDataSource] 将 C3P0 PooledDataSource 绑定到名称“java:db/MED_POOLED”。开始...
如果我检查数据库,则存在 20 个会话。
- 创建 LocalSessionFactoryBean 时,突然在 Db 上出现 40 个连接,但在我的数据源配置中,我指定最多创建 20 个连接。
我认为,以某种方式,在创建 LocalSessionFactoryBean 时数据源会重新初始化,但我不明白为什么,当 JBoss 启动时,我的连接数正好是我想要的两倍。
你知道发生了什么吗?我的配置有问题吗?
我正在使用 JBoss 6.1、c3p0 (0.9.5) 的最新可用版本、Spring 3.0.3.RELEASE 和 Hibernate 3.5.3-Final
【问题讨论】:
-
为
org.springframework包启用调试日志记录,看看日志中是否有任何异常。 -
添加额外的 cfg 文件。
标签: spring hibernate c3p0 jboss6.x