JDBC演进之路:从基础操作到高效连接池


一、JDBC 1.0:手动管理的起点

1.1 核心特点

手动加载驱动:通过Class.forName()或DriverManager.registerDriver()显式注册驱动。

硬编码连接信息:数据库URL、用户名、密码直接写在代码中。

资源手动关闭:需逐一手动关闭Connection、Statement、ResultSet。

1.2 代码示例:

public class JdbcUtils {
    // 硬编码数据库信息
    public static Connection getConnection() {
        Connection conn = null;
        try {
            DriverManager.registerDriver(new Driver()); // 加载驱动
            conn = DriverManager.getConnection("jdbc:mysql:///spring_db", "root", "1234");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    // 手动关闭资源
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try { rs.close(); } catch (Exception e) { e.printStackTrace(); }
        try { stmt.close(); } catch (Exception e) { e.printStackTrace(); }
        try { conn.close(); } catch (Exception e) { e.printStackTrace(); }
    }
}

1.3 痛点分析

  • 代码冗余:每次操作需重复编写连接和关闭逻辑。
  • 维护困难:修改数据库配置需改动源码。
  • 性能低下:频繁创建和销毁连接消耗资源。

二、JDBC 2.0:配置化的升级

2.1 核心改进

  • 配置文件分离:使用db.properties存储数据库配置。
  • 动态加载配置:通过Properties类读取配置文件,实现解耦。
  • 统一资源管理:封装工具类减少重复代码。

2.2 代码示例

# db.properties
driverclass=com.mysql.jdbc.Driver
url=jdbc:mysql:///spring_db
username=root
password=1234
public class JdbcUtils2 {
    private static String driverclass;
    private static String url;
    private static String username;
    private static String password;

    static {
        // 加载配置文件
        Properties pro = new Properties();
        try (InputStream in = JdbcUtils2.class.getResourceAsStream("/db.properties")) {
            pro.load(in);
            driverclass = pro.getProperty("driverclass");
            url = pro.getProperty("url");
            username = pro.getProperty("username");
            password = pro.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 动态加载驱动并获取连接
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(driverclass); // 反射加载驱动
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
}

2.3 优势与不足

  • 优势:

    • 配置与代码分离,便于维护。
    • 减少硬编码,提升灵活性。
  • 不足:

    • 仍依赖DriverManager,无法解决频繁创建连接的性能问题。

三、JDBC 3.0:连接池的革命

3.1 核心改进

  • 连接池管理:使用Druid等连接池,预先创建连接,随用随取。
  • 性能飞跃:连接复用减少创建开销,支持并发和高负载。
  • 自动化资源管理:通过DataSource接口隐藏底层细节。

3.2 代码示例

# druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///spring_db
username=root
password=1234
initialSize=5
maxActive=20
maxWait=3000
public class JdbcUtils3 {
    private static DataSource dataSource;

    static {
        try {
            // 加载配置文件并初始化连接池
            Properties props = new Properties();
            props.load(JdbcUtils3.class.getResourceAsStream("/druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
            throw new RuntimeException("连接池初始化失败", e);
        }
    }

    // 从连接池获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    // 归还连接(实际是关闭资源)
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try { rs.close(); } catch (Exception ignored) {}
        try { stmt.close(); } catch (Exception ignored) {}
        try { conn.close(); } catch (Exception ignored) {}
    }
}

3.3 核心优势

  • 性能提升:连接复用减少70%的创建时间。
  • 资源可控:限制最大连接数,防止数据库过载。
  • 功能扩展:支持监控、SQL日志等高级功能。

四、版本对比与演进意义

特性JDBC 1.0JDBC 2.0JDBC 3.0
配置管理硬编码配置文件配置文件 + 连接池参数
连接获取手动创建动态加载连接池自动分配
性能低(频繁创建连接)高(连接复用)
维护成本高(修改需重新编译)低(修改配置文件)低(配置 + 监控)
适用场景简单Demo中小型项目高并发、生产环境

五、实战:从1.0到3.0的查询示例

5.1 JDBC 1.0版本

public class JdbcDemo1 {
    public static void main(String[] args) {
        Connection conn = JdbcUtils.getConnection();
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * FROM account");
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(conn, stmt, rs);
        }
    }
}

5.2 JDBC 3.0版本(优化后)

public class JdbcDemo3 {
    public static void main(String[] args) {
        try (
            Connection conn = JdbcUtils3.getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM account")
        ) {
            while (rs.next()) {
                System.out.println(rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

六、总结

  • JDBC 1.0:适合快速验证功能,但缺乏扩展性和维护性。
  • JDBC 2.0:通过配置文件解耦,适合中小项目。
  • JDBC 3.0:连接池大幅提升性能,是高并发场景的标配。

演进启示:技术的升级始终围绕解耦、性能和易用性展开。掌握每个版本的核心思想,才能在实际项目中灵活选择最优方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值