import java.sql.ResultSet;
import java.sql.Statement;
* 连接池基本用法
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
String driver = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String username = "zqk";
String password = "zqk123";
//设置必须的参数
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
//设置连接池的管理策略参数
ds.setInitialSize(2);
ds.setMaxActive(100);
//使用连接池中的数据库连接
Connection conn = ds.getConnection();
//执行sql
Statement st = conn.createStatement();
String sql = "select 'hello' as a "
+ "from dual";
ResultSet rs = st.executeQuery(sql);
while(rs.next()) {
String str = rs.getString("a");
//如果执行的结果是hello,说明我们的sql
//语句成功的发送到了数据库,并且成功的返回了数据
System.out.println(str);
}
//归还连接到数据库连接池
conn.close();
/*
* 运行没有问题以后我们,我们需要把连接的过程封装成一个DbUtils
* 这个DbUtils可以用在并发的环境下,昨天的DbUtils也是可以使用的
* 但是只能用在单线程的情况下,并发需要我们这个类里面的连接池
*/
}
}
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
* 连接池版本的 数据库 连接管理工具类
* 适合于并发场合
* 封装数据源连接池
*/
public class DBUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
private static int initSize;
private static int maxActive;
private static BasicDataSource ds;
/*
* 创建连接池,读值赋值
*/
static {
//创建连接池
ds = new BasicDataSource();
Properties cfg = new Properties();
try {
InputStream in = DBUtils.class
.getClassLoader().getResourceAsStream("db.properties");
//通过流打开文件
cfg.load(in);
//初始化参数
driver = cfg.getProperty("jdbc.driver");
url = cfg.getProperty("jdbc.url");
username = cfg.getProperty("jdbc.username");
password = cfg.getProperty("jdbc.password");
//initSize是一个整数,但是key这个里面存的是字符串,那么
//怎么把整数变成字符串呢?
initSize = Integer.parseInt(cfg.getProperty("initSize"));
maxActive = Integer.parseInt(cfg.getProperty("maxActive"));
in.close();
//初始化连接池
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setInitialSize(initSize);
ds.setMaxActive(maxActive);
}catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
public static Connection getConnection() {
try {
//getConnection()从连接池中获取重用的连接
//如果连接池满了,则等待
//如果有连接归还则获取重用的连接
Connection conn = ds.getConnection();
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void close(Connection conn) {
if(conn!=null) {
try{
//将用过的连接归还到连接池
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
public static void rollback(Connection conn) {
try {
if(conn!=null) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
——————————————————————————————————————————————————————————————————
package cn.tedu.jdbc.day02;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class Demo02 {
Connection conn = null;
try {
conn = DBUtils.getConnection();
Statement st = conn.createStatement();
String sql = "select 'HELLO' as a "
+ "from dual";
ResultSet rs = st.executeQuery(sql);
while(rs.next()) {
String str = rs.getString("a");
System.out.println(str);
}
rs.close();
st.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtils.close(conn);
}
}
/*
* 搞完这个以后我们搞点并发出来
*
* 看图:多线程连接数据库,反映线程池的并发管理
* 连接总数控制成两个,
* 写一个线程类
*
*/
————————————————————————————————————————————————————
package cn.tedu.jdbc.day02;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class Demo03 {
public static void main(String[] args) {
Thread t1 = new DemoThread(5000);
Thread t2 = new DemoThread(6000);
Thread t3 = new DemoThread(2000);
t1.start();
t2.start();
t3.start();
}
}
class DemoThread extends Thread{
int wait;
public DemoThread(int wait) {
this.wait = wait;
}
public void run() {
Connection conn = null;
try {
conn = DBUtils.getConnection();
System.out.println("获取了连接:"+conn);
Thread.sleep(wait);
String sql = "select 'Hello' as a "
+ "from dual";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getString("a"));
}
System.out.println(wait+"结束");
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtils.close(conn);
}
}
}
执行以后的结果如下:(不固定)
获取了连接:jdbc:oracle:thin:@127.0.0.1:1521:XE, UserName=ZQK, Oracle JDBC driver
获取了连接:jdbc:oracle:thin:@127.0.0.1:1521:XE, UserName=ZQK, Oracle JDBC driver
Hello
5000结束
获取了连接:jdbc:oracle:thin:@127.0.0.1:1521:XE, UserName=ZQK, Oracle JDBC driver
Hello
6000结束
Hello
2000结束