当使用BDCP 连接的时候 出现一下错误时:
Caused By: java.lang.ClassNotFoundException: Class bytes found but defineClass()failed for: 'org.apache.commons.dbcp2.BasicDataSource'
Caused By: java.lang.UnsupportedClassVersionError: org/apache/commons/dbcp2/BasicDataSource : Unsupported major.minor version 52.0
表示 jdk 版本 不对应 BasicDataSource 所在的版本版本 ,下载 相对应版本即可, 地址:
http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
附上:DBCP 连接池代码
用到的类:
- 需在工程内导入一下jar包
commons-collections4-4.0.jar
commons-dbcp-1.4.jar
commons-pool-1.6.jar
- BasicDataSource 这是需要创建的dbcp连接池对象
- ThreadLoacl 这个类可以以键值对的方式保存当前线程及连接。
- Properties 配置文件所需要用到的类,加载输入流后可以读取配置文件信息。
源代码:
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil2 {
private DBUtil2() {
}
private static BasicDataSource bds = null;
private static ThreadLocal<Connection> tl = null;
//使用静态代码块在程序启动的时候就初始化
static {
try {
//创建配置文件对象
Properties prop = new Properties();
//创建流对象
InputStream is = DBUtil2.class.getClassLoader().getResourceAsStream("com_huang_JDBC_04/config.properties.txt");
//将配置文件加载到流对象中
prop.load(is);
//加载完成,关闭流对象
is.close();
//获取配置文件内的值
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String pwd = prop.getProperty("pwd");
int initsize = Integer.parseInt(prop.getProperty("initsize"));
int maxactive = Integer.parseInt(prop.getProperty("maxactive"));
int maxwait = Integer.parseInt(prop.getProperty("maxwait"));
int maxidle = Integer.parseInt(prop.getProperty("maxidle"));
int minidle = Integer.parseInt(prop.getProperty("minidle"));
//创建数据库连接池
bds = new BasicDataSource();
bds.setDriverClassName(driver);
bds.setUrl(url);
bds.setUsername(user);
bds.setPassword(pwd);
bds.setInitialSize(initsize);
bds.setMaxActive(maxactive);
bds.setMaxWait(maxwait);
bds.setMaxIdle(maxidle);
bds.setMinIdle(minidle);
tl = new ThreadLocal<Connection>();
}catch(IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
/*
* 需要从数据库连接池返回一个连接给调用者
*/
Connection conn = null;
try {
conn = bds.getConnection();
tl.set(conn);
}catch(SQLException s) {
s.printStackTrace();
}
return conn;
}
public static void closeConncetion() {
Connection conn = tl.get();
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
附上:配置详情(对应最新版)
BasicDataSource Configuration 配置参数 中文版
Parameter | Descripton |
---|---|
username | 用来建立jdbc连接的用户名 |
password | 用来建立jdbc连接的密码 |
url | 建立连接的url |
driverClassName | jdbc driver className |
connectionProperties | 连接使用的properties.使用的格式必须是[propertyName=property;]* |
properties配置:
Parameter | default | Description |
---|---|---|
defaultAutoCommit | driver default | 这个连接池默认的自动提交状态.如果没有设置,setAutoCommit方法不会被调用 |
defaultReadOnly | driver default | 这个连接池默认的读写状态。如果没有设置,setReadOnly方法就不会调用(一些数据库不支持readOnly模式,比如informix) |
defaultTransactionIsolation | driver default | 默认的隔离级别.必须是其中一个(NONE,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,SERIALIZABLE) |
defaultCatalog | 连接池默认创建的连接数 | |
cacheState | true | 如果是true, 连接池将会缓存readOnly和auto Commit配置,在第一次进行读或者写的时候.这会减少以后的数据库查询.如果获取连接后,这个连接自己设置readOnly和自动提交设置,这些配置不会影响到当前中的配置。在这种情况下,如果我们想要这种设置生效,caching应该把这个设置成disable. |
defaultQueryTimeout | null | 如果不是null,这个Integer的value将会用来衡量timeout,从连接创建时就开始计算。null意味着driver default将会被使用. |
enableAutocommitOnReturn | true | 如果是true,连接如果返回到池的时候,将会检查是否被设置成了autoAutoCommit为false,那么就会调用Connection.setAutoCommit(true) |
roolbackOnReturn | true | True意味着如果设置了autoCommit为false和readonly胃false的时候,当回到连接池的时候就回滚 |
Parameter | Default | Description |
---|---|---|
initialSize | 0 | 连接池创建的时候,建立的连接数.从1.2起 |
maxTotal | 8 | 一个时间最大的活跃连接数,负数代表没有上限 |
maxIdle | 8 | 最大的idle保持数,其他的将会释放,负数代表没有上限 |
minIdle | 0 | 最小的idle保持数,其他的将会被创建,0代表不保持 |
maxWaitMillis | indefinitely | 获取连接最大等待时间,-1代表一直等 |
Parameter | Default | Description |
---|---|---|
validationQuery | 在返回连接前,是否进行验证。如果使用,必须使用一个SQL SELECT返回至少一行.如果没有配置,连接调用isValid()方法. | |
validationQueryTimeout | no timeout | 连接验证超时的秒数,如果设置为正数,将会用来验证连接的sql执行 |
testOnCreate | false | 在连接创建时,是否进行验证。如果验证失败,从连接池获取就会失败. |
testOnBorrow | true | 在从池中借连接的时候是否验证。如果验证失败,就会放弃这个连接,试图获取另外一个. |
testOnReturn | true | 在返回连接给连接池的时候,是否进行验证. |
testWhileIdle | false | 空闲连接是否进行验证,如果失败,就会从连接池去除. |
timeBetweenEvictionRunsMillis | -1 | 空闲连接验证执行的时间间隔,负数将会代表不会执行 |
numTestsPerEvictionRun | 3 | 执行空闲连接验证的线程数. |
minEvictableIdleTimeMillis | 1000 * 60 * 30 | 空闲保持时间,在这时间之后再进行空闲验证 |
softMinEvictableIdleTimeMillis | -1 | 这个是空闲保持时间的软限制,如果设置最小空闲保持时间(这时候不考虑需要保持空闲连接数),则先和最小空闲保持时间对比,再和这个参数比。 |
maxConnLifetimeMillis | -1 | 连接最大的生命时间。如果超过了这个时间,那么在下次活跃,不活跃或者验证测试的时候就会失败。0或者小于0代表连接没有生命上限 |
logExpiredConnections | true | 是否记录超时的连接数 |
connectionInitSqls | null | 建立连接的时候调用的sql,只有在connection fatory创建的时候调用 |
lifo | true | 这个一个队列模式lifo(last in first out)。如果设置为false,则为FIFO |
Parameter | Default | Description |
---|---|---|
accessToUnderlyingConnectionAllowed | false | 是否可以PoolGuard可以获取底层连接 |
removeAbandonedOnMaintenance removeAbandonedOnBorrow | false | 这个是用来保证应用程序关闭连接失败的情况。在超时不使用并且超过抛弃时间后就会被抛弃掉。条件超时,还有其他条件:getNumActive() > getMaxTotal() - 3; and getNumIdle() < 2 |
removeAbandonedTimeout | 300 | 抛弃的时间 |
logAbandoned | false | 是否记录abandoned的日志 |
abandonedUsageTracking | false | 是否记录trace,debug的时候比较有用 |
fastFailValidation | false | 这个设置为true的时候,validation快速失败当connection抛出fatal SqlException的时候。当对一个已经关闭的连接发出isValid方法和一个合法query的时候,就会快速失败.SQL_STATE默认是:(57P01 (ADMIN SHUTDOWN) 57P02 (CRASH SHUTDOWN) 57P03 (CANNOT CONNECT NOW) 01002 (SQL92 disconnect error) JZ0C0 (Sybase disconnect error) JZ0C1 (Sybase disconnect error) Any SQL_STATE code that starts with “08”) 可以通过设置disconnectionSqlCodes属性进行override |
disconnectionSqlCodes | null | 配合fastValidation使用,用来设置需要包括的sql_state |