JDBC与连接池
⼀、什么是 JDBC?
1、定义:
⼀套JDBC接⼝代码能同时操作所有的关系型数据库,真正执⾏的是驱动jar包。
Java database connectivity 即java数据库连接,可以理解为java语⾔操作数据库,对数据库进⾏增删改查。
数据库有多种,如mysql、oracle、DB2、SQLServer,我们期望实现⼀套java代码能同时操作所有的关系型数据库。
sun公司定义接⼝,数据库⼚商提供实现类(数据库驱动)。
JDBC的本质:官⽅定义的⼀套操作所有关系型数据库的规则(即接⼝),各个数据库⼚商去实现这套接⼝,提供数据库驱动jar包,我们可以使⽤这套JDBC接⼝编程,真正执⾏的代码是驱动jar包中的实现类中的实现⽅法。(类似于多态)
这⼀套接⼝就可以操作不同的数据库,sun公司仅仅定义了接⼝,如果你想⽤java语⾔操作mysql,mysql数据库⼚商写⼀个实现类,即每⼀个数据库⼚商都写⼀个不同的实现类来操作不同的数据库。每⼀个实现类都实现了相同的JDBC接⼝,将来我们在写代码的时候,只需要调⽤接⼝,具体的实现类由不同的公司实现的,不⽤我们写实现类。我们给实现类起名为数据库驱动。
2、使⽤ JDBC 的好处
1) 程序员如果要开发访问数据库的程序,只需要会调⽤ JDBC 接⼝中的⽅法即可,不⽤关注类是如何实现的。
2) 使⽤同⼀套 Java 代码,进⾏少量的修改就可以访问其他 JDBC ⽀持的数据库
mysql下载jar包
⼆、JDBC 访问数据库的步骤
1) 注册和加载驱动(可以省略)
2) 获取连接
3) Connection 获取 Statement 对象
4) 使⽤ Statement 对象执⾏ SQL 语句后得到结果集
5) 返回结果集
6) 释放资源
JDBC快速⼊门:
步骤:
1、导⼊驱动jar包:复制mysql-connector-java-5.1.37-bin.jar(jar包中放的是class⽂件)到项⽬的libs⽬录下,libs⽬录右键,选择Add as library,这
样jar包才会真正加⼊到项⽬中。
2、将实现类(Driver)加载进内存,Driver类中的静态代码块⾃动执⾏,从⽽实现注册驱动,真正注册驱动的是DriverManager。
Class.forName(“全类名”)⽅法将字节码⽂件加载进内存,返回类对象
在mysql-connector-java 5之后的jar包,加载Driver类进内存的代码Class.forName()可以省略不写,即没有间接注册驱动,程序也能正常运⾏,因
为mysql-connector-java-5.1.37-bin.jar包下的META-INF⽬录下的services⽬录下的java.sql.Driver⽂件中把Driver的全类名写进来了,这样如果你没有注册驱动,可以⾃动注册驱动
建议将来写代码的时候不要省略,因为mysql-connector-java 5之前的驱动包就不能使⽤这些代码了,即不能向下兼容。
3、获取数据库连接对象Connection。(这个对象是java代码与数据库间的桥梁对象)
jdbc:mysql://ip地址或域名:端⼝/数据库名称
如果连接的是本机的mysql服务器,并且mysql服务的默认端⼝是3306,则url可以简写为:jdbc:mysql:/
//数据库名称
4、定义sql语句,然后把sql发送给数据库,数据库就会执⾏sql语句,从⽽达到java代码操作数据库的要求求。
5、 Connection对象创建执⾏sql语句的对象statement
6、 statement执⾏sql,接收返回的结果集
7、处理结果集
8、释放资源,否则会造成内存的泄露。
三、数据库连接池
1、为什么使⽤连接池?
之前每⼀个类都需要获取⼀个连接,⽤完之后就释放了,每⼀次都这样。但是获取连接的操作是向操
作系统申请资源,⽽申请资源是⾮常耗时的操作,如果连接⽤完就释放,导致我们的程序会⽐较慢,下⾯学习连接池来解决性能⽐较低,资源浪费的情况。
现在,⽤户在访问数据库时,在系统初始化之后和⽤户访问之前,创建了⼀个容器,并在容器中申请了很多的连接对象装在容器中,当程序访问数据库的时候,不会向系统底层申请连接了,⽽是从容器中获取⼀个连接对象,从⽽去访问数据库,访问完了之后,不会把连接释放掉,⽽是把连接对象归还给容器。这样做的好处是:节约了系统资源,访问的速度快了,连接对象被复⽤,
数据库连接池:其实就是⼀个存放数据库连接的容器(集合)。
2、数据库连接池_实现介绍
Javax.sql.DataSource接⼝就是连接池,DataSource对象是获取连接的⾸选⽅法,由驱动程序供应商实现DataSource接⼝,即谁提供数据库的驱动谁去实现DataSource。
数据库连接池的实现类:
C3P0框架的DataSource实现类是hange.v2.c3p0.ComboPooledDataSource
MyBatis框架的DataSource类是org.apache.ibatis.datasource.pooled.PooledDataSource
Druid框架的DataSource类是com.alibaba.druid.pool.DruidDataSource
Druid由阿⾥巴巴提供,号称全球最好的数据库连接池技术
类ComboPooledDataSource和类DruidDataSource都实现了DataSource接⼝,
获取连接:DataSource接⼝有Connection getConnection()⽅法
归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调⽤Connection.close()⽅法,则不会关闭连接了,⽽是归还连接。连接池把close()⽅法给增强了。
3、druid连接池
导⼊依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
数据库配置:
#数据库
pe=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://ip:3306/zwh?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
4、Mybatis连接池的分类
Mybatis内部分别定义了实现java.sql.DataSource接⼝的UnpooledDataSource、PooledDataSource类来分别表⽰UNPOOLED、POOLED类型的数据源。
1)、POOLED:采⽤传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。每次都是从连接池中获取连接
如果空闲连接idleConnections(是⼀个ArrayList集合)不为空,表⽰还有空闲连接,就从集合中拿出
⼀个连接来⽤;如果没有空闲连接,并且活跃的连接activeConnection(是⼀个ArrayList集合)数⼩于连接池的最⼤活跃连接数poolMaximumActiveConnection,则创建⼀个连接,如果没有空闲连接,并且活跃的连接activeConnections数⼤于等于连接池的最⼤活跃连接数,则从活跃的连接集合activeConnections中取出第⼀个连接(最先进⼊activeConnections的连接)oldestActiveConnection来给我们⽤。
2)、UNPOOLED:采⽤传统的获取连接的⽅式,虽然也实现了Javax.sql.DataSource接⼝,但是并没有使⽤池的思想。每次使⽤都是重新获取连接。3)、JNDI:采⽤服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource是不⼀样的,注意,如果不是web或
maven的war⼯程是不能使⽤的。我们使⽤的是tomcat服务器,采⽤的连接池就是DBCP连接池。
实际开发中⽤POOLED,即⽤池的思想来管理连接。
5、springboot2.0默认连接池
Springboot2.0以后默认数据库连接池选择了Hikari(性能⾼)
项⽬启动时,如果控制台打印如下:
说明使⽤了springboot默认的连接池。
性能⽅⾯ hikariCP>druid>tomcat-jdbc>dbcp>c3p0,hikariCP的⾼性能得益于最⼤限度的避免锁竞争。
配置默认数据库连接池(Hikari)
步骤⼀:起步依赖
<!--jdbc起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
步骤⼆:数据库连接信息配置
# jdbc_config datasource
spring.datasource.sql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/datebook?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull spring.datasource.us
ername=root
spring.datasource.password=root
# Hikari will use the above plus the following to setup connection pooling
pe=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.tion-timeout=30000
spring.tion-test-query=SELECT 1
hikariCP连接池常⽤配置:
5、autoCommit
此属性控制从池返回的连接的默认⾃动提交⾏为。它是⼀个布尔值。默认值:true
6、 connectionTimeout
此属性控制客户端(即您)将等待来⾃池的连接的最⼤毫秒数。如果在没有可⽤连接的情况下超过此时间,则会抛出SQLException。最低可接受的连接超时时间为250 ms。默认值:30000(30秒)
7、 idleTimeout
此属性控制允许连接在池中闲置的最长时间。此设置仅适⽤于minimumIdle定义为⼩于maximumPoolSize。⼀旦池达到连接,空闲连接将不会退出minimumIdle。连接是否因闲置⽽退出,最⼤变化量为+30秒,平均变化量为+15秒。在超时之前,连接永远不会退出。值为0意味着空闲连接永远不会从池中删除。允许的最⼩值是10000ms(10秒)。默认值:600000(10分钟)
8、 maxLifetime
此属性控制池中连接的最⼤⽣存期。正在使⽤的连接永远不会退休,只有在关闭后才会被删除。在逐个连接的基础上,应⽤较⼩的负⾯衰减来避免池中的⼤量消失。我们强烈建议设置此值,并且应该⽐任何数据库或基础设施规定的连接时间限制短⼏秒。值为0表⽰没有最⼤寿命(⽆限寿命),当然是idleTimeout设定的主题。默认值:1800000(30分钟)
9、connectionTestQuery
如果您的驱动程序⽀持JDBC4,我们强烈建议您不要设置此属性。这是针对不⽀持JDBC4的“传统”驱动程序Connection.isValid() API。这是在连接从池中获得连接以确认与数据库的连接仍然存在之前将要执⾏的查询。再⼀次,尝试运⾏没有此属性的池,如果您的驱动程序不符合JDBC4的要
求,HikariCP将记录⼀个错误以告知您。默认值:⽆
10、minimumIdle
该属性控制HikariCP尝试在池中维护的最⼩空闲连接数。如果空闲连接低于此值并且连接池中的总连接数少于此值maximumPoolSize,则HikariCP将尽最⼤努⼒快速⾼效地添加其他连接。但是,为了获得最佳性能和响应尖峰需求,我们建议不要设置此值,⽽是允许HikariCP充当固定⼤⼩的连接池。默认值:与maximumPoolSize相同
11、maximumPoolSize
此属性控制池允许达到的最⼤⼤⼩,包括空闲和正在使⽤的连接。基本上这个值将决定到数据库后端的最⼤实际连接数。对此的合理价值最好由您的执⾏环境决定。当池达到此⼤⼩并且没有空闲连接可⽤时,对getConnection()的调⽤将connectionTimeout在超时前阻塞达⼏毫秒。请阅读关于游泳池尺⼨。默认值:10
12、metricRegistry
该属性仅通过编程配置或IoC容器可⽤。该属性允许您指定池使⽤的Codahale / Dropwizard 实例MetricRegistry来记录各种指标。有关详细信息,请参阅Metrics维基页⾯。默认值:⽆
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论