让Hibernate支持DBCP数据源

来源:互联网 发布:辐射4bodyslide数据 编辑:程序博客网 时间:2024/04/29 15:14
老版本的 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>
 */
packagecom.dlog4j.dbaccess;
 
importjava.lang.reflect.Method;
importjava.sql.Connection;
importjava.sql.SQLException;
importjava.util.Iterator;
importjava.util.Properties;
 
importjavax.sql.DataSource;
 
importorg.apache.commons.beanutils.BeanUtils;
importorg.hibernate.HibernateException;
importorg.hibernate.connection.ConnectionProvider;
 
/**
 * 让Hibernate支持DBCP数据源
 */
publicclass DBCPConnectionProvider implementsConnectionProvider {
 
    privatefinal static String BASE_KEY = "dscp.";
     
    protectedDataSource dataSource;
     
    /** (non-Javadoc)
     * @see ConnectionProvider#configure(java.util.Properties)
     */
    publicvoid configure(Properties props) throwsHibernateException {
        initDataSource(props);
    }
     
    /** (non-Javadoc)
     * @see org.hibernate.connection.ConnectionProvider#getConnection()
     */
    publicConnection getConnection() throwsSQLException {    
        returndataSource.getConnection();
    }
 
    /** (non-Javadoc)
     * @see ConnectionProvider#closeConnection(java.sql.Connection)
     */
    publicvoid closeConnection(Connection conn) throwsSQLException {
        if(conn!=null&& !conn.isClosed())
            conn.close();
    }
 
    /** (non-Javadoc)
     * @see org.hibernate.connection.ConnectionProvider#close()
     */
    publicvoid close() throwsHibernateException {
        if(dataSource != null){
            try{
                Method mClose = dataSource.getClass().getMethod("close");
                mClose.invoke(dataSource);
            }catch(NoSuchMethodException e) {
            }catch(Exception e) {
                if(e.getCause()!=null)
                    thrownew HibernateException(e.getCause());
                else
                    thrownew HibernateException(e);
            }
            dataSource = null;
        }
    }
 
    /** (non-Javadoc)
     * @see ConnectionProvider#supportsAggressiveRelease()
     */
    publicboolean supportsAggressiveRelease() {
        returnfalse;
    }
 
    /**
     * Initialize the datasource
     * @param props
     * @throws HibernateException
     */
    @SuppressWarnings("unchecked")
    protectedsynchronized void initDataSource(Properties props)
           throwsHibernateException {
        Properties new_props = newProperties();
        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) {
            thrownew HibernateException(e);
        }
    }
 
}

0 0