失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > JDBC核心技术六(数据库连接池)

JDBC核心技术六(数据库连接池)

时间:2023-01-12 15:25:27

相关推荐

JDBC核心技术六(数据库连接池)

系列笔记目录

JDBC核心技术一(概述)JDBC核心技术二(获取数据库连接)JDBC核心技术三(PreparedStatement)JDBC核心技术四(Blob字段和批量插入)JDBC核心技术五 (数据库事务)JDBC核心技术六(数据库连接池)JDBC核心技术七(CallableStatement)

数据库连接池的使用可以有效的管理和分配资源,实现资源的最大利用化,提高数据库操作的执行效率;

1. 什么是数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;

2. JDBC数据库连接池的必要性

在开发基于数据库的web应用时,传统的模式基本是按一下步骤:在主程序(如servlet、beans)中建立数据库连接;进行SQL操作断开数据库连接DriverManager管理的缺点: 每次数据库的连接都需要将Connection加载到内存中,再验证账户名和密码,需要时申请一个,执行完成后断开连接。若用大量的用户在线,会不断新建连接断开连接,消耗大量的资源,数据库的连接资源并没有得到和好的重复利用;对于每一次数据库连接,使用完后都得断开。(若出现异常导致连接未关闭,会导致数据库系统中的内存泄露);不能控制数据库连接的数量,或导致内存泄露、服务器崩溃。

3. 数据库连接池技术

数据库连接池的基本思想:就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

连接池有最少数据库连接数和最大数据库连接数量,操作最大,这些请求将被加入等待序列;

数据库连接的工作原理如下所示:

数据库连接池的优点: 资源重用更快的系统反应速度新的资源分配手段统一的连接管理,避免数据库连接泄漏

4. 多种开源的数据库连接池

JDBC数据库连接池使用javax.sql.DataSource来表示,DataSource是一个接口,通常由服务器(Weblogic、WebSphere、Tomcat)提供实现,也有开源组织的实现:DBCP:Apache提供的数据库连接池,Tomcat自带,速度相比c3p0快;C3P0:速度相对慢,稳定性还可以;Proxool: 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点BoneCP:是一个开源组织提供的数据库连接池,速度快;Druid是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不确定是否有BoneCP快;DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度注意事项: 整个应用只需一个数据源即可,无需创建多个数据库连接池,程序执行完毕后,可以调用conn.close()关闭数据库连接(只是逻辑上的将连接交还给连接池,并未物理上断开连接);

5. 多种数据库连接的实例

5.1 C3P0数据库连接词

获取连接方法一:

//使用C3P0数据库连接池的方式,获取数据库的连接:不推荐public static Connection getConnection1() throws Exception{ComboPooledDataSource cpds = new ComboPooledDataSource();cpds.setDriverClass("com.mysql.jdbc.Driver"); cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai");cpds.setUser("root");cpds.setPassword("root");//cpds.setMaxPoolSize(100);Connection conn = cpds.getConnection();return conn;}

获取连接方法二:

//使用C3P0数据库连接池的配置文件方式,获取数据库的连接:推荐private static DataSource cpds = new ComboPooledDataSource("helloc3p0");public static Connection getConnection2() throws SQLException{Connection conn = cpds.getConnection();return conn;}

其中,src下的配置文件为:【c3p0-config.xml】

<?xml version="1.0" encoding="UTF-8"?><c3p0-config><named-config name="hellc3p0"><!-- 提供获取连接的4个基本信息 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai</property><property name="user">root</property><property name="password">root</property><!-- 进行数据库连接池管理的基本信息 --><!-- 当数据库连接池中的连接数不够时,c3p0一次性向数据库服务器申请的连接数 --><property name="acquireIncrement">5</property><!-- c3p0数据库连接池中初始化时的连接数 --><property name="initialPoolSize">10</property><!-- c3p0数据库连接池维护的最少连接数 --><property name="minPoolSize">10</property><!-- c3p0数据库连接池维护的最多的连接数 --><property name="maxPoolSize">100</property><!-- c3p0数据库连接池最多维护的Statement的个数 --><property name="maxStatements">50</property><!-- 每个连接中可以最多使用的Statement的个数 --><property name="maxStatementsPerConnection">2</property></named-config></c3p0-config>

5.2 DBCP数据库连接池

DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool。如需使用该连接池实现,应在系统中增加如下两个 jar 文件: Commons-dbcp.jar:连接池的实现Commons-pool.jar:连接池实现的依赖库 配置属性说明:获取连接方式一:

public void testGetConnection() throws SQLException {//创建了DBCP的数据库连接池BasicDataSource source = new BasicDataSource();//设置基本信息source.setDriverClassName("com.mysql.jdbc.Driver");source.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai");source.setUsername("root");source.setPassword("root");//还可以设置其他涉及数据库连接池管理的相关属性:source.setInitialSize(10);source.setMaxActive(10);Connection conn = source.getConnection();System.out.println("conn = " + conn);}

获取连接方式二:

//方式二:推荐:使用配置文件public void testGetConnection1() throws Exception{Properties pros = new Properties();//方式1://InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");//方式2:FileInputStream is = new FileInputStream(new File("src/dbcp.properties"));pros.load(is);DataSource source = BasicDataSourceFactory.createDataSource(pros);Connection conn = source.getConnection();System.out.println(conn);}

其中,src下的配置文件为:【dbcp.properties】

user=rootpassword=rooturl=jdbc:mysql://root@localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/ShanghaidriverClass=com.mysql.cj.jdbc.Driver

5.3 Druid数据库连接池

Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、Proxool等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前最好的连接池之一。

public void getConnection() throws Exception{Properties pros = new Properties();InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");pros.load(is);DataSource source = DruidDataSourceFactory.createDataSource(pros);Connection conn = source.getConnection();System.out.println(conn);}

其中,src下的配置文件为:【druid.properties】

url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaiusername=rootpassword=rootdriverClassName=com.mysql.cj.jdbc.DriverinitialSize=10maxActive=10

详细配置参数:

如果觉得《JDBC核心技术六(数据库连接池)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。