为hibernate和@Transactional配置spring数据源
Posted
技术标签:
【中文标题】为hibernate和@Transactional配置spring数据源【英文标题】:Configure spring datasource for hibernate and @Transactional 【发布时间】:2011-05-10 13:22:04 【问题描述】:此时我正在使用带有 @Transactional 注释的 DriverManagerDataSource 来管理事务。但是所有事务都非常非常慢,可能是因为数据源每次都打开和关闭与db的连接。
我应该使用什么数据源来加快交易速度?
【问题讨论】:
【参考方案1】: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>
【讨论】:
【参考方案2】:我在我的应用程序中使用了两种方法的组合。第一个是 c3p0 连接池,它与 chkal 建议的解决方案几乎相同。第二种方法是使用 SpringlazyConnectionDataSourceProxy,它创建延迟加载代理,仅当您点击数据库时才加载连接。这非常有用,当您有二级缓存并且您只读取缓存的数据和查询时 - 不会命中数据库,并且您不需要获取连接(这非常昂贵)。
<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>
【讨论】:
comboPooledDatasource 缺少 destroy-method="close" 属性以上是关于为hibernate和@Transactional配置spring数据源的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:相对于自定义 @Transactional(timeout) 的默认事务超时
@Transactional 与 JPA 和 Hibernate 有啥用?
Glassfish 4 - 使用 Hibernate 和 CDI @Transactional 的 TransactionRequiredException
使用 Spring @Transactional 管理 Hibernate 事务
Hibernate - @Transactional 不起作用有啥特别的原因吗?
@Transactional 上的 Spring Hibernate LazyInitializationException