数据库连接池及JDBC框架

数据库连接池
设计概念: 共享型数据库连接库,管理员在库里放置了5~10个数据库连接的接口,用的时候给你一个,
用完再收回去,可以重复使用,而非使用一个损耗一个,有效提升了对数据库操作的性能。
减少内存碎片以及数据库临时进程的数量。(数据库连接池为数据库连接做好了初始化工作,
减少了应用连接数据库所需花费的初始化时间。可以为应用带来更快的响应速度。)
Datasource:
在Java包下的一个接口,javax.sql.Datasource。
实现了这个接口就可以借用里面的核心功能Connection 的getConnection方法进而获取数据库的连接对象,
从而去完成数据库连接池的技术。
自定义数据库连接池:
//1.定义一个类,实现Datasource接口。
public class MyDataSource implements DataSource {
//2.定义一个容器,保存多个connection连接对象。
private static List pool = Collections.synchronizedList(new ArrayList<>());
//3.定义静态代码块,通过 JDBC 工具类获取 10 个连接保存到容器中。
static {
for (int i = 1; i <=10 ; i++) {
Connection con = JDBCUtils.getConnection();
pool.add(con);
}
}

    //4.重写 getConnection 方法,从容器中获取一个连接并返回。
		@Override
		public Connection getConnection() throws SQLException {
			if(pool.size()>0){
				Connection con = pool.remove(0);
				return con;
		}
		else {
			throw new RuntimeException("连接已用尽");
		}
	}

		//5.定义 getSize 方法,用于获取容器的大小并返回。
		public int getSize(){
			return pool.size();
		}
		
		public class MyDataSourceTest {
			public static void main(String[] args) throws Exception {
			//1.创建连接池对象
			MyDataSource myDataSource = new MyDataSource();
			//2.通过连接池对象获取连接对象
			Connection connection = myDataSource.getConnection();
			//3.查询学生表的全部信息
			String sql = "SELECT * FROM student";
			PreparedStatement preparedStatement = connection.prepareStatement(sql);
			//4.执行sql语句获取结果集
			ResultSet resultSet = preparedStatement.executeQuery();
			//5.处理结果集
			while (resultSet.next()){
				System.out.println(resultSet.getInt("sid")+"/t"+resultSet.getString("sname")+"/t"+resultSet.getString("sex")+"/t"+resultSet.getDate("birthday"));
			}
			//6.释放资源
			resultSet.close();
			preparedStatement.close();
			connection.close();
		}
	}

归还连接
1.继承方式归还:归还不了
① 定义一个类,继承 JDBC4Connection 。
② 定义 Connection 连接对象和连接池容器对象的成员变量。
③ 通过有参构造方法完成对成员变量的赋值。
④ 重写 close 方法,将连接对象添加到池中。
3. 继承方式归还数据库连接存在的问题。
 通过查看 JDBC 工具类获取连接的方法发现:我们虽然自定义了一个子类,完成了归还连接的操作。但是
DriverManager 获取的还是 JDBC4Connection 这个对象,并不是我们的子类对象,而我们又不能整体
去修改驱动包中类的功能,所继承这种方式行不通!
2.归还连接-装饰设计模式
需要重写大量的方法,不是最优解。
3.归还连接-适配器设计模式
自定义连接类虽然很简洁了,但适配器类还是我们自己编写的,也比较的麻烦
4.动态代理
我们自己写的连接池技术不够完善,功能也不够强大。
开源数据库连接池
1. C3P0 数据库连接池的使用步骤。
① 导入 jar 包。
② 导入配置文件到 src 目录下。
③ 创建 C3P0 连接池对象。
④ 获取数据库连接进行使用。
2. Druid 数据库连接池的使用步骤。
① 导入 jar 包。
② 编写配置文件,放在 src 目录下。
③ 通过 Properties 集合加载配置文件。
④ 通过 Druid 连接池工厂类获取数据库连接池对象。
⑤ 获取数据库连接进行使用。
public class DruidTest1 {
public static void main(String[] args) throws Exception{
//获取配置文件的流对象
InputStream is = DruidTest1.class.getClassLoader().getResourceAsStream(“druid.properties”);

				//1.通过Properties集合,加载配置文件
				Properties prop = new Properties();
				prop.load(is);

				//2.通过Druid连接池工厂类获取数据库连接池对象
				DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

				//3.通过连接池对象获取数据库连接进行使用
				Connection con = dataSource.getConnection();


				String sql = "SELECT * FROM student";
				PreparedStatement pst = con.prepareStatement(sql);

				//4.执行sql语句,接收结果集
				ResultSet rs = pst.executeQuery();

				//5.处理结果集
				while(rs.next()) {
					System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));
				}

				//6.释放资源
				rs.close();
				pst.close();
				con.close();
			}
		}

自定义JDBC框架
在我们操作数据库的时候,会有大量的重复代码,我们将这些重复的代码封装到一起,为他们
各自编写相应的功能,可以让我们在操作数据库的时候直接调用方法,写入相应的sql语句,
加入对应的参数即可完成对数据库的操作。
DataBaseMetaData(数据库元数据)
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值