面试题答案
一键面试使用JDBC进行批量操作
- 获取数据库连接:通过
DriverManager.getConnection(url, username, password)
获取数据库连接,或从连接池中获取连接。 - 创建Statement或PreparedStatement:
- Statement:
Statement statement = connection.createStatement();
- PreparedStatement:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
- Statement:
- 添加SQL语句到批处理:
- Statement:
statement.addBatch(sql);
,这里的sql
是完整的SQL语句,例如INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2')
。 - PreparedStatement:先设置参数,再添加到批处理。例如:
preparedStatement.setString(1, "value1"); preparedStatement.setString(2, "value2"); preparedStatement.addBatch();
- Statement:
- 执行批处理:
statement.executeBatch();
或preparedStatement.executeBatch();
连接池管理优化性能
- 选择合适的连接池:如HikariCP、Tomcat JDBC Pool等。这些连接池性能较好,能有效管理数据库连接,减少连接创建和销毁的开销。
- 合理配置连接池参数:
- 最大连接数:根据应用的负载和数据库的承受能力设置,避免过多连接导致数据库性能下降。例如,对于一个中等规模的应用,最大连接数可设置为50 - 100。
- 最小连接数:设置一定数量的最小连接,保证应用启动后有可用连接,减少首次请求时的连接创建时间。一般可设置为5 - 10。
- 连接超时时间:合理设置连接获取和使用的超时时间,避免长时间等待或占用无效连接。
批处理方式选择
- Statement.addBatch():
- 区别:
- 直接添加完整的SQL语句,不会对参数进行预编译。每次添加的SQL语句在语法和结构上都完全相同。
- 适用于简单的SQL语句,且不需要动态参数的情况。
- 适用场景:例如批量插入固定数据,如初始化数据库表中一些固定的基础数据。
- 区别:
- PreparedStatement.addBatch():
- 区别:
- 使用占位符
?
,会对SQL语句进行预编译,提高执行效率。每次添加时只需设置不同的参数值,SQL语句结构不变。 - 能有效防止SQL注入攻击,安全性更高。
- 使用占位符
- 适用场景:大多数动态参数的批量操作场景,如根据不同用户数据进行批量插入或更新。
- 区别:
事务处理优化性能
- 开启事务:
connection.setAutoCommit(false);
,关闭自动提交,将多个SQL操作作为一个事务处理。 - 执行批处理操作:在事务开启后执行上述的批量操作。
- 提交或回滚事务:
- 如果所有批量操作都成功,调用
connection.commit();
提交事务。 - 如果在执行过程中出现异常,调用
connection.rollback();
回滚事务,确保数据的一致性。这样可以减少数据库的I/O操作次数,提高批量执行的性能。
- 如果所有批量操作都成功,调用