为hibernate和@Transactional配置spring数据源

时间:2010-11-16 00:05:31

标签: java hibernate spring transactions datasource

此时我正在使用带有@Transactional注释的DriverManagerDataSource来管理事务。但是所有事务都非常慢,可能是因为数据源每次都会打开和关闭与db的连接。

我应该使用哪种数据来加速交易?

2 个答案:

答案 0 :(得分:8)

我在我的应用程序中使用两种方法的组合。第一个是c3p0连接池,它与chkal sugested几乎相同的解决方案。第二种方法是使用Spring lazyConnectionDataSourceProxy,它创建延迟加载代理,只有在您访问数据库时才加载连接。这是非常有用的,当你有二级缓存而你只是阅读缓存数据和查询 - 数据库不会被命中,你不需要获取连接(这是非常昂贵的)。

<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <!-- Pool properties -->
    <property name="minPoolSize" value="5" />
    <property name="initialPoolSize" value="10" />
    <property name="maxPoolSize" value="50" />
    <property name="maxStatements" value="50" />
    <property name="idleConnectionTestPeriod" value="120" />
    <property name="maxIdleTime" value="1200" />

</bean>

<bean name="lazyConnectionDataSourceProxy" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource" ref="dataSource" />
</bean>

答案 1 :(得分:4)

DriverManagerDataSource实际上不是连接池,只能用于测试。您应该从Apache Commons DBCP尝试BasicDataSource。类似的东西:

<bean id="dataSource" destroy-method="close" 
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>