Oracle数据库连接池的创建和使用

数据库连接池的主要操作如下:

  1. 建立数据库连接池对象(服务器启动)。
  2. 按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  3. 对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象> 中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  4. 存取数据库。
    5> . 关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  5. 释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

一、创建数据库连接池

创建数据库连接池步骤:

  1. 装载OracleDriver驱动对象
  2. 通过JDBC建立数据库连接
  3. 将连接加入连接池中

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去实现一些方法
}

二、进行数据库连接

数据库连接步骤:

  1. 创建数据库连接池对象
  2. 获取数据库连接
  3. 创建SQL对象
  4. 执行SQL语句
  5. 遍历结果集
  6. 释放连接
  7. 归还数据库连接给连接池

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个连接之后才能弹出窗口,而创建连接又需要大量时间(因为我这个是连接服务器的数据库),故这里会卡很久,可以通过调整连接数来减小打开的时间。

sql server 链接释放 如何释放数据库连接池_java