最近一个旧项目,想换个数据库连接池,经考虑决定用hikaricp.由于旧系统spring跟hibernate版本比较旧,创建数据源datasource一直报各种各样的错。后来在hikaricp的github上https://github.com/brettwooldridge/HikariCP/wiki/Hibernate4看到有hibernate4的connection provider。上面建议可以直接拷贝provider代码更改import就可以供hibernate3.x使用。于是试着用了下,没有任何报错,运行也比较稳定。这里贴上provider代码。遇到同样问题的可以直接拿走。hibernate的配置需要改为自己的provider,同时可以配置数据源的属性。
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.Version;
import org.hibernate.connection.ConnectionProvider;
import org.hibernate.exception.Configurable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.hibernate.HikariConfigurationUtil;
import javax.sql.DataSource;
/**
* Connection provider for Hibernate 4.3.
*
* @author Brett Wooldridge, Luca Burgazzoli
*/
public class HikariHibernateConnectionProvider implements ConnectionProvider, Configurable {
private static final long serialVersionUID = -9131625057941275711L;
private static final Logger LOGGER = LoggerFactory.getLogger(HikariHibernateConnectionProvider.class);
/**
* HikariCP configuration.
*/
private HikariConfig hcfg;
/**
* HikariCP data source.
*/
private HikariDataSource hds;
// *************************************************************************
//
// *************************************************************************
/**
* c-tor
*/
public HikariHibernateConnectionProvider() {
this.hcfg = null;
this.hds = null;
if (Version.getVersionString().substring(0, 5).compareTo("4.3.6") >= 1) {
LOGGER.warn("com.zaxxer.hikari.hibernate.HikariConnectionProvider has been deprecated for versions of "
+ "Hibernate 4.3.6 and newer. Please switch to org.hibernate.hikaricp.internal.HikariCPConnectionProvider.");
}
}
// *************************************************************************
// Configurable
// *************************************************************************
@Override
public void configure(Properties arg0) throws HibernateException {
try {
LOGGER.debug("Configuring HikariCP");
this.hcfg = HikariConfigurationUtil.loadConfiguration(arg0);
this.hds = new HikariDataSource(this.hcfg);
} catch (Exception e) {
throw new HibernateException(e);
}
LOGGER.debug("HikariCP Configured");
}
// *************************************************************************
// ConnectionProvider
// *************************************************************************
@Override
public Connection getConnection() throws SQLException {
Connection conn = null;
if (this.hds != null) {
conn = this.hds.getConnection();
}
return conn;
}
@Override
public void closeConnection(Connection conn) throws SQLException {
conn.close();
}
@Override
public boolean supportsAggressiveRelease() {
return false;
}
// *************************************************************************
// Stoppable
// *************************************************************************
@Override
public void close() throws HibernateException {
this.hds.close();
}
}
hibernate配置:
<property name="hibernateProperties">
<props>
<prop key="hibernate.jdbc.use_scrollable_resultset">
true
</prop>
<prop key="hibernate.query.substitutions">1</prop>
<prop key="hibernate.connection.provider_class">
xxx.xxx.HikariHibernateConnectionProvider
</prop>
<prop key="hibernate.jdbc.batch_versioned_data">
true
</prop>
<prop key="hibernate.show_sql">${hibernate_show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate_format_sql}</prop>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.jdbc.fetch_size">100</prop>
<prop key="hibernate.jdbc.batch_size">100</prop>
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> -->
<prop key="hibernate.dialect">${hibernate_dialect}</prop>
<prop key="hibernate.hikari.minimumIdle">5</prop>
<prop key="hibernate.hikari.maximumPoolSize">10</prop>
<prop key="hibernate.hikari.idleTimeout">30000</prop>
<prop key="hibernate.hikari.dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</prop>
<prop key="hibernate.hikari.dataSource.url">${jdbcUrl}</prop>
<prop key="hibernate.hikari.dataSource.user">${dbuser}</prop>
<prop key="hibernate.hikari.dataSource.password">${dbpass}</prop>
</props>
</property>