1.事务的特性
- 原子性(Atomicity)
含义:事务被视为最小的工作单位,事务中的所有操作要么全都完成,要么全都不完成,不会结束在中间某个环节。事务在执行过程中发生错误会被回滚(Rollback)到事务开始前的状态,就像这个事务从未被执行过一样。 - 一致性(Consistency)
含义:事务必须使数据库从一个一致性状态转换到另一个一致性状态。一致性状态的含义是数据库中的数据应满足所有的完整性约束。无论事务成功还是失败,数据库都不应该被破坏。 - 隔离性(Isolation)
含义:通常情况下,一个事务所做的修改在最终提交之前,对其他事务是不可见的。这个特性隔离了同时运行的多个事务,防止它们互相干扰。在并发环境中,隔离性可以防止多个事务同时操作相同的数据而导致数据不一致。 - 持久性(Durability)
含义:一旦事务提交,则其所做的修改将永久保存在数据库中,即使系统发生故障。持久性意味着事务完成后,对数据库的修改是永久性的,且不可逆转的。
2.PreparedStatement和Statement的区别
- 参数化查询
PreparedStatement:支持参数化查询,即可以使用占位符(?)来代替 SQL 语句中的直接值,然后通过设置参数的值来执行 SQL 语句。这种方式使得 PreparedStatement 更加灵活,并且可以重用相同的 SQL 语句结构但带有不同的参数值。
Statement:不支持参数化查询,每次执行 SQL 语句时都需要将 SQL 语句作为字符串传递,这使得拼接动态 SQL 时可能会更麻烦且容易出错。 - SQL 注入攻击防护
PreparedStatement:由于其支持参数化查询,PreparedStatement 在一定程度上可以防止 SQL 注入攻击,因为传递的参数值不会直接解析为 SQL 语句的一部分。
Statement:使用字符串拼接来构造 SQL 语句,如果不小心处理用户输入,很容易受到 SQL 注入攻击。 - 性能
PreparedStatement:通常比 Statement 更高效,尤其是在执行相同 SQL 语句多次,但每次使用不同的参数值时。数据库可以预编译 PreparedStatement 的 SQL 语句,因此当 SQL 语句结构相同但参数值不同时,可以重用已有的执行计划,从而提高性能。
Statement:每次执行都需要数据库编译 SQL 语句,无法利用 SQL 语句的重用来优化性能。 - 批处理
两者都支持批处理操作,但是 PreparedStatement 在批处理方面通常表现更好,因为它可以重用预编译的 SQL 语句。
Statement stmt = connection.createStatement(); String sql = "SELECT * FROM users WHERE id = " + userId; // 风险:SQL 注入 ResultSet rs = stmt.executeQuery(sql);
String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, userId); // 使用占位符设置参数 ResultSet rs = pstmt.executeQuery();
PreparedStatement 在安全性、性能和灵活性方面通常优于 Statement,特别是在需要执行参数化查询的场景下。因此,在实际开发中,推荐优先使用 PreparedStatement。
3.使用连接池与不使用连接池的区别
使用连接池
性能提升:连接池在应用启动时预先创建了一定数量的数据库连接,并在这个池中维护这些连接。当应用程序需要访问数据库时,它可以直接从池中获取一个已经建立的连接,避免了连接建立和断开的开销,从而提高了性能。
资源利用:连接池可以有效地管理和复用数据库连接,减少资源的浪费。它可以控制同时打开的连接数量,避免过多的连接占用过多的数据库和网络资源。
稳定性和可靠性:连接池提供了连接的管理机制,比如检测连接的有效性、自动断开空闲连接等,增加了系统的稳定性和可靠性。
可配置性:连接池通常提供了丰富的配置选项,如最大连接数、最小连接数、连接超时时间、空闲连接的处理策略等,使得数据库连接的管理更加灵活和高效。
不使用连接池
性能开销:每次数据库操作都需要建立和断开数据库连接,这个过程涉及到网络通信、数据库资源的申请和释放等,都会产生相对较大的性能开销。
资源消耗:由于每次操作都需要重新建立连接,可能会导致数据库服务器和网络环境在短时间内承受较大的压力,特别是在高并发的情况下。
稳定性问题:频繁地建立和断开连接可能会导致数据库服务器资源耗尽,例如数据库连接数达到上限,影响系统的稳定性和可靠性。
管理复杂性:在没有连接池的情况下,开发者可能需要手动管理数据库连接的生命周期,包括错误处理和确保连接最终被关闭等,增加了开发和维护的复杂度。
标签:语句,PreparedStatement,数据库,面试,SQL,连接,连接池 From: https://www.cnblogs.com/lxs666/p/18126275