使用C3P0的properties样例代码:
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
、Hibernate缓存属性
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
属性名 用途
hibernate.cache.provider_class
自定义的CacheProvider的类名.取值classname.of.CacheProvider
hibernate.cache.use_minimal_puts
以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的.取值true|false
hibernate.cache.use_query_cache
允许查询缓存, 个别查询仍然需要被设置为可缓存的.取值true|false
hibernate.cache.use_second_level_cache
能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存.取值true|false
hibernate.cache.query_cache_factory
自定义的实现QueryCache接口的类名, 默认为内建的StandardQueryCache.取值classname.of.QueryCache
hibernate.cache.region_prefix
二级缓存区域名的前缀.取值prefix
hibernate.cache.use_structured_entries
强制Hibernate以更人性化的格式将数据存入二级缓存.取值true|false
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/zhangwei"/>
<property name="user" value="root"/>
<property name="password" value="pass"/>
</bean>
[org.hibernate.jdbc.ConnectionManager] - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!???
hibernate3使用c3p0连接池,没有配置事务,但是好象有默认的配置.
DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] - Eagerly flushing Hibernate session??
INFO [org.hibernate.transaction.TransactionManagerLookupFactory] - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)??
Hibernate关于JDBC连接管理的旧(2.x)行为是,Session
在第一次需要的时候获取一个连接,在session关闭之前一直会持有这个连接。Hibernate引入了连接释放的概念,来告诉session如何处理它的JDBC连接。注意,下面的讨论只适用于采用配置ConnectionProvider
来提供连接的情况,用户自己提供的连接与这里的讨论无关。通过org.hibernate.ConnectionReleaseMode
的不同枚举值来使用不用的释放模式:
ON_CLOSE
- 基本上就是上面提到的老式行为。Hibernate session在第一次需要进行JDBC操作的时候获取连接,然后持有它,直到session关闭。
AFTER_TRANSACTION
- 在org.hibernate.Transaction
结束后释放连接。
AFTER_STATEMENT
(也被称做积极释放) - 在每一条语句被执行后就释放连接。但假若语句留下了与session相关的资源,那就不会被释放。目前唯一的这种情形就是使用org.hibernate.ScrollableResults
。
hibernate.connection.release_mode
配置参数用来指定使用哪一种释放模式。可能的值有:
auto
(默认) - 这一选择把释放模式委派给org.hibernate.transaction.TransactionFactory.getDefaultReleaseMode()
方法。对JTATransactionFactory来说,它会返回ConnectionReleaseMode.AFTER_STATEMENT;对JDBCTransactionFactory来说,则是ConnectionReleaseMode.AFTER_TRANSACTION。很少需要修改这一默认行为,因为假若设置不当,就会带来bug,或者给用户代码带来误导。
on_close
- 使用 ConnectionReleaseMode.ON_CLOSE. 这种方式是为了向下兼容的,但是已经完全不被鼓励使用了。
after_transaction
- 使用ConnectionReleaseMode.AFTER_TRANSACTION。这一设置不应该在JTA环境下使用。也要注意,使用ConnectionReleaseMode.AFTER_TRANSACTION的时候,假若session 处于auto-commit状态,连接会像AFTER_STATEMENT那样被释放。
after_statement
- 使用ConnectionReleaseMode.AFTER_STATEMENT。除此之外,会查询配置的ConnectionProvider
,是否它支持这一设置((supportsAggressiveRelease()
))。假若不支持,释放模式会被设置为ConnectionReleaseMode.AFTER_TRANSACTION。只有在你每次调用ConnectionProvider.getConnection()
获取底层JDBC连接的时候,都可以确信获得同一个连接的时候,这一设置才是安全的;或者在auto-commit环境中,你可以不管是否每次都获得同一个连接的时候,这才是安全的。