1.线程池:
线程池中的线程并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用
ThreadPoolExecutor(
int corePoolSize, 核心线程池大小
int maximumPoolSize, 线程池最大容量大小
long keepAliveTime, 线程池空闲时,线程存活的时间
TimeUnit unit, 时间单位 keepAliveTime存活时间的时间单位
BlockingQueue
ThreadFactory threadFactory, 线程工厂
RejectedExecutionHandler handler 线程拒绝策略
)
四种线程池Executors 四种线程池《四种线程池都在Executers中》
static ExecutorService newCachedThreadPool()
创建一个可缓存线程池 如果线程池长度超过处理需要,可灵活回收空闲线程
若无可回收 则新建线程
static ExecutorService newFixedThreadPool(int nThreads)
创建一个定长线程池,可以控制线程的最大并发数,超出的线程会在队列中等待
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个定长线程池 支持定时及周期性 延迟
static ExecutorService newSingleThreadExecutor()
创建一个单线程化的线程池 它只会用唯一的工作线程来执行任务
此线程保证所有的任务执行顺序按照任务的提交顺序执行
这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去
eg:public static void main(String[] args) {
//static ExecutorService newFixedThreadPool(int nThreads)
int ii = Runtime.getRuntime().availableProcessors();
System.out.println(ii);
ExecutorService fixed = Executors.newFixedThreadPool(3);
for(int i=0;i<10;i++) {
final int index = i;
fixed.execute(new Runnable() {
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"::"+index);
Thread.sleep(2000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
});
}
fixed.shutdown();
连接池:
什么是连接池?
数据库连接池负责分配/管理和释放数据库连接.它允许应用程序重复使用一个现有的数据库连接
而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
这项技术明显提高了对数据库的操作性能
常用的数据源配置
1.DBCP
DBCP: Apache推出的Database Connection Pool
使用步骤:
1.添加jar包 dbcp pool
2.添加属性资源文件 dbcpconfig.properties
javax.sql 接口 DataSource
#
initialSize=10
#最大连接数量
maxActive=50
#
maxIdle=20
#
minIdle=5
#
maxWait=60000
2.c3p0<通常我们使用这个>
C3P0是一个开源的JDBC连接池 实现了数据源和JNDI绑定
JNDI(java naming and directory interface)
是SUN公司提供的一种标准的java命名系统接口 是一组在java应用中访问命名和目录服务的API
JNDI 是一种资源管理方式
C3P0 是数据源连接池的配置方式
使用JNDI管理数据库连接池 连接池可以使用C3P0 也可以使用DBCP...
实现步骤:
1.导入c3p0 jar 包
2.编写配置文件 c3p0-config.xml 放在src根目录下
eg:public class C3P0Utils {
// 获取数据源 c3p0 自动获取配置文件信息
private static DataSource ds = new ComboPooledDataSource();
// 添加get方法
public static DataSource getDataSource() {
return ds;
}
// 获取连接
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException("服务器繁忙....");
}
}
// 释放资源
public static void release(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}