共计 7105 个字符,预计需要花费 18 分钟才能阅读完成。
这篇文章主要介绍“Hibernate 中怎么配置 dbcp 连接池”的相关知识,丸趣 TV 小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Hibernate 中怎么配置 dbcp 连接池”文章能帮助大家解决问题。
1. 获取 DBCP jar
要将 DBCP 与 Hibernate 集成,您需要 commons-dbcp.jar 和 commons-pool-1.5.4.jar。
文件:pom.xml
project ...
repositories
repository
id JBoss repository /id
url http://repository.jboss.org/nexus/content/groups/public/ /url
/repository
/repositories
dependencies
dependency
groupId org.hibernate /groupId
artifactId hibernate-core /artifactId
version 3.6.3.Final /version
/dependency
dependency
groupId commons-dbcp /groupId
artifactId commons-dbcp /artifactId
version 1.4 /version
/dependency
/dependencies /project
2.DBCPConnectionProvider
要将 DBCP 与 Hibernate 集成,您需要创建一个“DBCPConnectionProvider”类。
文件:DBCPConnectionProvider.java
package com.mkyong.util;import java.io.PrintWriter;import java.io.StringWriter;import java.sql.Connection;import java.sql.SQLException;import java.util.Iterator;import java.util.Map;import java.util.Properties;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;import org.hibernate.HibernateException;import org.hibernate.cfg.Environment;import org.hibernate.connection.ConnectionProvider;import org.hibernate.connection.ConnectionProviderFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class DBCPConnectionProvider implements ConnectionProvider { private static final Logger log = LoggerFactory
.getLogger(DBCPConnectionProvider.class); private static final String PREFIX = hibernate.dbcp. private BasicDataSource ds; // Old Environment property for backward-compatibility (property removed in
// Hibernate3)
private static final String DBCP_PS_MAXACTIVE = hibernate.dbcp.ps.maxActive // Property doesn t exists in Hibernate2
private static final String AUTOCOMMIT = hibernate.connection.autocommit public void configure(Properties props) throws HibernateException { try {
log.debug( Configure DBCPConnectionProvider // DBCP properties used to create the BasicDataSource
Properties dbcpProperties = new Properties(); // DriverClass url
String jdbcDriverClass = props.getProperty(Environment.DRIVER);
String jdbcUrl = props.getProperty(Environment.URL);
dbcpProperties.put(driverClassName , jdbcDriverClass);
dbcpProperties.put(url , jdbcUrl); // Username / password
String username = props.getProperty(Environment.USER);
String password = props.getProperty(Environment.PASS);
dbcpProperties.put(username , username);
dbcpProperties.put(password , password); // Isolation level
String isolationLevel = props.getProperty(Environment.ISOLATION); if ((isolationLevel != null)
(isolationLevel.trim().length() 0)) {
dbcpProperties.put( defaultTransactionIsolation ,
isolationLevel);
} // Turn off autocommit (unless autocommit property is set)
String autocommit = props.getProperty(AUTOCOMMIT); if ((autocommit != null) (autocommit.trim().length() 0)) {dbcpProperties.put( defaultAutoCommit , autocommit);
} else {
dbcpProperties.put( defaultAutoCommit ,
String.valueOf(Boolean.FALSE));
} // Pool size
String poolSize = props.getProperty(Environment.POOL_SIZE); if ((poolSize != null) (poolSize.trim().length() 0)
(Integer.parseInt(poolSize) 0)) {dbcpProperties.put( maxActive , poolSize);
} // Copy all driver properties into connectionProperties
Properties driverProps = ConnectionProviderFactory
.getConnectionProperties(props); if (driverProps.size() 0) {StringBuffer connectionProperties = new StringBuffer(); for (Iterator iter = driverProps.entrySet().iterator(); iter
.hasNext();) {Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
connectionProperties.append(key).append(=).append(value); if (iter.hasNext()) {
connectionProperties.append(
dbcpProperties.put( connectionProperties ,
connectionProperties.toString());
} // Copy all DBCP properties removing the prefix
for (Iterator iter = props.entrySet().iterator(); iter.hasNext();) {Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey(); if (key.startsWith(PREFIX)) {String property = key.substring(PREFIX.length());
String value = (String) entry.getValue();
dbcpProperties.put(property, value);
} // Backward-compatibility
if (props.getProperty(DBCP_PS_MAXACTIVE) != null) {
dbcpProperties.put( poolPreparedStatements ,
String.valueOf(Boolean.TRUE));
dbcpProperties.put( maxOpenPreparedStatements ,
props.getProperty(DBCP_PS_MAXACTIVE));
} // Some debug info
if (log.isDebugEnabled()) {StringWriter sw = new StringWriter();
dbcpProperties.list(new PrintWriter(sw, true));
log.debug(sw.toString());
} // Let the factory create the pool
ds = (BasicDataSource) BasicDataSourceFactory
.createDataSource(dbcpProperties); // The BasicDataSource has lazy initialization
// borrowing a connection will start the DataSource
// and make sure it is configured correctly.
Connection conn = ds.getConnection();
conn.close(); // Log pool statistics before continuing.
logStatistics();} catch (Exception e) {
String message = Could not create a DBCP pool
log.error(message, e); if (ds != null) { try {ds.close();
} catch (Exception e2) { // ignore
ds = null;
} throw new HibernateException(message, e);
log.debug(Configure DBCPConnectionProvider complete} public Connection getConnection() throws SQLException {
Connection conn = null; try {conn = ds.getConnection();
} finally {logStatistics();
} return conn;
} public void closeConnection(Connection conn) throws SQLException { try {conn.close();
} finally {logStatistics();
} public void close() throws HibernateException {
log.debug( Close DBCPConnectionProvider
logStatistics(); try { if (ds != null) {ds.close();
ds = null;
} else {log.warn( Cannot close DBCP pool (not initialized)
} catch (Exception e) {throw new HibernateException( Could not close DBCP pool , e);
log.debug(Close DBCPConnectionProvider complete} protected void logStatistics() { if (log.isInfoEnabled()) {log.info( active: + ds.getNumActive() + (max:
+ ds.getMaxActive() + ) + idle: + ds.getNumIdle()
+ (max: + ds.getMaxIdle() + )
} public boolean supportsAggressiveRelease() { return false;}
3. 在 hibernate.cfg.xml 中配置 DBCP
现在,链接您的“DBCPConnectionProvider”并在“hibernate.cfg.xml”中定义 DBCP 属性,例如:
文件:hibernate.cfg.xml
?xml version= 1.0 encoding= utf-8 ? !DOCTYPE hibernate-configuration PUBLIC
-//Hibernate/Hibernate Configuration DTD 3.0//EN
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd hibernate-configuration
session-factory
property name= hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver /property
property name= hibernate.connection.url jdbc:oracle:thin:@localhost:1521:MKYONG /property
property name= hibernate.connection.username mkyong /property
property name= hibernate.connection.password password /property
property name= hibernate.dialect org.hibernate.dialect.Oracle10gDialect /property
property name= hibernate.default_schema MKYONG /property
property name= show_sql true /property
property name= hibernate.connection.provider_class
com.mkyong.util.DBCPConnectionProvider /property
property name= hibernate.dbcp.initialSize 8 /property
property name= hibernate.dbcp.maxActive 20 /property
property name= hibernate.dbcp.maxIdle 20 /property
property name= hibernate.dbcp.minIdle 0 /property
mapping >4. 运行,输出完成,运行它并查看以下输出:
关于“Hibernate 中怎么配置 dbcp 连接池”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注丸趣 TV 行业资讯频道,丸趣 TV 小编每天都会为大家更新不同的知识点。
正文完