问题场景
在用hibernate连接oracle10g时log中有如下情况出现:
2015-12-17 20:49:13.699:[DEBUG] Obtaining JDBC connection
2015-12-17 20:49:25.413:[DEBUG] Obtained JDBC connection
可见是连接数据库时获取connection耗时较长,问题的根出在了hibernate的连接池性能满足不了要求,hibernate默认的hibernate.connection.pool_size为1,当然若是以为是此值太小就错了,真正的问题是hibernate默认的连接池性能就是不行,如官方文档所述:
Hibernate's internal connection pooling algorithm is rudimentary, and is provided for development and testing purposes. Use a third-party pool for best performance and stability. To use a third-party pool, replace the hibernate.connection.pool_size property with settings specific to your connection pool of choice. This disables Hibernate's internal connection pool.
解决方法
使用第三方的连接池,如c3p0.
以下为c3p0的配置样例:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>
<property name="user" value="HIBERNATE" />
<property name="password" value="HIBERNATE" />
<!-- 连接池中保留的最小连接数。 -->
<property name="minPoolSize" value="10" />
<!-- 连接池中保留的最大连接数。 -->
<property name="maxPoolSize" value="100" />
<!-- 最大空闲时间,超过该时间则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="1800" />
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。 -->
<property name="acquireIncrement" value="3" />
<!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。 -->
<property name="maxStatements" value="100" />
<!-- 初始化时获取10个连接,取值应在minPoolSize与maxPoolSize之间。 -->
<property name="initialPoolSize" value="10" />
<!-- 每隔多少秒检查所有连接池中的空闲连接。 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
<property name="breakAfterAcquireFailure" value="true" />
<!-- 因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout" value="false" />
</bean>
以下为参考来源
参考url:http://www.cnblogs.com/xinzehome/p/3721678.html
参考内容如下:
数据源的配置
Spring默认数据源:DriverManagerDataSource
DBCP数据源:BasicDataSource、使用jdbc.properties
C3P0数据源:ComboPooledDataSource
BoneCP数据源:
需要的jar包
l bonecp-0.6.5.jar
l google-collections-1.0.jar
l slf4j-api-1.5.11.jar
l slf4j-log4j12-1.5.11.jar
l log4j-1.2.15.jar
1. Spring默认数据源:DriverManagerDataSource
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
2. DBCP数据源:BasicDataSource、使用jdbc.properties
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value=" oracle.jdbc.driver.OracleDriver">