JDBC连接数据库_通过连接池连接

import org.apache.commons.dbcp.BasicDataSource;通过导入该包实现

package cn.tedu.jdbc.day02;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.commons.dbcp.BasicDataSource;
/*
 * 连接池基本用法
 */

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也是可以使用的
   * 但是只能用在单线程的情况下,并发需要我们这个类里面的连接池
   */

 }
}

——————————————————————————————————————————————————————————————

创建一个可以处理并发情况下的一个连接管理方法,包括创建连接池并初始化,获取连接,归还连接,回退这几个方法。


package cn.tedu.jdbc.day02;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
/*
 * 连接池版本的 数据库 连接管理工具类
 * 适合于并发场合
 * 封装数据源连接池
 */

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 {
public static void main(String[] args) {
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结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值