Java学习Day26

今天做一个Java的高性能MySQL的例题:
import java.sql.;
import com.zaxxer.hikari.HikariDataSource;
public class OrderQueryService {
private final HikariDataSource dataSource;
// 初始化高性能连接池
public OrderQueryService() {
// HikariCP是性能最优的连接池实现
var config = new com.zaxxer.hikari.HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/shop?useSSL=false&serverTimezone=UTC&useServerPrepStmts=true");
config.setUsername("root");
config.setPassword("pass123");
config.setMaximumPoolSize(8); // 连接数设为CPU核心数
2较合理
config.setConnectionTimeout(30000);
this.dataSource = new HikariDataSource(config);
}
/**
* 高性能查询用户订单列表(带分页)
* 场景:电商平台查询用户30天内的有效订单,按创建时间倒序
*/
public void queryUserRecentOrders(Long userId, int pageNum, int pageSize) {
// SQL优化点1:只查询需要的字段,避免SELECT *
// SQL优化点2:WHERE条件使用索引字段(user_id, status, create_time)
// SQL优化点3:分页使用LIMIT,配合索引排序
String sql = "SELECT id, order_no, total_amount, create_time " +
"FROM orders " +
"WHERE user_id = ? " +
" AND status = 1 " + // 1表示有效订单
" AND create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY) " +
"ORDER BY create_time DESC " +
"LIMIT ?, ?";
try (// 自动关闭资源,无需手动finally
Connection conn = dataSource.getConnection();
// PreparedStatement优势:预编译+防SQL注入
PreparedStatement pstmt = conn.prepareStatement(sql)) {

        // 参数设置(索引从1开始)
        pstmt.setLong(1, userId);  // user_id是索引字段
        pstmt.setInt(2, (pageNum - 1) * pageSize);  // 计算偏移量
        pstmt.setInt(3, pageSize);

        // 执行查询
        long start = System.currentTimeMillis();
        try (ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                // 处理结果(实际项目中应映射为实体类)
                System.out.printf("订单号:%s,金额:%.2f%n",
                        rs.getString("order_no"),
                        rs.getBigDecimal("total_amount"));
            }
        }
        System.out.println("查询耗时:" + (System.currentTimeMillis() - start) + "ms");

    } catch (SQLException e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    // 测试:查询用户ID=100的第1页订单,每页20条
    new OrderQueryService().queryUserRecentOrders(100L, 1, 20);
}

}
连接池选择:使用 HikariCP 而非 DriverManager,通过池化连接减少 TCP 握手和认证开销,设置合理的连接数(CPU 核心数 * 2)。
SQL 语句优化:
避免SELECT *,只查询必要字段减少数据传输量
WHERE 条件使用联合索引(user_id, status, create_time),遵循最左前缀原则
用LIMIT分页而非加载全部数据,适合大数据量场景
题目中大部分来自AI,鉴于学习难度较大明天应该再次重温此题

posted @ 2025-07-26 20:05  灰太狼的蛋炒饭  阅读(10)  评论(0)    收藏  举报