让Hibernate支持DBCP数据源

老版本的 Hibernate 不支持 DBCP 连接池,不过没关系,有了这个类就可以轻松搞定。

配置:hibernate.connection.provider_class com.dlog4j.dbaccess.DBCPConnectionProvider

标签: DBCP 数据源 连接池 DataSource ConnectionProvider Hibernate

[1].[代码] DBCPConnectionProvider.java 跳至 [1]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
  * DataSourceConnectionProvider.java of www.dlog.cn
  * 作者: Winter Lau
  * 时间: 2008-4-20
  * 项目主页: <a href="http://www.dlog4j.com/">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);
         }
     }
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值