-
2020-07-23 17:51:04
一、什么是连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
———以上参考《百度百科》
二、为什么使用数据连接池
建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。
连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。
三、数据库连接池的工作原理
连接池的工作原理主要由三部分组成,分别为
- 连接池的建立
- 连接池中连接的使用管理
- 连接池的关闭
第一、连接池的建立。
一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。
第二、连接池的管理。
连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:当客户请求数据库连接时,
- 1)如果池中有空闲连接可用,返回该连接。
- 2)如果没有空闲连接,池中连接都已用完,创建一个新连接添加到池中。
- 3)如果池中连接已达到最大连接数,请求按设定的最大等待时间进入等待队列直到有空闲连接可用。
- 4)如果超出最大等待时间,则抛出异常给客户。
当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
如果连接长时间空闲,或检测到与服务器的连接已断开,连接池管理器也会将该连接从池中移除。
第三、连接池的关闭。
当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。四、连接池需要注意的点
1、并发问题
为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。
这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等,使用synchronized(java)lock(C#)关键字即可确保线程是同步的。
2、事务处理
我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。
我们知道当2个线程共用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。
为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。
3、连接池的分配与释放
连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。
对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他,如果没有就抛出一个异常给用户。
4、连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳?
系统可采取设置**最小连接数(minConnection)和最大连接数(maxConnection)**等参数来控制连接池中的连接。
比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。
最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。
如何确保连接池中的最小连接数呢?
有动态和静态两种策略。
动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。更多相关内容 -
数据库连接池
2022-02-21 11:33:05数据库连接池 概念 之所以使用数据库连接池,是因为之前传统的连接方法是每进行一次数据库操作都要创建一个新的连接,并且在操作结束后又将连接释放。非常的浪费资源,效率低下。使用连接池技术就能一次性创建多个...数据库连接池
概念
之所以使用数据库连接池,是因为之前传统的连接方法是每进行一次数据库操作都要创建一个新的连接,并且在操作结束后又将连接释放。非常的浪费资源,效率低下。使用连接池技术就能一次性创建多个连接,使用的时候直接从池子中获取连接就行。
连接池实际就是一个容器(集合),其中存放着数据库连接,当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户访问数据库的时候,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。数据库连接池的优点
- 节约资源
- 高效
数据库连接池的实现
-
标准接口: DataSource javax.sql包下的
1.方法:
- 获取连接(getConnection())
- 归还连接(如果连接对象是从连接池中获取的,那么直接直接调用connection.close()就不会再关闭连接,而是将连接归还到数据连接池)
2.一般数据库连接池不用自己去实现,数据库厂商已经将其进行实现了
-
C3P0:数据库连接池技术,比较老了
-
Druid:数据库连接池技术,有阿里巴巴提供,非常优秀的数据库连接池技术
C3P0的使用
-
导入jar包
c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar
-
配置文件
名称:c3p0.properties或者c3p0-config.xml 路径:直接将文件放在src目录下即可
配置文件解析 c3p0-config.xml
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <named-config name="default"></named-config> <!--在使用C3P0获取连接的时候,只要传递这里的名字就行--> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/sql_store</property> <property name="user">root</property> <property name="password">smt020528</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <!--初始化申请的连接数量--> <property name="maxPoolSize">10</property> <!--最大池容量--> <property name="checkoutTimeout">3000</property> <!--超时时间--> </default-config> <named-config name="otherc3p0"> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
注意:其中的
<default-config> <named-config name="default"></named-config>
这一部分在官方下载的初始配置文件中是没有的,由于在实际中可能会创建不止一个连接池,呢么就需要给不同的连接池加以区分,最好的方法就是添加name。
DataSource dataSource=new ComboPooledDataSource();
想要使用哪个连接池,就在这个构造方法中传递哪个连接池配置文件中的name值即可。
-
创建核心对象 数据库连接池对象 ComblPooledDataSource
-
创建连接:getConnection
代码
package 连接池.C3P0; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.*; public class Pool_Demo2 { public static void main(String[] args) { DataSource dataSource = new ComboPooledDataSource("default"); try { Connection connection = dataSource.getConnection(); Statement statement = null; ResultSet resultSet=null; String sql_statement = "select * from customers"; statement=connection.prepareStatement(sql_statement); resultSet=statement.executeQuery(sql_statement); while(resultSet.next()){ String customer_id=resultSet.getString(1); String first_name=resultSet.getString(2); String last_name=resultSet.getString(3); String birth_date=resultSet.getString(4); String phone=resultSet.getString(5); String addrtess=resultSet.getString(6); String city=resultSet.getString(7); String state=resultSet.getString(8); String points=resultSet.getString(9); System.out.println(customer_id+" "+first_name+" "+last_name+""+birth_date +" "+birth_date+" "+phone+" "+addrtess+" "+city+" "+state+" "+points); } } catch (SQLException e) { e.printStackTrace(); } } }
Druid的使用
Druid是阿里开发的,非常优秀
-
导入jar包
druid-1.0.9.jar
-
配置文件
该配置文件是properties文件 可以叫任意名称
配置文件解析
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/sql_store username=root password=******** //数据库密码 initialSize=5 //初始化的默认连即数 maxActive=10 //最大连接数 maxWait=3000 //最大等待时间 //如果在使用该连接池进行连接出现该错误:testWhileIdle is true, validationQuery not set,在 //配置文件中添加下面的配置即可。初始的配置文件中是没有下面的信息的。 timeBetweenEvictionRunsMillis=60000 minEvictableIdleTimeMillis=300000 validationQuery=SELECT 1 testWhileIdle=true testOnBorrow=false testOnReturn=false poolPreparedStatements=false maxPoolPreparedStatementPerConnectionSize=200
- 获取数据库连接对象
Properties properties=new Properties(); InputStream is=Druid_Demo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(is); //获取池连接对象 DataSource dataSource=DruidDataSourceFactory.createDataSource(properties); Connection connection=dataSource.getConnection(); System.out.println(connection);
-
阿里巴巴主流数据库连接池Druid入门
2022-04-09 09:45:36数据库连接池的必要性 (一).传统数据库连接模式的的步骤 1.在主程序中创建连接 2.进行sql操作 3.关闭数据库连接 (二).传统数据库连接模式存在的问题 1.浪费时间:每次连接时都要验证登录和将conn加载到内存...目录
(一).为druid数据库连接池创建properties文件
一.数据库连接池的必要性
(一).传统数据库连接模式的的步骤
1.在主程序中创建连接
2.进行sql操作
3.关闭数据库连接
(二).传统数据库连接模式存在的问题
1.浪费时间:每次连接时都要验证登录和将conn加载到内存,
2.不能大规模的访问数据库:当数据库访问人数过多时,占用大量系统资源,会导致服务器崩溃
3.存在内存泄漏问题:每次连接都需要断开连接,如果不断开,程序运行结束,会有创建的连接对象存在内存中一直无法关闭,就会导致java内存泄漏的问题。
内存泄漏:指创建的对象无法被回收
二.数据库连接池技术
(一).数据连接池的思想:
事先在内存中建立一个缓冲池,用来存放一定数量的连接对象,需要时在里面调用,结束时放回缓冲池。
(二).数据库连接池的任务:
管理和释放数据库连接,允许用户使用池内的连接对象,而不需要创建对象。
(三).数据库连接池的规模:
初始化时的数量:由数据库最小连接数来设定;
最大数量:由最大数据库连接数来确定。
当连接数超过了最大连接数,超过的连接就会停止等待连接对象的释放。
(四).工作原理:
(五).数据库连接池的优点:
1.资源重用:
连接池中的对象需要时取出,不需要被连接池回收
2.更快的反应速度:
事先在池中储备连接对象,初始化已经完成,直接调用。
3.数据库共享机制
多个用户访问同一数据库,通过在应用层的配置,可以避免资源独占。
4.避免内存泄漏:
连接对象统一管理,设置连接对象时间片,超时强制回收。
三.多种开源的数据库连接池
JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource是一个接口,该接口通常由服务器提供。
(一).常见的开源数据库连接池:
DBCP:速度比C3P0快但有bug
c3p0:速度慢,但相对稳定
Proxool:开源连接池,有监控连接池的功能,但稳定性比C3P0差
BoneCP:速度快,开源
Druid:阿里提供的连接池,速度快(不及BoneCP),稳定性好,有监控连接池的功能。
四.学习最主流的数据库连接池Druid
(一).为druid数据库连接池创建properties文件
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbc_db username=root password=3.141592654 initialSize=10 maxActive=20
(二).创建数据库连接池
public Class JDBCUtils{ private static DataSource source; static { try{ //创建properties对象,用来封装从文件中获取的流数据 Properties pros = new Properties(); //采用类加载方式获取文件的内容,并封装成流 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("Druid.properties"); //将流传入到pros对象中 pros.load(is); //利用工厂类创建数据库连接池 source = DruidDataSourceFactory.createDataSource(pros); }catch (Exception e){ e.printStackTrace(); } } public static Connection getConnByDruid() throws Exception { //所有的数据连接池要想被java所使用,都必须先实现sun公司提供的一个接口DateSource //获取数据库连接池对象 Connection conn = source.getConnection(); return conn; } }
(三).测试通过数据库连接池获取连接对象
public class TestDruid { @Test public void getDruidConn() throws Exception { Properties pros = new Properties(); InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("Druid.properties"); pros.load(is); //所有的数据连接池要想被java所使用,都必须先实现sun公司提供的一个接口DateSource //获取数据库连接池对象 DataSource source = DruidDataSourceFactory.createDataSource(pros); Connection conn = source.getConnection(); System.out.println(conn); } }
(四).测试结果(创建成功)
五.Druid数据库连接池常见配置参数
-
【JDBC技术】终于知道Java底层是如何连接数据库了!——(7)数据库连接池
2021-08-23 12:05:05多种开源的数据库连接池3.1 C3P0数据库连接池3.2 DBCP数据库连接池3.3 Druid(德鲁伊)数据库连接池 数据库连接池 1. JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: ...JDBC 核心技术解析
文章目录
数据库连接池
1. JDBC数据库连接池的必要性
-
在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:
- 在主程序(如servlet、beans)中建立数据库连接
- 进行sql操作
- 断开数据库连接
-
这种模式开发,存在的问题:
- 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。**数据库的连接资源并没有得到很好的重复利用。**若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。
- **对于每一次数据库连接,使用完后都得断开。**否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。(回忆:何为Java的内存泄漏?)
- 这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
2. 数据库连接池技术
-
为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。
-
数据库连接池的基本思想:就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
-
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
-
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
- 工作原理:
-
数据库连接池技术的优点
1. 资源重用
由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
2. 更快的系统反应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
3. 新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
4. 统一的连接管理,避免数据库连接泄漏
在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露
3. 多种开源的数据库连接池
- JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
- DBCP 是Apache提供的数据库连接池。tomcat 服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
- C3P0 是一个开源组织提供的一个数据库连接池,**速度相对较慢,稳定性还可以。**hibernate官方推荐使用
- Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
- BoneCP 是一个开源组织提供的数据库连接池,速度快
- Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不确定是否有BoneCP快
- DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池
- DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。
- 特别注意:
- 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
- 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
3.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"); cpds.setUser("root"); cpds.setPassword("abc123"); // cpds.setMaxPoolSize(100); Connection conn = cpds.getConnection(); return conn; }
mysql8.0下
public static Connection getConnection1() throws Exception{ ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass( "com.mysql.cj.jdbc.Driver" ); cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT" ); cpds.setUser("root"); cpds.setPassword("abc123"); // 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="helloc3p0"> <!-- 获取连接的4个基本信息 --> <property name="user">root</property> <property name="password">abc123</property> <property name="jdbcUrl">jdbc:mysql:///test</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 涉及到数据库连接池的管理的相关属性的设置 --> <!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 --> <property name="acquireIncrement">5</property> <!-- 初始化数据库连接池时连接的数量 --> <property name="initialPoolSize">5</property> <!-- 数据库连接池中的最小的数据库连接数 --> <property name="minPoolSize">5</property> <!-- 数据库连接池中的最大的数据库连接数 --> <property name="maxPoolSize">10</property> <!-- C3P0 数据库连接池可以维护的 Statement 的个数 --> <property name="maxStatements">20</property> <!-- 每个连接同时可以使用的 Statement 对象的个数 --> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>
mysql8.0的配置文件(注意jdbcUrl的变化)
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-config name="helloc3p0"> <!-- 提供获取连接的4个基本信息 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true</property> <property name="user">root</property> <property name="password">abc123</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>
3.2 DBCP数据库连接池
- DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool。如需使用该连接池实现,应在系统中增加如下两个 jar 文件:
- Commons-dbcp.jar:连接池的实现
- Commons-pool.jar:连接池实现的依赖库
- **Tomcat 的连接池正是采用该连接池来实现的。**该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
- 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
- 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
- 配置属性说明
属性 默认值 说明 initialSize 0 连接池启动时创建的初始化连接数量 maxActive 8 连接池中可同时连接的最大的连接数 maxIdle 8 连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制 minIdle 0 连接池中最小的空闲的连接数,低于这个数量会被创建新的连接。该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大。 maxWait 无限制 最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待 poolPreparedStatements false 开启池的Statement是否prepared maxOpenPreparedStatements 无限制 开启池的prepared 后的同时最大连接数 minEvictableIdleTimeMillis 连接池中连接,在时间段内一直空闲, 被逐出连接池的时间 removeAbandonedTimeout 300 超过时间限制,回收没有用(废弃)的连接 removeAbandoned false 超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收 - 获取连接方式一:
public static Connection getConnection3() throws Exception { BasicDataSource source = new BasicDataSource(); source.setDriverClassName("com.mysql.jdbc.Driver"); source.setUrl("jdbc:mysql:///test"); source.setUsername("root"); source.setPassword("abc123"); // source.setInitialSize(10); Connection conn = source.getConnection(); return conn; }
- 获取连接方式二:
//使用dbcp数据库连接池的配置文件方式,获取数据库的连接:推荐 private static DataSource source = null; static{ try { Properties pros = new Properties(); InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties"); pros.load(is); //根据提供的BasicDataSourceFactory创建对应的DataSource对象 source = BasicDataSourceFactory.createDataSource(pros); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection4() throws Exception { Connection conn = source.getConnection(); return conn; }
其中,src下的配置文件为:【dbcp.properties】
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useServerPrepStmts=false username=root password=abc123 initialSize=10 #...
mysql8.0的src下配置文件
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT username=root password=abc123 initialSize=10
3.3 Druid(德鲁伊)数据库连接池
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、Proxool等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前最好的连接池之一。
package com.atguigu.druid; import java.sql.Connection; import java.util.Properties; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; public class TestDruid { public static void main(String[] args) throws Exception { Properties pro = new Properties(); pro.load(TestDruid.class.getClassLoader().getResourceAsStream("druid.properties")); DataSource ds = DruidDataSourceFactory.createDataSource(pro); Connection conn = ds.getConnection(); System.out.println(conn); } }
其中,src下的配置文件为:【druid.properties】
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true username=root password=123456 driverClassName=com.mysql.jdbc.Driver initialSize=10 maxActive=20 maxWait=1000 filters=wall
- 详细配置参数:
配置 缺省 说明 name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:”DataSource-” + System.identityHashCode(this) url 连接数据库的url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto username 连接数据库的用户名 password 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/使用ConfigFilter driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下) initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 maxActive 8 最大连接池数量 maxIdle 8 已经不再使用,配置了也没效果 minIdle 最小连接池数量 maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 maxOpenPreparedStatements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 timeBetweenEvictionRunsMillis 有两个含义: 1)Destroy线程会检测连接的间隔时间2)testWhileIdle的判断依据,详细看testWhileIdle属性的说明 numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun minEvictableIdleTimeMillis connectionInitSqls 物理连接初始化的时候执行的sql exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接 filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall proxyFilters 类型是List,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系 -
-
C#高效数据库连接池源码
2012-11-20 10:32:30C#高效数据库连接池源码 -
数据库连接池连接数量配置多大合理
2021-02-26 15:52:00前段时间在一个老项目中经历过一个问题:一个 Dubbo 服务,启动的时候慢的要死,后来看日志查原因整个过程一直在初始化数据库连接。一看数据库连接参数,连接池大小:1024。 很多入行晚的同学没有经历过手写 JDBC ... -
JAVA之JDBC数据库连接池(超详细介绍)
2020-07-09 16:34:50JDBC数据库连接池一、JDBC数据库连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池3.1 C3P0数据库连接池3.2 DBCP数据库连接池3.3 Druid(德鲁伊)数据库连接池 一、JDBC数据库连接池的必要性 1、在使用... -
Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)
2015-09-27 01:44:06在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927 -
几种常用数据库连接池的使用
2019-02-14 12:38:38一、应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的... -
MySQL查看数据库连接数
2021-08-30 14:05:18一、查看数据库连接数 a)SQL: show full processlist; 注意: 1. 若不加上full选项,则最多显示100条记录 2. 若以root帐号登录,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接 二、... -
JDBC与数据库连接池
2018-10-24 23:58:23JDBC简介,driver类型,JDBC连接,使用技巧; 连接,短连接,长连接,连接池; 池化思想; 配置,基本配置,关键配置,性能配置; 连接池工具; druid; HikariCP; flexy-pool; -
数据库连接池原理之(一):通俗易懂的数据库连接池原理以及实现机制讲解
2018-12-21 11:45:02本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接池原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接池实现过程作为演示。 一、早期通过JDBC方式操作数据库 我们先来看早期使用JDBC... -
几款数据库连接工具
2021-11-12 18:08:24几款数据库连接工具 文章目录几款数据库连接工具1. 前言2. Navicat3. DBeaver4. DataGrip5. phpMyAdmin 1. 前言 我目前使用sqlite3和mysql数据库比较多,所以对数据库客户端的需求主要是支持多平台,至少可以连接... -
Druid(德鲁伊)数据库连接池
2021-12-27 17:45:13数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy... -
数据库连接池大小到底多少合适?
2020-06-09 11:59:22基本上来说,大部分项目都需要跟数据库做交互,那么,数据库连接池的大小设置成多大合适呢? 一些开发老鸟可能还会告诉你:没关系,尽量设置的大些,比如设置成 200,这样数据库性能会高些,吞吐量也会大些! 你也许... -
Swoole数据库连接池分析及实现
2021-04-26 11:17:51A:默认规则一个协程对应一个数据库连接,同一个协程里应该返回同一个链接,即保存链接时应该以协程id为key; 2:如何判断连接是否被使用? 在获取连接时我们是不能把正在使用的连接给丢给别的协程的,不然就出现数据混淆的... -
21.Mysql数据库连接配置
2021-08-28 22:40:41数据库的连接配置(使用Mysql为例) (1)在对应的远程数据库中创建数据库以供使用:(pycharm中操作) 首先:开启远程连接: 然后,进入Mysql,并创建数据库db_test: (2)在settings.py中配置数据库 # Database ... -
两款免费、好用的数据库连接工具
2021-08-06 12:25:32Navicat是一套快速、可靠的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单... -
数据库连接 驱动&连接池方式
2021-03-01 16:27:46文章目录手写 通过驱动直连数据库手写 通过连接池连接数据库 我们平时利用持久化架构就完全足够我们使用数据库了,可是就和学习MVC前要先学javaweb一样,我们可以学会利用驱动或者连接池方式去操纵库,这样既可以... -
Java 数据库连接池
2022-03-11 11:16:02一、关于数据库连接池 一个普通的 java 程序,要查询数据库的数据,基本流程是这样的: 可以看到,进行一次查询,要进行很多次网络交互,这样的缺点是: 网络IO多; 响应时间长,导致QPS降低; 频繁创建连接和关闭... -
如何快速有效解决数据库连接失败问题
2022-04-15 11:11:55无法连接到数据库 以Microsoft SQL Server Management Studio,以下简称(SSMS)为例显示下图界面 处理方法:打开SQL Server配置管理器,会出现如图服务器状态关闭, 此时只需重新启动服务状态即可,如下图 ... -
数据库连接池学习笔记(一):原理介绍+常用连接池介绍
2018-09-27 22:12:43数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 为什么要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用... -
JavaWeb(八)数据库连接层介绍
2021-03-05 10:46:461.数据库连接池 (1)原JDBC开发流程 从客户端第一次连接服务器并执行相关业务处理开始 -》业务执行结束(SQL使用完毕) -》释放资源 加载驱动(只需要加载⼀次) 建⽴数据库连接(Connection) 执⾏ SQL 语句... -
php数据库连接失败的原因及解决办法
2021-03-25 10:17:39各种业务系统在使用过程中都会遇到一些问题,因数据库连接失败,不能登录管理软件就是其中之一,这个很令人头疼而且常见的问题一般的业务系统均采用的是SQL数据库,我们这里总结了SQL数据库连接失败的原因和解决方法... -
Druid数据库连接池
2019-04-02 23:00:32什么是数据库连接池: 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池... -
Springboot+druid数据库连接池使用
2018-06-08 17:23:101. 为什么要使用数据库连接池 使用数据库连接池主要考虑到程序与数据库建立连接的性能。创建一个新的数据库是一个很耗时的过程,在使用完之后,可能还需要不断的释放建立的连接,对资源的损耗大。 而采用数据库... -
应用层面上数据库连接池的一些优化措施
2021-02-02 00:40:03CURD一时爽,故障来了火葬场。作为一个软件开发者,除了要能够应对业务功能需求之外,掌握一些优化方法和...本文一起来讨论一些数据库连接池上的一些优化措施,让应用跑得流畅,让自己解放。 数据库连接池提升了编 -
【mysql调优】数据库连接池配置优化
2020-03-27 23:02:23在性能调优过程中,通过监控数据经常发现接口花费大量时间在获取数据库连接中,那如何通过优化数据库连接池的配置来优化服务的性能呢? 什么是数据库连接池 创建数据库连接是一个很耗时的操作,也容易对数据库造成...