-
-
C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。
1 @Test 2 public void testGetConnection() throws Exception { 3 // 获取数据库连接池的实例化对象 4 ComboPooledDataSource cpds = new ComboPooledDataSource() ; 5 6 // 设置连接需要的基本信息 7 cpds.setDriverClass("com.mysql.cj.jdbc.Driver"); 8 cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"); 9 cpds.setUser("root"); 10 cpds.setPassword("password"); 11 // 设置与管理数据库连接池相关的属性 12 // 设置连接池中初始连接的数量 13 cpds.setInitialPoolSize(10); 14 15 // 获取数据库连接 16 Connection conn = cpds.getConnection() ; 17 System.out.println(conn); 18 }
实现的方式二:配置文件的方式
配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <c3p0-config> 3 <named-config name="myc3p0"> 4 <!-- 提供用于获取连接的基本信息 --> 5 <property name="driverClass">com.mysql.cj.jdbc.Driver</property> 6 <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8</property> 7 <!-- 主机号与端口号为本机3306时,可以省略:即jdbc:mysql:///test?serverTimezone=GMT%2B8 --> 8 <property name="user">root</property> 9 <property name="password">password</property> 10 11 <!-- 管理数据库连接池的基本信息 --> 12 <!-- 当数据库连接池的连接不够时,c3p0 一次性向数据库服务器申请的连接数 --> 13 <property name="acquireIncrement">5</property> 14 <!-- c3p0数据库连接池中初始化时的连接数 --> 15 <property name="initialPoolSize">10</property> 16 17 <!-- c3p0数据库连接池中维护的最少连接数 --> 18 <property name="minPoolSize">10</property> 19 <!-- c3p0数据库连接池中维护的最多连接数 --> 20 <property name="maxPoolSize">100</property> 21 22 <!-- c3p0数据库连接池中最多维护的Statement的个数 --> 23 <property name="maxStatements">50</property> 24 <!-- 每个连接中最多可以使用的Statement的个数 --> 25 <property name="maxStatementsPerConnection">2</property> 26 </named-config> 27 </c3p0-config>
说明:
1. 配置文件的名称要求必须为 “c3p0-config.xml” ;
2. 第 3 行的 <named-config name="myc3p0"> 主要用于设置该配置文件的名称 ;
3. 提供用于获取连接的基本信息的 “name” 可以参考方式一中的方法名,注意不能出现错误。
1 @Test 2 public void testGetConnection2() throws Exception { 3 // 实例化数据库连接池的对象并传入配置文件 4 ComboPooledDataSource cpds = new ComboPooledDataSource("myc3p0"); 5 // 获取数据库连接 6 Connection conn = cpds.getConnection() ; 7 System.out.println("myc3p0:" + conn); 8 }
DBCP数据连接池技术:
方式一:
1 @Test 2 public void testGetConnection() throws Exception { 3 // 获取DBCP数据库连接池的实例化对象 4 BasicDataSource bds = new BasicDataSource() ; 5 6 // 设置连接需要的基本信息 7 bds.setDriverClassName("com.mysql.cj.jdbc.Driver"); 8 bds.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"); 9 bds.setUsername("root"); 10 bds.setPassword("password"); 11 // 设置其他与数据库连接池管理的相关信属性 12 bds.setInitialSize(10); 13 14 // 获取数据库连接 15 Connection conn = bds.getConnection() ; 16 System.out.println(conn); 17 }
dbcp连接池常用基本配置属性:
1.initialSize :连接池启动时创建的初始化连接数量(默认值为0)
2.maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
3.maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
4.minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
5.maxWait :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
6.poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
7.maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
8.minEvictableIdleTimeMillis :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
9.removeAbandonedTimeout :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
10.removeAbandoned :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)
方式二:使用配置文件:
配置文件如下:
1 driverClassName=com.mysql.cj.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8 3 username=root 4 password=password
1 @Test 2 public void testGetConnection2() throws Exception{ 3 // 方式一:使用类的加载器 4 // InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties"); 5 // 方式二:普通的文件流(当前工程下) 6 FileInputStream is = new FileInputStream(new File("src/dbcp.properties")) ; 7 Properties pros = new Properties() ; 8 pros.load(is) ; 9 DataSource ds = BasicDataSourceFactory.createDataSource(pros) ; 10 11 Connection conn = ds.getConnection() ; 12 System.out.println(conn); 13 }