java编程连接池_JDBC编程一一连接池技术Druid、C3P0、DBCP

一、数据库连接池

普通的JDBC数据库连接(Connection对象)使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)----> 建立JDBC连接的开销(成本)是很多。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。   数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。   这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.   连接池最大的好处: 重复利用了每一个Connection对象,节省了性能开销。

解决方案:把每次操作完的Connection对象,不要直接关闭,而是存储到缓冲区中,以供多次重复使用,下次需要再获取连接池对象,不是从DBMS中获取,而是直接从缓冲区中获取,释放Connection对象,就是归还于缓冲区中。 --->数据库连接池

8a10ffa487ace88b60c7359ea6e0feb8.png

二、连接池概述

在Java中,连接池使用javax.sql.DataSource接口来表示连接池/数据源,注意:DataSource和JDBC一样仅仅只是一个接口,由各大服务器厂商来实现(Tomcat,JBoss等)。 常用的DataSource的实现:     C3P0:  Hibernate推荐的,但是该连接池在07年之后就不再更新了,不建议使用:性能太太差了。

DBCP:  Apache组织的项目,Spring推荐的.  真心不错。 Druid:  阿里巴巴的项目(德鲁伊),世界上最好连接池。 DataSource(数据源)和连接池(Connection Pool)是同一个。

使用连接池和不使用连接池的区别在哪里? 获取连接对象: 没有连接池: 通过DriverManager来获取,直接和DBMS连接. 存在连接池:  直接通过连接池来获取连接对象.               Connection conn = DataSource对象.getConnection();

释放连接对象: 没有连接池: conn.close():和数据库服务器(DBMS)断开连接。 存在连接池: conn.close():把Connection对象归还给连接池,并没有和DBMS断开。

三、DBCP连接池

环境准备:

commons-dbcp-1.4.jar

commons-pool-1.5.6.jar

代码演示:

package com.hyxy.util;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

public class DBCPUtils {

private static String driver;

private static String url;

private static String username;

private static String password;

//创建连接池对象

private static BasicDataSource bds = new BasicDataSource();

static {

try {

InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");//InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties");

Properties prop = new Properties();

prop.load(is);

driver = prop.getProperty("driver");

url = prop.getProperty("url");

username = prop.getProperty("username");

password = prop.getProperty("password");

//设置连接池参数

bds.setDriverClassName(driver);

bds.setUrl(url);

bds.setUsername(username);

bds.setPassword(password);//初始化连接池数bds.setInitialSize(5);//最大活跃数bds.setMaxActive(8);//最大空闲数bds.setMaxIdle(4);//最小空闲数

bds.setMinIdle(4);//最大等待毫秒数bds.setMaxWait(30);

System.out.println(bds);

} catch (Exception e) {

e.printStackTrace();

}

}

public static Connection getConn(){

Connection conn = null;

try {

conn = bds.getConnection();

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

public static void closeConn(Connection conn){

if(conn!=null){

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

public static void closeAll(Connection conn,Statement stat,ResultSet rs){

try {

if(conn!=null){

conn.close();

}

if(stat!=null){

stat.close();

}

if(rs!=null){

rs.close();

}

} catch (Exception e) {

e.printStackTrace();

}}

public static void main(String[] args) {

System.out.println(DBCPUtils.getConn());

}}

代码演示:

package com.hyxy.util;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import org.apache.commons.dbcp.DataSourceConnectionFactory;

public class DBCPUtils2 {//创建连接池对象

private static DataSource bds;

static {

try {

InputStream is = DBCPUtils2.class.getClassLoader().getResourceAsStream("dbcp.properties");

//InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties");

Properties prop = new Properties();

prop.load(is);

bds = BasicDataSourceFactory.createDataSource(prop);

System.out.println(bds);

} catch (Exception e) {

e.printStackTrace();

}

}

public static Connection getConn(){

Connection conn = null;

try {

conn = bds.getConnection();

} catch (Exception e) {

e.printStackTrace();}

return conn;}

public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){

try {

if(conn!=null){

conn.close();}

if(ps!=null){

ps.close();}

if(rs!=null){

rs.close();}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {System.out.println(DBCPUtils2.getConn());

}}

四、Druid连接池

Druid连接池(德鲁伊),阿里巴巴的连接池,号称世界上最好的连接池,Java语言领域性能最好的数据库连接池,类似于DBCP连接池。

环境准备:druid-1.0.15.jar

Druid和DBCP的连接属性是完全相同的,创建连接池的对象不同。

889dcaeb50e7d09b976658812af2f9e6.png

代码演示:

package com.hyxy.util;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DruidUtils {//创建连接池对象

private static DataSource bds;

static {

try {

InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");

Properties prop = new Properties();

prop.load(is);

//bds = BasicDataSourceFactory.createDataSource(prop);

bds = DruidDataSourceFactory.createDataSource(prop);

System.out.println(bds);

} catch (Exception e) {

e.printStackTrace();

}

}

public static Connection getConn(){

Connection conn = null;

try {

conn = bds.getConnection();

} catch (Exception e) {

e.printStackTrace();

}

return conn;}

public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){

try {

if(conn!=null){

conn.close();

}

if(ps!=null){

ps.close();

}

if(rs!=null){

rs.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

System.out.println(DruidUtils.getConn());

}

}

代码结果:

a722249546fca51b56abbe0d4ed296c0.png

Druid参数列表

d5adc341ef5b3876829e92f3318cba2d.png

41ee23a4067bd0de63a92a73e7dc06d6.png

看到这里别忘记点个小小的赞喔~ 更多往期文章我已整合成PDF放在了我的社区,也整理了一些Java学习的zl,需要的小伙伴点击传送门

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值