当前位置: 首页 > news >正文

Java 池化技术

Java中的池化技术,这是一种通过重用对象来提升性能的重要技术。

1. 什么是池化技术

池化技术的核心思想是:将资源预先创建好,放在一个"池子"里,需要时从池中获取,用完后归还,而不是每次都创建新的。

2. 常见的池化技术

2.1 线程池

import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { // 创建固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(5); // 提交任务 for (int i = 0; i < 10; i++) { executor.submit(() -> { System.out.println(Thread.currentThread().getName() + " 执行任务"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } // 关闭线程池 executor.shutdown(); } // 自定义线程池(推荐方式) public static ExecutorService createCustomThreadPool() { return new ThreadPoolExecutor( 5, // 核心线程数 10, // 最大线程数 60L, // 空闲线程存活时间 TimeUnit.SECONDS, // 时间单位 new LinkedBlockingQueue<>(100), // 任务队列 new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 ); } }

2.2 数据库连接池

import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.*; public class ConnectionPoolExample { private static HikariDataSource dataSource; static { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); config.setUsername("root"); config.setPassword("password"); config.setMaximumPoolSize(10); config.setMinimumIdle(5); config.setConnectionTimeout(30000); dataSource = new HikariDataSource(config); } public static void main(String[] args) { // 使用连接 try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users"); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { System.out.println(rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); } } }

2.3 对象池(Apache Commons Pool)

import org.apache.commons.pool2.*; import org.apache.commons.pool2.impl.*; // 1. 定义可池化的对象 class ExpensiveObject { private String id; public ExpensiveObject() { System.out.println("创建新对象"); this.id = String.valueOf(System.currentTimeMillis()); } public void doSomething() { System.out.println("对象 " + id + " 执行操作"); } } // 2. 创建对象工厂 class ExpensiveObjectFactory extends BasePooledObjectFactory<ExpensiveObject> { @Override public ExpensiveObject create() { return new ExpensiveObject(); } @Override public PooledObject<ExpensiveObject> wrap(ExpensiveObject obj) { return new DefaultPooledObject<>(obj); } } // 3. 使用对象池 public class ObjectPoolExample { public static void main(String[] args) { GenericObjectPool<ExpensiveObject> pool = new GenericObjectPool<>(new ExpensiveObjectFactory()); pool.setMaxTotal(5); pool.setMaxIdle(3); pool.setMinIdle(1); try { // 从池中获取对象 ExpensiveObject obj1 = pool.borrowObject(); ExpensiveObject obj2 = pool.borrowObject(); obj1.doSomething(); obj2.doSomething(); // 归还对象 pool.returnObject(obj1); pool.returnObject(obj2); } catch (Exception e) { e.printStackTrace(); } } }

3. 池化技术的优势

3.1 性能提升

  • 减少创建开销:避免频繁创建和销毁对象

  • 降低GC压力:减少对象创建,降低垃圾回收频率

  • 提高响应速度:对象已经创建好,直接使用

3.2 资源控制

public class ResourceControlExample { // 控制数据库连接数,避免耗尽数据库资源 @Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { HikariConfig config = new HikariConfig(); config.setMaximumPoolSize(20); // 最大连接数 config.setMinimumIdle(5); // 最小空闲连接 config.setConnectionTimeout(30000); // 连接超时 return new HikariDataSource(config); } } }

4. 自定义简单对象池

import java.util.concurrent.*; import java.util.*; public class SimpleObjectPool<T> { private final BlockingQueue<T> pool; private final int maxSize; private final ObjectFactory<T> factory; private int createdCount = 0; public interface ObjectFactory<T> { T create(); } public SimpleObjectPool(int maxSize, ObjectFactory<T> factory) { this.maxSize = maxSize; this.factory = factory; this.pool = new LinkedBlockingQueue<>(maxSize); } public T borrow() throws InterruptedException { T obj = pool.poll(); if (obj != null) { return obj; } // 池为空,创建新对象(但不超过最大限制) synchronized (this) { if (createdCount < maxSize) { createdCount++; return factory.create(); } } // 等待归还 return pool.take(); } public void return_(T obj) { if (obj != null) { pool.offer(obj); } } // 使用示例 public static void main(String[] args) { SimpleObjectPool<StringBuilder> pool = new SimpleObjectPool<>( 3, StringBuilder::new ); try { StringBuilder sb = pool.borrow(); sb.append("Hello"); pool.return_(sb); } catch (InterruptedException e) { e.printStackTrace(); } } }

5. 池化配置调优

import org.apache.commons.pool2.impl.GenericObjectPoolConfig; public class PoolConfigOptimization { public static GenericObjectPoolConfig<?> createOptimizedConfig() { GenericObjectPoolConfig<?> config = new GenericObjectPoolConfig<>(); // 基本配置 config.setMaxTotal(50); // 最大对象数量 config.setMaxIdle(20); // 最大空闲对象 config.setMinIdle(5); // 最小空闲对象 // 行为配置 config.setBlockWhenExhausted(true); // 池耗尽时是否阻塞 config.setMaxWaitMillis(5000); // 最大等待时间 config.setTestOnBorrow(true); // 借用时测试有效性 config.setTestOnReturn(false); // 归还时测试有效性 config.setTestWhileIdle(true); // 空闲时测试有效性 // 维护配置 config.setTimeBetweenEvictionRunsMillis(30000); // 驱逐线程运行间隔 config.setMinEvictableIdleTimeMillis(60000); // 对象最小空闲时间 config.setSoftMinEvictableIdleTimeMillis(30000); // 软最小空闲时间 return config; } }

6. 注意事项

6.1 内存泄漏防范

public class PoolLeakPrevention { // 使用 try-with-resources 自动归还 public void safeUsePool(GenericObjectPool<Resource> pool) { try (PooledResourceWrapper wrapper = new PooledResourceWrapper(pool)) { Resource resource = wrapper.getResource(); // 使用资源 } // 自动归还 } // 包装类实现 AutoCloseable static class PooledResourceWrapper implements AutoCloseable { private final GenericObjectPool<Resource> pool; private final Resource resource; public PooledResourceWrapper(GenericObjectPool<Resource> pool) throws Exception { this.pool = pool; this.resource = pool.borrowObject(); } public Resource getResource() { return resource; } @Override public void close() { pool.returnObject(resource); } } }

6.2 监控和诊断

@Component public class PoolMonitor { private final HikariDataSource dataSource; public void printPoolStats() { HikariPoolMXBean poolMXBean = dataSource.getHikariPoolMXBean(); System.out.println("活跃连接数: " + poolMXBean.getActiveConnections()); System.out.println("空闲连接数: " + poolMXBean.getIdleConnections()); System.out.println("总连接数: " + poolMXBean.getTotalConnections()); System.out.println("等待线程数: " + poolMXBean.getThreadsAwaitingConnection()); } }

总结

池化技术是Java性能优化的重要手段,主要优点包括:

  • 提高性能:减少对象创建开销

  • 资源控制:防止资源耗尽

  • 响应更快:对象立即可用

  • 管理方便:集中管理对象生命周期

选择合适的池化技术和配置参数,可以显著提升应用性能和稳定性。

http://www.jsqmd.com/news/480813/

相关文章:

  • 辽源靠谱的可定制PE排水管正规厂家费用怎么算 - 工业品网
  • 选购法兰加热器,创仕源这个品牌的专业供应商好用吗 - 工业设备
  • 互联网大厂Java面试现场:严肃面试官与搞笑程序员谢飞机的爆笑对决
  • 讲讲常州塑料卡板工厂,口碑好的是哪家? - myqiye
  • 【开题答辩全过程】以 基于微信平台的电子阅读器为例,包含答辩的问题和答案
  • 如何选择?2026年主流PVC格栅管厂商横向对比,CPVC电力管/HDPE双壁波纹管,pvc格栅管供货厂家口碑排行 - 品牌推荐师
  • 面试官与水货程序员谢飞机的面试奇遇记
  • 【开题答辩全过程】以 基于Springboot的养老服务管理系统的设计与实现为例,包含答辩的问题和答案
  • 2026口碑街舞培训机构排行:实力与特色并存,少儿街舞培训/少儿街舞/成人街舞考级/少儿街舞考级,街舞培训机构哪家好 - 品牌推荐师
  • 【开题答辩全过程】以 山西能源学院电子报销为例,包含答辩的问题和答案
  • 最新真空泵配备专利吹扫注入系统
  • 【开题答辩全过程】以 基于微信小程序地方小吃分享平台设计与实现为例,包含答辩的问题和答案
  • 2026年矫直机推荐厂家排名前十有哪些 - mypinpai
  • 好物分享 | gstack:将 Claude Code 从通用助手升级为专属专家团队
  • 2026年盘点江苏好用的钢管加工设备生产厂,性价比高的有哪些? - 工业品牌热点
  • 智能科学毕业设计最全课题帮助
  • 【问题解决】org.springframework.web.util.NestedServletException Handler dispatch failed;
  • Python-flask向家租房 房屋租赁微信小程序t9353
  • 全面打开SEO之门,从零基础到有效提升网站流量的方法
  • 【开题答辩全过程】以 商城后台管理系统1为例,包含答辩的问题和答案
  • Python-flask基于安卓的的酒店管理系统 小程序
  • 昭通艺考培训机构靠谱吗,推荐几家口碑好的 - mypinpai
  • 【开题答辩全过程】以 人才培养方案修订管理系统为例,包含答辩的问题和答案
  • 【群晖NAS攻略】轻松搞定MySQL和phpMyAdmin远程访问无需公网IP
  • Terraform基础命令
  • 回收永辉购物卡,快速变现就这么简单! - 团团收购物卡回收
  • 【带权并查集+贪心+构造】codeforces 1244 G. Running in Pairs
  • phpstudy mysql数据库无法远程连接的解决方法
  • 细聊防爆控制箱实力厂商,南阳华通防爆在天津口碑咋样,选哪家好? - 工业品牌热点
  • PyTorch .pt 文件的内部结构