老版本的 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);
}
}
}
|