连接池

Golang连接池的几种实现案例

不打扰是莪最后的温柔 提交于 2020-03-01 07:42:32
因为TCP的三只握手等等原因,建立一个连接是一件成本比较高的行为。所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用。 而维持一个连接池,最基本的要求就是要做到:thread safe(线程安全),尤其是在Golang这种特性是goroutine的语言中。 实现简单的连接池 type Pool struct { m sync.Mutex // 保证多个goroutine访问时候,closed的线程安全 res chan io.Closer //连接存储的chan factory func() (io.Closer,error) //新建连接的工厂方法 closed bool //连接池关闭标志 } 这个简单的连接池,我们利用chan来存储池里的连接。而新建结构体的方法也比较简单: func New(fn func() (io.Closer, error), size uint) (*Pool, error) { if size <= 0 { return nil, errors.New("size的值太小了。") } return &Pool{ factory: fn, res: make(chan io.Closer, size), }, nil } 只需要提供对应的工厂函数和连接池的大小就可以了。 获取连接

事务与连接池

泪湿孤枕 提交于 2020-03-01 06:04:45
事务的概念:   事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 数据库开启事务的命令为:   start transaction 开启事务。   rollback 回滚事务。   commit 提交事务。 数据库中默认的事务开启状态:   MySQL中事务默认自动提交的,每当执行一条SQL,就会提交一个事务 (一条SQL 就是一个事务);Oracle 中事务默认不自动提交,需要在执行SQL 语句后 通过commint 手动提交事务。 数据库中存在一个设置自动提交的变量 ,通过 show variables like '%commit%';   得到结果:autocommint = on,说明自动提交被开启。   关闭自动提交: set autocommit = off 或 set autocommit = 0   如果设置autocommit = off,则之后每条SQL 都会处于一个事务中,相当于每条SQL执行前 都执行 start transaction,必须执行commit才会对数据库执行修改。( Oracle中 autocommit 默认值为 off。) 在jdbc中使用事务:   Connection.setAutoCommit(false);   Connection.rollback();   Connection.commit();

Spring Boot 2.x基础教程:使用国产数据库连接池Druid

一笑奈何 提交于 2020-02-28 07:11:01
上一节 ,我们介绍了Spring Boot在JDBC模块中自动化配置使用的默认数据源HikariCP。接下来这一节,我们将介绍另外一个被广泛应用的开源数据源:Druid。 Druid 是由阿里巴巴数据库事业部出品的开源项目。它除了是一个高性能数据库连接池之外,更是一个自带监控的数据库连接池。虽然HikariCP已经很优秀,但是对于国内用户来说,可能对于Druid更为熟悉。所以,对于如何在Spring Boot中使用Druid是后端开发人员必须要掌握的基本技能。 配置Druid数据源 这一节的实践我们将基于 《Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库》 一文的代码基础上进行。所以,读者可以从文末的代码仓库中,检出 chapter3-1 目录来进行下面的实践学习。 下面我们就来开始对Spring Boot项目配置Druid数据源: 第一步 :在 pom.xml 中引入druid官方提供的Spring Boot Starter封装。 <dependency> <groupid>com.alibaba</groupid> <artifactid>druid-spring-boot-starter</artifactid> <version>1.1.21</version> </dependency> 第二步 :在 application

hikari连接池的配置

旧时模样 提交于 2020-02-28 05:38:03
hikari号称史上最快连接池,替换C3P0 springboot2.0依赖自带无需添加任何依赖 # hikari连接池的配置 #数据源类型 spring.datasource.type=com.zaxxer.hikari.HikariDataSource # 最小空闲连接数量 spring.datasource.hikari.minimum-idle=5 # 连接池最大连接数,默认是10 spring.datasource.hikari.maximum-pool-size=15 # 此属性控制从池返回的连接的默认自动提交行为,默认值:true spring.datasource.hikari.auto-commit=true # 空闲连接存活最大时间,默认600000(10分钟) spring.datasource.hikari.idle-timeout=30000 # 连接池名称 spring.datasource.hikari.pool-name=DatebookHikariCP # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 spring.datasource.hikari.max-lifetime=1800000 # 数据库连接超时时间,默认30秒,即30000 spring.datasource.hikari

Java EE day09学习总结

醉酒当歌 提交于 2020-02-27 08:45:47
今天主要学习C3P0/DBCP/Druid连接池 思维导图: 一.DBCP连接池 1.数据库的连接池在建立数据库连接的时候,能解决很多问题,提高性能的优化。同时市面也有很多第三方公司也为java提供了对应的连接池。所有三方公司的连接池也和JDBC一样,需要遵守一个规则(接口):javax.sql.DataSource; 2.各个厂商如果要兼容市面的业务代码一般都会去实现这个接口,以便于各个连接池之间相互切换以及兼容。 3.现在市面上常见的连接池:DBCP(Spring推荐)/C3P0(Hibernate)/Druid(阿里开源) 4.DBCP连接池:Apache推出的Database Connection Pool 5.使用的步骤: (1)导入jar包(因为不是java自带的,所以需要导入三方包) commons-dbcp-1.4.jar -- 核心包 commons-pool-1.5.6.jar -- 辅助包 (2)创建连接池对象 方式1:Ba2sicDataSource ds = new BasicDataSource(); 方式2:DataSource ds = new BasicDataSource(); (3)设置基础的连接参数 //url地址 ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo

JDBC 连接池

谁说我不能喝 提交于 2020-02-25 22:41:18
文章目录 1. 概念 2. 好处 3. 实现 4. C3P0 5. Druid 1. 概念 其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 2. 好处 节约资源 用户访问高效 3. 实现 1. 标准接口 : DataSource javax.sql 包下的 方法: 获取连接: getConnection() 归还连接: Connection.close() 。如果连接对象Connection是从 连接池 中获取的,那么调用 Connection.close() 方法,则不会再关闭连接了。而是归还连接 2. 一般我们不去实现它,有数据库厂商来实现 C3P0:数据库连接池技术 Druid:数据库连接池实现技术,由阿里巴巴提供的 4. C3P0 数据库连接池技术 步骤: 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar 不要忘记导入数据库驱动jar包 定义配置文件: 名称 : c3p0.properties 或者 c3p0-config.xml 路径 :直接将文件放在src目录下即可。 创建核心对象 数据库连接池对象 ComboPooledDataSource 获取连接:

SpringBoot系列: Redis 共享Session

二次信任 提交于 2020-02-22 05:15:43
Web项目Session管理是一个很重要的话题, 涉及到系统横向扩展, SpringBoot已经为共享Session很好的解决方案, 这篇文章关注使用Redis共享会话, 同时这也是最常用的方法. ============================ pom.xml 增加依赖 ============================ SpringBoot2 已经将Redis底层客户端从Jedis切换为Lettuce库, Lettuce 是基于Netty的实现, 比 Jedis 更加高效, 并且是线程安全的, 能满足多线程环境下并发需求, 同时支持线程池. 使用 Lettuce 客户端(推荐), pom.xml的依赖有: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- Session 依赖 --> <dependency> <groupId>org

spring boot 2.0之后默认的连接池 HIkariCP介绍

£可爱£侵袭症+ 提交于 2020-02-20 10:59:24
  HIkariCP链接池比之传统的Tomcat JDBC datasource 、c3p0 datasource 等传统链接池优势太大,在获取链接释放链接,执行效率上面高出很多,这个产品的口号是“快速、简单、可靠”。 官网详细地说明了HikariCP所做的一些优化,总结如下: 字节码精简 :优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码; 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一; 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描; 自定义集合类型(ConcurrentBag:提高并发读写的效率; 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化) HikariCP为什么这么快   JDBC连接池的实现并不复杂,主要是对JDBC中几个核心对象Connection、Statement、PreparedStatement、CallableStatement以及ResultSet的封装与动态代理。接下来从几个方面来看看HikariCP为什么这么快:   优化并精简字节码  

JAVA - SpringBoot项目引用MyBatis操作数据库

对着背影说爱祢 提交于 2020-02-20 10:19:28
JAVA - SpringBoot项目引用MyBatis操作数据库   我们这一一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件。然后再使用阿里巴巴提供的开源连接池druid,这个连接池的好处我就不说了,集合了所有连接池的好处,并且还提供了监控等功能,加大了可扩展性等等。 1. pom.xml 引用依赖 我们除了引入web依赖之外还引入了三个依赖,分别是MySQL,JDBC,Mybatis,我们如下观看一下完整的依赖情况:      <!--web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> mybatis的版本号查看: <!--这个依赖已经包括JDBC依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.5.4</version> </dependency> <!--数据库连接--> <dependency

JDBC学习笔记之Druid(十五)

早过忘川 提交于 2020-02-19 19:58:36
步骤 导入 druid-1.0.9.jar 包 定义 配置文件 : 是 properties 形式的 可以叫任意名称,可以放在任意目录下 driverClassName = com . mysql . cj . jdbc . Driver url = jdbc : mysql : / / 127.0 .0 .1 : 3306 / test04 username = root password = root # 初始化链接数 initialSize = 5 # 最大连接数 maxActive = 10 # 超时时间 maxWait = 3000 加载配置文件 properties //3.加载配置文件 Properties pro = new Properties ( ) ; InputStream is = DruidDemo01 . class . getClassLoader ( ) . getResourceAsStream ( "druid.properties" ) ; pro . load ( is ) ; 获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory //4.获取连接池对象 DataSource ds = DruidDataSourceFactory . createDataSource ( pro ) ; 获取连接: