Oracle数据库连接池的创建和使用
数据库连接池的主要操作如下:
- 建立数据库连接池对象(服务器启动)。
- 按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
- 对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象> 中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
- 存取数据库。
5> . 关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。- 释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
一、创建数据库连接池
创建数据库连接池步骤:
- 装载OracleDriver驱动对象
- 通过JDBC建立数据库连接
- 将连接加入连接池中
MyDataSource.java
package utils;
import oracle.jdbc.OracleDriver;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
/**
* @author LZDWTL
* @date 2021-05-19 16:18
*/
public class MyDataSource implements DataSource {
//链表 --- 实现栈结构
private LinkedList<Connection> dataSources = new LinkedList<Connection>();
//初始化连接数量
public MyDataSource() {
//一次性创建2个连接,因为创建多了会造成程序开始运行很慢
for(int i = 0; i < 2; i++) {
try {
//1、装载OracleDriver驱动对象
DriverManager.registerDriver(new OracleDriver());//等价于Class.forName("oracle.jdbc.driver.OracleDriver");
//2、通过JDBC建立数据库连接
Connection con =DriverManager.getConnection(
"jdbc:oracle:thin:@47.119.128.150:1521:orcl", "scott", "tiger");
//3、将连接加入连接池中
dataSources.add(con);
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println("连接池创建成功");
}
@Override
public Connection getConnection() throws SQLException {
//取出连接池中一个连接
final Connection conn = dataSources.removeFirst(); // 删除第一个连接返回
return conn;
}
//将连接放回连接池
public void releaseConnection(Connection conn) {
dataSources.add(conn);
}
//因为该类实现DataSource这个接口,后面还需要通过IDE去实现一些方法
}
二、进行数据库连接
数据库连接步骤:
- 创建数据库连接池对象
- 获取数据库连接
- 创建SQL对象
- 执行SQL语句
- 遍历结果集
- 释放连接
- 归还数据库连接给连接池
JDBC.java
package jdbc;
import bean.Order;
import utils.MyDataSource;
import java.sql.*;
import java.util.ArrayList;
/**
* @author 10237
* @date 2021-05-01 16:09
*/
public class JDBC {
private int userid;
private int shopid;
private int flag;
private String head[] = {"ID", "订单id", "订单名", "数量", "下单日期", "下单用户ID", "商店ID"};
public String[] getHead() {
return head;
}
public JDBC(int userid, int shopid, int flag) {
this.userid = userid;
this.shopid = shopid;
this.flag = flag;
}
/**
* 使用数据库连接池进行连接
*/
MyDataSource dataSource = new MyDataSource(); //1、创建数据库连接池对象
/**
* 查询卖家或卖家所有订单
*/
public Object[][] retrieveData() {
Object[][] data = null;
java.util.List<Order> list = new ArrayList<>();
Connection conn = null;//2、创建数据库连接
String sql = null;
if (flag == 1) {
sql = "select * from s_order where userid=" + userid; // sql语句
} else if (flag == 2) {
sql = "select * from s_order where shopid=" + shopid; // sql语句
}
PreparedStatement pstmt = null; //3、创建SQL对象
ResultSet rs = null;
try {
/**
* 使用数据库连接池进行连接
*/
conn =dataSource.getConnection(); //2、获取数据库连接
System.out.println("创建连接成功");
pstmt = conn.prepareStatement(sql); //3、创建SQL对象
rs = pstmt.executeQuery(); //4、执行sql语句,返回结果集到rs
while (rs.next()) { //5、返回结果集
Order order = new Order();
order.setId(rs.getInt(1));
order.setOcode(rs.getString(2));
order.setOname(rs.getString(3));
order.setOnum(rs.getInt(4));
order.setOdate(rs.getDate(5));
order.setUserid(rs.getInt(6));
order.setShopid(rs.getInt(7));
list.add(order);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close(); //6、关闭连接,释放资源。
pstmt.close();
// conn.close();
dataSource.releaseConnection(conn); //7、归还数据库连接给连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
data = new Object[list.size()][head.length];
for (int i = 0; i < list.size(); i++) {
//for (int j=0;j<head.length;j++){
data[i][0] = list.get(i).getId();
data[i][1] = list.get(i).getOcode();
data[i][2] = list.get(i).getOname();
data[i][3] = list.get(i).getOnum();
data[i][4] = list.get(i).getOdate();
data[i][5] = list.get(i).getUserid();
data[i][6] = list.get(i).getShopid();
// }
}
return data;
}
}
总结
1、遇到的问题
在常见连接池的时候,因为我没有采用打印的方式去检测,我曾一度以为这个类写错了,因为运行的时候它一直没有响应。后来才发现原来是需要创建10个连接之后才能弹出窗口,而创建连接又需要大量时间(因为我这个是连接服务器的数据库),故这里会卡很久,可以通过调整连接数来减小打开的时间。