java---连接池的学习

/** ####################################数据库的连接池学习#################################    * * * #####数据库连接池
>1. 数据库的连接对象创建工作,比较消耗性能。 >2.一开始现在内存中开辟一块空间(集合) , 一开先往池子里面放置 多个连接对象。  
后面需要连接的话,直接从池子里面去。不要去自己创建连接了。  
使用完毕, 要记得归还连接。确保连接对象能循环利用。
![icon](img/img11.png)###自定义数据库连接池 * 代码实现* 出现的问题:1. 需要额外记住 addBack方法2. 单例。3. 无法面向接口编程。 UserDao dao = new UserDaoImpl();dao.insert();DataSource dataSource = new MyDataSource();因为接口里面没有定义addBack方法。 4. 怎么解决?   以addBack 为切入点。###解决自定义数据库连接池出现的问题。 > 由于多了一个addBack 方法,所以使用这个连接池的地方,需要额外记住这个方法,并且还不能面向接口编程。> 我们打算修改接口中的那个close方法。  原来的Connection对象的close方法,是真的关闭连接。 
> 打算修改这个close方法,以后在调用close, 并不是真的关闭,而是归还连接对象。* * * ####开源连接池#### DBCP
1. 导入jar文件
2. 不使用配置文件* public void testDBCP01(){Connection conn = null;PreparedStatement ps = null;try {//1. 构建数据源对象BasicDataSource dataSource = new BasicDataSource();//连的是什么类型的数据库, 访问的是哪个数据库 , 用户名, 密码。。//jdbc:mysql://localhost/bank 主协议:子协议 ://本地/数据库dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost/bank");dataSource.setUsername("root");dataSource.setPassword("root");//2. 得到连接对象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "admin");ps.setInt(2, 1000);ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}}* * * ####使用配置文件方式:Connection conn = null;PreparedStatement ps = null;try {BasicDataSourceFactory factory = new BasicDataSourceFactory();Properties properties = new Properties();InputStream is = new FileInputStream("src//dbcpconfig.properties");properties.load(is);DataSource dataSource = factory.createDataSource(properties);//2. 得到连接对象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "liangchaowei");ps.setInt(2, 100);ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}* *###################配置文件模板##################################################*#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bank
username=root
password=root#<!-- 初始化连接 -->
initialSize=10#最大连接数量
maxActive=50#<!-- 最大空闲连接 -->
maxIdle=20#<!-- 最小空闲连接 -->
minIdle=5#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED########################################################################################* * ####################C3P0知识点##################################################################C3P0
> 拷贝jar文件 到 lib目录###不使用配置文件方式Connection conn = null;PreparedStatement ps = null;try {//1. 创建datasourceComboPooledDataSource dataSource = new ComboPooledDataSource();//2. 设置连接数据的信息dataSource.setDriverClass("com.mysql.jdbc.Driver");//忘记了---> 去以前的代码 ---> jdbc的文档dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");dataSource.setUser("root");dataSource.setPassword("root");//2. 得到连接对象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "admi234n");ps.setInt(2, 103200);ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}######使用配置文件方式#####c3p0-config配置文件,xml文件。名字不可以改变<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><!-- default-config 默认的配置,  --><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost/bank</property><property name="user">root</property><property name="password">root</property><property name="initialPoolSize">10</property><property name="maxIdleTime">30</property><property name="maxPoolSize">100</property><property name="minPoolSize">10</property><property name="maxStatements">200</property></default-config><!-- This app is massive! --><named-config name="oracle"> <property name="acquireIncrement">50</property><property name="initialPoolSize">100</property><property name="minPoolSize">50</property><property name="maxPoolSize">1000</property><!-- intergalactoApp adopts a different approach to configuring statement caching --><property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property><!-- he's important, but there's only one of him --><user-overrides user="master-of-the-universe"> <property name="acquireIncrement">1</property><property name="initialPoolSize">1</property><property name="minPoolSize">1</property><property name="maxPoolSize">5</property><property name="maxStatementsPerConnection">50</property></user-overrides></named-config></c3p0-config>#####代码部分//默认会找 xml 中的 default-config 分支。 
public class C3P0Demo02 {@Testpublic void testC3P0(){Connection conn = null;PreparedStatement ps = null;try {//就new了一个对象。在这种情况下c3p0会直接找到c3p0-config.xml文件//并且在c3p0-config.xml文件中默认的找到 default-config配置ComboPooledDataSource dataSource = new ComboPooledDataSource();//ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");//找到c3p0-config.xml文件中默认的找到named-config name="oracle"的配置//2. 得到连接对象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "wangwu2");ps.setInt(2, 2600);ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}}
}###########################################################################################* ###########DBUtils###增删改
//dbutils 只是帮我们简化了CRUD 的代码, 但是连接的创建以及获取工作。 不在他的考虑范围QueryRunner主要是这个类QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());//增加
//queryRunner.update("insert into account values (null , ? , ? )", "aa" ,1000);//删除
//queryRunner.update("delete from account where id = ?", 5);//更新
//queryRunner.update("update account set money = ? where id = ?", 10000000 , 6);* * * * * * ######查询
1. 直接new接口的匿名实现类QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());Account  account =  queryRunner.query("select * from account where id = ?", new ResultSetHandler<Account>(){@Overridepublic Account handle(ResultSet rs) throws SQLException {Account account  =  new Account();while(rs.next()){String name = rs.getString("name");int money = rs.getInt("money");account.setName(name);account.setMoney(money);}return account;}}, 6);System.out.println(account.toString());2. 直接使用框架已经写好的实现类。
* 查询单个对象QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());//查询单个对象Account account = queryRunner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), 8);* 查询多个对象QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());List<Account> list = queryRunner.query("select * from account ",new BeanListHandler<Account>(Account.class));######ResultSetHandler 常用的实现类(重点)
以下两个是使用频率最高的BeanHandler,  查询到的单个数据封装成一个对象BeanListHandler, 查询到的多个数据封装 成一个List<对象>------------------------------------------ArrayHandler,  查询到的单个数据封装成一个数组ArrayListHandler,  查询到的多个数据封装成一个集合 ,集合里面的元素是数组。 MapHandler,  查询到的单个数据封装成一个mapMapListHandler,查询到的多个数据封装成一个集合 ,集合里面的元素是map。 ColumnListHandler
KeyedHandler
ScalarHandler##数据连接池* DBCP不使用配置使用配置* C3P0不使用配置使用配置 (必须掌握)* 自定义连接池 装饰者模式##DBUtils> 简化了我们的CRUD , 里面定义了通用的CRUD方法。 queryRunner.update();queryRunner.query* * * * * */

 

转载于:https://www.cnblogs.com/byczyz/p/11343575.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里P8亲自讲解!成功入职头条月薪35K

前言 又到一年金九银十之际。 Java作为目前用户最多&#xff0c;使用范围最广的软件开发技术之一。 Java的技术体系主要由支撑Java程序运行的虚拟机&#xff0c;提供各开发领域接口支持的Java,Java编程语言及许多第三方Jvav框架构成。 其中&#xff0c;以Java的虚拟器为今天的着…

java----连接池C3p0使用的补充

C3p0数据库的连接方式是目前市场场最为广泛的类型之一 本篇主要你演示C3p0使用文件配置和不使用文件配置的两种操作方式 #######使用文件配置 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;import com.dbutil.zyz.ConnLink; …

阿里P8大佬亲自教你!java程序设计第四版pdf

前言 最近有很多朋友去目前主流的大型互联网公司面试&#xff08;阿里巴巴、京东、字节跳动、蚂蚁金服、滴滴&#xff09;&#xff0c;面试回来之后会发给我一些面试题。有些朋友轻松过关&#xff0c;拿到offer&#xff0c;但是有一些是来询问我答案的。 我特意整理了一下&am…

阿里P8大佬亲自讲解!朝阳java培训

开头 Spring框架自诞生以来一直备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新&#xff0c;很多研发人员把spring看作心目中最好的Java项目&#xff0c;没有之一。 **可以毫…

分隔符的作用和用法

一、插入分页符 当文本或图形等内容填满一页时&#xff0c;Word会插入一个自动分页符并开始新的一页。如果要在某个特定位置强制分页&#xff0c;可插入“手动”分页符&#xff0c;这样可以确保章节标题总在新的一页开始。首先&#xff0c;将插入点置于要插入分页符的位置&…

java----DBUtils知识点补充

dbutils 只是帮我们简化了CRUD 的代码&#xff0c; 但是连接的创建以及获取工作。 不在他的考虑范围 QueryRunner主要是这个类 import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import com.mchange.v2.c3p0.ComboPooledDataSource;public class D…

大厂offer手到擒来,Java面试真题精选

前言 事务我们都知道是什么&#xff0c;而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发&#xff0c;解耦业务逻辑和系统逻辑。但是Spring事务原理是怎样&#xff1f;事务在方法间是如何传播的&#xff1f;为什么有时候事务会失效&#xff1f…

大厂也在用的6种数据脱敏方案,醍醐灌顶!

前言 由于作者面试过程中高度紧张&#xff0c;本文中只列出了自己还记得的部分题目。 经历了漫长一个月的等待&#xff0c;终于在前几天通过面试官获悉已被蚂蚁金服录取&#xff0c;这期间的焦虑、痛苦自不必说&#xff0c;知道被录取的那一刻&#xff0c;一整年的阴霾都一扫…

大牛带你直击优秀开源框架灵魂,给大家安排上!

前言 微架构的出现&#xff0c;很好地适应了这个时代对快速发展变化的要求。它不再提倡一体化的项目设计&#xff0c;而是对项目进行有效的“业务区”(可以简单理解为不同的子系统〉划分&#xff0c;并利用合理的技术对业务性能做出提升和改善&#xff0c;同时又极大地简化了配…

大牛用SSM框架实现了支付宝的支付功能,满满干货指导

前言 现在刷抖音经常可以看到一些老外街坊&#xff0c;问他们最想把什么带回自己的国家&#xff0c;我听过很多的回答都是&#xff1a;淘宝&#xff0c;支付宝&#xff0c;美食&#xff0c;微信&#xff0c;外卖&#xff0c;高铁等等。 确实如此&#xff0c;随着国家的快速发…

java---Listener Filter知识点学习

##Listener > 监听器 * 能做什么事&#xff1f; > 监听某一个事件的发生。 状态的改变。 * 监听器的内部机制 > 其实就是接口回调. ####接口回调 * 需求&#xff1a; > A在执行循环&#xff0c;当循环到5的时候&#xff0c; 通知B。 > 事先先把一个对象传递给 …

头条三面技术四面HR,就是这么简单

前言 看日期&#xff0c;今天都是4月了&#xff0c;这春招也差不多进入尾声了。 近期任有不少朋友都在找工作&#xff0c;很多人开始抱怨&#xff0c;工作可真难找啊&#xff01;身边不少朋友问我咋搞呀&#xff0c;秋招都要结束了&#xff0c;工作还没着落呢…额…这个…今年…

临时表

tmp_table_size 这个配置限制了内存临时表的大小&#xff0c;默认值是 16M。 如果临时表大小超过了 tmp_table_size&#xff0c;那么内存临时表就会转成磁盘临时表 磁盘临时表使用的引擎默认是 InnoDB&#xff0c;是由参数 internal_tmp_disk_storage_engine 控制的。 转载于:h…

如何保证Redis与数据库的双写一致性?进阶加薪全靠它!

我有话要说&#xff0c;请仔细看完 我发现一个现象&#xff0c;很多开发5年的程序员仍然停留在crud的阶段&#xff0c;这是什么原因&#xff1f; 最主要的原因就是基础很差&#xff0c;尤其对于JVM和并发编程这方面掌握的比较差&#xff0c;而JVM和并发编程就是非常非常重要的…

Swimming Balls

Swimming Balls https://vjudge.net/contest/318752#problem/J如果直接算&#xff0c;各种球的情况都不清楚&#xff0c;因为放一个球之后&#xff0c;水位的变化也会影响之前放入的球&#xff0c;不如&#xff0c;二分最终的水位高度&#xff0c;这样每个球的贡献就有了 #incl…

如何保证redis高可用?薪资翻倍

前言&#xff1a; 首先介绍一下我的同学&#xff0c;专科毕业应用电子技术专业&#xff0c;已经毕业快两年了。因为专业的原因工作一年觉得没什么发展前途就想转行&#xff0c;身为他的“好基友”&#xff0c;他觉得我这个工作挺好的&#xff0c;就咨询了我一下&#xff0c;经…

Linux中强大的输入输出重定向和管道

Linux中有三个最重要的输入输出流: Standard Input(STDIN) - 通常指键盘的输入 Standard Output(STDOUT) - 通常指显示器的输出 Standard Error(STDERR) - 通常也是重定向到显示器 默认情况下&#xff0c;分别是0表示标准输入(stdin),1表示标准输出(stdout),2表示标准错误。 参…

如何保证消息队列的高可用?透彻分析源码

前言 成为优秀的架构师是大部分初中级工程师的阶段性目标。优秀的架构师往往具备七种核心能力&#xff1a;编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和规划能力。 这几种能力之间的关系大概如下图。编程能力、调试能力和编…

rails 放在 apache一个目录下面的配置方法

<Location /redmine> ProxyPass http://localhost:3000 ProxyPassReverse http://localhost:3000/</Location>然后&#xff0c;配置additional_environment.rb文件中config.action_controller.relative_url_root /redmine这样基本就可以了&#xff0c;但是&…

如何化身BAT面试收割机?不吃透都对不起自己

前言 多线程相对于其他 Java 知识点来讲&#xff0c;有一定的学习门槛&#xff0c;并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低&#xff08;还不如单线程去运行&#xff09;或者死锁程序挂掉等等问题&#xff0c;所以掌握了解多线程至关重要。…