您的位置:首页 > 数据库

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

2018-03-01 00:40 633 查看
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() {
Conne
a91d
ction 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结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: