让Hibernate支持DBCP数据源,hibernatedbcp,老版本的 Hiberna
分享于 点击 7591 次 点评:47
让Hibernate支持DBCP数据源,hibernatedbcp,老版本的 Hiberna
老版本的 Hibernate 不支持 DBCP 连接池,不过没关系,有了这个类就可以轻松搞定。
配置:hibernate.connection.provider_classcom.dlog4j.dbaccess.DBCPConnectionProvider
/** * DataSourceConnectionProvider.java of www.dlog.cn * 作者: Winter Lau * 时间: 2008-4-20 * 项目主页: <a href="<a href="http://www.dlog4j.com/">http://www.dlog4j.com/"><a href="http://www.dlog4j.com</a">http://www.dlog4j.com</a> */package com.dlog4j.dbaccess;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.SQLException;import java.util.Iterator;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.beanutils.BeanUtils;import org.hibernate.HibernateException;import org.hibernate.connection.ConnectionProvider;/** * 让Hibernate支持DBCP数据源 */public class DBCPConnectionProvider implements ConnectionProvider { private final static String BASE_KEY = "dscp."; protected DataSource dataSource; /** (non-Javadoc) * @see ConnectionProvider#configure(java.util.Properties) */ public void configure(Properties props) throws HibernateException { initDataSource(props); } /** (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#getConnection() */ public Connection getConnection() throws SQLException { return dataSource.getConnection(); } /** (non-Javadoc) * @see ConnectionProvider#closeConnection(java.sql.Connection) */ public void closeConnection(Connection conn) throws SQLException { if(conn!=null && !conn.isClosed()) conn.close(); } /** (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#close() */ public void close() throws HibernateException { if(dataSource != null){ try { Method mClose = dataSource.getClass().getMethod("close"); mClose.invoke(dataSource); } catch (NoSuchMethodException e) { } catch (Exception e) { if(e.getCause()!=null) throw new HibernateException(e.getCause()); else throw new HibernateException(e); } dataSource = null; } } /** (non-Javadoc) * @see ConnectionProvider#supportsAggressiveRelease() */ public boolean supportsAggressiveRelease() { return false; } /** * Initialize the datasource * @param props * @throws HibernateException */ @SuppressWarnings("unchecked") protected synchronized void initDataSource(Properties props) throws HibernateException { Properties new_props = new Properties(); Iterator keys = props.keySet().iterator(); while(keys.hasNext()){ String key = (String)keys.next(); if(key.startsWith(BASE_KEY)){ String value = props.getProperty(key); new_props.setProperty(key.substring(BASE_KEY.length()), value); } } try { dataSource = (DataSource)Class.forName("org.apache.commons.dbcp.BasicDataSource").newInstance(); BeanUtils.populate(dataSource, new_props); } catch (Exception e) { throw new HibernateException(e); } }}//该片段来自于http://byrx.net
用户点评