JDBC入门技术:如何使用连接池技术连接数据库

工具:Myeclipse(eclipse)
知识点:线程(Thread)/连接池概念/IO流操作(Properties)
jar包
commons-collections4-4.0.jar
commons-dbcp-1.4.jar
commons-pool-1.6.jar
Oracle 11g 11.2.0.1.0 JDBC_ojdbc6.jar

步骤:
1
创建:
数据库连接池对象BasciDataSource(不初始化)
线程对象ThreaLocal对象(不初始化)
配置文件对象Properties对象<>
配置文件路径对象InputStream对象<>

2.
获取
初始化数据库连接池对象
使用连接池对象获取配置文件中的信息
(如果要将字符串转换为int类型.使用包装对象)

3.初始化
初始化线程对象

4.创建连接方法
覆盖Connection中的getConnection()函数
注意:使用数据库连接池对象获取,
使用线程对象进行保存连接对象

覆盖close()函数:
注意:
使用线程获取的对象将对象来释放资源.
这里将资源释放并不是将Connection对象连接关闭,
而是将连接归还给连接池,给接下来的线程使用

比如:此时使用某一种东西.用完之后就会放回原处,给下一个人使用,
这两可以重复使用减少数据库的开销

为何要使用数据库连接池?
数据库连接的建立及关闭资源消耗巨大
传统数据访问方式:一次数据库访问对应一个物理连接.
每次操作数据库都要打开,
关闭物理连接,系统性能严重受损

解决方案:
系统初始运行时,主动建立足够的连接,组成一个池.
每次应用程序请求数据连接时无需重新打开连接,
而是从池中取出连接,使用完后,不在关闭而是归还..

连接池中的使用规则:
应用启动时.创建初始化数目的连接..
当申请时无连接可用或者达到指定的最小连接数,
按增量参数值创建新的连接

为确保连接池中最小连接数的策略
动态检查:定时检查连接池,一旦发现数量小于最小连接数.
则补充相应的新连接,保证连接池正常运转
静态检查
空闲连接不足时,系统才检测是否达到最小连接数
按需分配,用过归还,超时归还


相当于:
客户端和数据库中间有一个连接池(抽象概念)

相当于生活中接口转换器一样

package com.csdn.jdbcdemo.date2017_11_12;


//如何使用连接池技术连接数据库
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;


import org.apache.commons.dbcp.BasicDataSource;


public class BasicDataSourceDemo {
	//创建连接池对象
	private static BasicDataSource bs;
	
	//创建多线程对象
	private static ThreadLocal<Connection> td ;
	
	static{
		try{
		//配置对象
		Properties properties = new Properties();
		
		//配置文件路径
		InputStream is 
			= BasicDataSourceDemo.
				class.getClassLoader().
					getResourceAsStream(
						"com/csdn/jdbcdemo/date2017_11_13/propertis.txt");
		
		//初始化连接池
		properties.load(is);
		is.close();
		
		bs = new BasicDataSource();
		
		//驱动器
		//Class.forName("oracle.jdbc.driver.OracleDriver")
		bs.setDriverClassName(
				properties.getProperty("driver"));
		
		//数据库路径
		bs.setUrl(properties.
				getProperty("url"));
		
		//数据库用户名
		bs.setUsername(
			properties.getProperty("username"));
		
		//数据库的密码
		bs.setPassword(properties.getProperty("password"));
		
		//线程初始化数量
		bs.setInitialSize(
			Integer.parseInt(
				properties.getProperty("initsize")));
		
		//线程最大数量
		bs.setMaxActive(
			Integer.parseInt(
				properties.getProperty("maxactive")));
		
		//最大等待时间
		bs.setMaxWait(
			Integer.parseInt(
				properties.getProperty("maxwait")));
		
		//最小空闲时间
		bs.setMinIdle(
				Integer.parseInt(
						properties.getProperty("minidle")));
		//最大空闲时间
		bs.setMaxIdle(
			Integer.parseInt(
				properties.getProperty("maxidle")));
		
		//初始化线程
		td = new ThreadLocal<Connection>();
		}catch(Exception e){
			e.printStackTrace();
			
		}
		}
		
	//获取连接
	public static Connection getConnection() throws SQLException{
		Connection connection = bs.getConnection();
		td.set(connection);
		return connection;
	}
	
	//断掉连接
	public static void closeConnection(){
		try{
		//
		Connection connection = td.get();
		if(connection != null){
			connection.close();
		}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}




下面是实现代码:事先数据库连接池技术:

package com.csdn.jdbcdemo.date2017_11_12;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class BasicDataSourceDemo2 {
	public static void main(String[] args) {
		
		try{
			//连接
			Connection connection = BasicDataSourceDemo.getConnection();
			
			//创建DB对象
			Statement state = connection.createStatement();
			
			//SQL语句
			String sql = "SELECT * FROM USER_INFO";
			
			//处理结果集
			ResultSet rs = state.executeQuery(sql);
			
			//遍历结果
			while(rs.next()){
				System.out.println(
					rs.getString("ENAME")+"   "
					+rs.getInt("ID")+"   "
					+rs.getInt("SAL")+"   "
					+rs.getString("EMAIL")
					);
			}
			state.close();
			rs.close();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			BasicDataSourceDemo.closeConnection();
		}
	}
}


配置文件信息


#这个是驱动名
driver=oracle.jdbc.driver.OracleDriver
#这个是数据库路径
url=jdbc:oracle:thin:@<域名>:1521:<SID>
#这个是数据库用户名
username=xxxxxx
#这个是数据库密码
password=xxxxx
#线程初始化数量
initsize=1
#线程最大活动数量
maxactive=1
#线程等待时间
maxwait=5000
#线程空闲最小数量
minidle=1
#线程最大数量
maxidle=1




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值