Hibernate3已经不再支持DBCP连接池,而推荐使用C3PO

DBCP的bug非常多,因此Hibernate3已经不再支持DBCP连接池,而推荐使用C3PO。建议你更换数据库连接池。  
 
 
然后跑去Hibernate官方论坛看,果然,在Please migrate away  
from DBCP看到Gavin说:  
引用:  
Guys, after many problems with DBCP, I have decided to remove built-in  
support for DBCP from Hibernate3, and deprecate DBCP in Hibernate 2.1.  
I advise everyone to migrate away from DBCP to something that actually  
works, like C3P0 or Proxool.  
 
 
(If you /must/ use DBCP, you can always write your own connection  
provider.)  
 
 
Actually, it is probably about time we remove any remaining  
dependencies to Apache commons stuff, since historically they have  
caused just /so/ much trouble. The only Apache things that do seem to  
work very well are Ant and log4j. Even commons-logging is a PIA,  
especially in Tomcat.  
 
C3P0是Hibernate3.0默认的自带数据库连接池,DBCP是Apache开发的数据库连接池。我们对这两种连接池进行压力测试对比,发现在并发30 0个用户以下时,DBCP比C3P0平均时间快1秒左右。但在并发400个用户时,两者差不多。  
 
 
速度上虽然DBCP比C3P0快些,但是有BUG:当DBCP建立的数据库连接,因为某种原因断掉后,DBCP将不会再重新创建新的连接,导致必须重新启动To mcat才能解决问题。DBCP的BUG使我们决定采用C3P0作为数据库连接池。

///

 

hibernate3已經不支持直接配置dbcp了,因為dbcp的bugs太多了...
 
為什麼網上的人老是這樣問怎麼配置dbcp.
hibernate的reference已經說得很清楚了.
 
實現org.hibernate.connection.ConnectionProvider接口就行了..
 
 
package app.db;
import org.apache.commons.dbcp.DataSourceConnectionFactory;
public class DbcpDataSource {
 private static DataSource ds = null;
 private static ConnectionFactory factory = null;
 
    public static DataSource getDataSource() {
  return ds;
 }
 public static ConnectionFactory getConnectionFactory() {
  return factory;
 }
 public static int getNumActive() {
  return ((BasicDataSource) ds).getNumActive();
 }
 public static int getMaxActive() {
  return ((BasicDataSource) ds).getMaxActive();
 }
 
 public static Connection getConnection() {
  try {
     return ds.getConnection();
  } catch(SQLException ex) {
   ex.printStackTrace();
  }
  return null;
 }
 
 public static final String DBCP_Driver_Class = "dbcp.driver_class";
 public static final String DBCP_ConnectionUrl = "dbcp.connection_url";
 public static final String DBCP_ConnectionUsername = "dbcp.connection_username";
 public static final String DBCP_ConnectionPassword = "dbcp.connection_password";
 public static final String DBCP_InitialSize = "dbcp.initial_size";
 public static final String DBCP_MaxIdle = "dbcp.max_idle";
 public static final String DBCP_MaxActive = "dbcp.max_active";
 public static DataSource inited(Properties props) {
        if(ds == null) ds = setupDataSource(props);
        Connection conn = null;
        Statement stmt = null;
        ResultSet rset = null;
        try {
            conn = ds.getConnection();
            stmt = conn.createStatement();
        } catch(SQLException e) {
            e.printStackTrace();
        } finally {
            try { if(rset != null) rset.close(); } catch(Exception e) { }
            try { if(stmt != null) stmt.close(); } catch(Exception e) { }
            try { if(conn != null) conn.close(); } catch(Exception e) { }
        }
         
        return ds;
    }
    private static DataSource setupDataSource(Properties props) {
     String cls = props.getProperty(DBCP_Driver_Class);
     String connectURI = props.getProperty(DBCP_ConnectionUrl);
     String userName = props.getProperty(DBCP_ConnectionUsername);
     String passWord = props.getProperty(DBCP_ConnectionPassword );
     String initalSize = props.getProperty(DBCP_InitialSize);
     int intInitalSize = 100;
     try {
      intInitalSize = Integer.parseInt(initalSize);
     } catch(Exception ex) {
     }
     String maxIdle = props.getProperty(DBCP_MaxIdle);
     int intMaxIdle = 10;
     try {
      intMaxIdle = Integer.parseInt(maxIdle);
     } catch(Exception ex) {
     }
     String maxActive = props.getProperty(DBCP_MaxActive);
     int intMaxActive = 10;
     try {
      intMaxActive = Integer.parseInt(maxActive);
     } catch(Exception ex) {
     }
     
        BasicDataSource bds = new BasicDataSource();
        bds.setDriverClassName(cls);
        bds.setUrl(connectURI);
        bds.setUsername(userName);
        bds.setPassword(passWord);
        bds.setInitialSize(intInitalSize);
        //﹍て渺钡计秖
        bds.setMaxIdle(intMaxIdle);
        // 程idle计
        bds.setDefaultAutoCommit(false);
        bds.setMaxActive(intMaxActive);
        //程祇计
        factory = new DataSourceConnectionFactory(bds);
        return bds;
    }
}
 
實現接口在hibernate中配置dbcp..
 
package app.db;
import org.hibernate.connection.ConnectionProvider;
public class DbcpConnectionProvider implements ConnectionProvider {
 private static final Log log = LogFactory.getLog(DbcpConnectionProvider.class);
 private DataSource ds;
 public void configure(Properties arg0) throws HibernateException {
  // TODO Auto-generated method stub
  try {
   Properties props1 = new Properties();
   props1.setProperty(DbcpDataSource.DBCP_Driver_Class,
     (String) app.core.Environment
       .getAttribute(DbcpDataSource.DBCP_Driver_Class));
   props1.setProperty(DbcpDataSource.DBCP_ConnectionUrl,
     (String) app.core.Environment
       .getAttribute(DbcpDataSource.DBCP_ConnectionUrl));
   props1.setProperty(
       DbcpDataSource.DBCP_ConnectionUsername,
       (String) app.core.Environment
         .getAttribute(DbcpDataSource.DBCP_ConnectionUsername));
   props1.setProperty(
       DbcpDataSource.DBCP_ConnectionPassword,
       (String) app.core.Environment
         .getAttribute(DbcpDataSource.DBCP_ConnectionPassword));
   props1.setProperty(DbcpDataSource.DBCP_InitialSize,
     (String) app.core.Environment
       .getAttribute(DbcpDataSource.DBCP_InitialSize));
   props1.setProperty(DbcpDataSource.DBCP_MaxIdle,
     (String) app.core.Environment
       .getAttribute(DbcpDataSource.DBCP_MaxIdle));
   props1.setProperty(DbcpDataSource.DBCP_MaxActive,
     (String) app.core.Environment
       .getAttribute(DbcpDataSource.DBCP_MaxActive));
   ds = DbcpDataSource.inited(props1);
   app.core.Environment.setAppDataSource(ds);
   
  } catch (Exception ex) {
   ex.printStackTrace();
   log.error(ex);
  }
 }
 public Connection getConnection() throws SQLException {
  // TODO Auto-generated method stub
  return ds.getConnection();
 }
 public void closeConnection(Connection arg0) throws SQLException {
  // TODO Auto-generated method stub
  arg0.close();
 }
 public void close() throws HibernateException {
  // TODO Auto-generated method stub
  try {
   ((BasicDataSource) ds).close();
  } catch(Exception ex) {
   ex.printStackTrace();
   log.error(ex);
  }
 }
 public boolean supportsAggressiveRelease() {
  // TODO Auto-generated method stub
  return false;
 }
}
 
 非最精簡的代碼,自已整理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值