一,使用连接池DBCP,主要作用是:
1,提高性能,给客户带来价值
2,控制并发,提升安全性(ThreadLocal)
二,连接池的使用步骤
--导包
--修改数据库配置文件db.propertis
--重写DBUtil(BasicDataSourceFactory,BasicDataSource)
db.properties:
username=***
password=***
url=jdbc:oracle:thin:@localhost:1521:***
driverClassName=oracle.jdbc.OracleDriver
initialSize=***
maxActive=***
maxIdle=***
maxWait=***
1,提高性能,给客户带来价值
2,控制并发,提升安全性(ThreadLocal)
二,连接池的使用步骤
--导包
--修改数据库配置文件db.propertis
--重写DBUtil(BasicDataSourceFactory,BasicDataSource)
db.properties:
username=***
password=***
url=jdbc:oracle:thin:@localhost:1521:***
driverClassName=oracle.jdbc.OracleDriver
initialSize=***
maxActive=***
maxIdle=***
maxWait=***
DBUtil:
public class DBUtil {
private static DataSource ds;
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
static{
Properties p = new Properties();
try {
p.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
ds = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("读取数据库资源文件失败!",e);
}
}
/*
* get Connection
*/
public static Connection getConnection(){
//tl.get(),以当前线程名从Map中取值
Connection con = tl.get();
if(con==null){
try {
//从连接池中获取,tl.set(con)以当前线程名为key,将con对象存入Map
con = ds.getConnection();
tl.set(con);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("获取数据库连接失败!", e);
}
}
return tl.get();
}
/*
* close Connection
*/
public static void close(){
Connection con = tl.get();
if(con!=null){
try {
con.close();
//将连接还回池中时,需要将ThreadLocal中对应的数据清理掉
tl.set(null);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("关闭数据库连接失败!", e);
}
}
}
}