C3P0 DBCP连接数据库 除此之外的连接实现 |
---|
在没有深入的认识JDBC之前我也是认为,只要会用C3P0和DBCP连接数据库
能够根据需要配置数据库连接池就是会jdbc了 但是如果没有使用开源的
这两种连接呢?你是否了解JDBC那些你不知道的实现?
一、会使用C3P0和DBCP当然是必要的
那么大部分人都会使用的这两种连接如何实现呢?
什么是数据库连接池如图告诉你
1、认识数据库连接池 为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。 预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取 出一个,使用完毕之后再放回去。 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一 个现有的数据库连接,而不是重新建立一个。 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池 中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直 保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用 程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。 |
---|
2、使用JDBC 你需要知道其实现:★(本文首先解析获取Connection)
二、使用C3P0建立连接:
(一)描述:
开源组织提供实现:
C3P0 数据库连接池DataSource 通常被称为数据源,
它包含连接池和连接池管理两个部分,
习惯上也经常把 DataSource 称为连接池
DataSource用来取代DriverManager来获取Connection,获取速度快,
同时可以大幅度提高数据库访问速度。
(二)不多说:(上干货)使用C3P0的步骤
<1>加入jar包:
连接MySql:
mysql-connector-java-5.1.37-bin.jar//mysql获取驱动
c3p0-0.09.1.2.jar //c3p0
连接Oracle:
ojdbc14.jar //Oracle
c3p0-0.09.1.2.jar //c3p0
<2>c3p0没有使用配置文件在代码中如何实现
//测试c3p0纯代码实现未基于配置文件(使用灵活度低)
其中url协议如图:
//此处只是基本的几项连接池配置
@Test
public void testC3p0() throws Exception{
//1.创建DataSource数据源(相当于创建连接池)
ComboPooledDataSource cpds = new ComboPooledDataSource();
//2.设置数据库连接对象的参数
//2-1 连接的数据库驱动
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver
/*cpds.setDriverClass( "oracle.jdbc.driver.OracleDriver" ); //loads the jdbc driver 此处实现oracle连接*/
//2-2连接的数据库 的url//注意连接端口号和数据库名不同
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/数据库名" );
/*cpds.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:xe" ); 此处连接oracle*/
//2-3 设置用户名
cpds.setUser("****");
//2-3设置密码
cpds.setPassword("&&&&");
//3.设置连接池的一些限制
//3-1 设置连接池中连接的初始个数
cpds.setInitialPoolSize(5);
//3-2 设置连接池中连接对象的每次增长个数
cpds.setAcquireIncrement(3);
//3-3 设置连接池的最大连接个数
cpds.setMaxPoolSize(10);
//3-4 设置连接池的最小连接个数
cpds.setMinPoolSize(5);
//4.获取可用连接
Connection connection = cpds.getConnection();
System.out.println(connection);
//省略了使用
//5.关闭连接
connection.close();//放回到连接池
}
}
<3>使用配置文件xml将属性配置配置文件中
★★注意:将xml配置文件放在src下
测试将连上述接池配置属性以properties格式
如:(mysql 和 oracle 不同实现记得根据数据库改url 和 driver配置参数)
< property name=”driverClass”>com.mysql.jdbc.Driver
< property name=”user”>root
< property name=”password”>root
放在在配置文件c3p0-config.xml文件中基于配置文件(使用灵活度高)
测试c3p0基于xml配置实现如下
@Test
public void testC3p0_1() throws Exception{
//配置文件中定义的<named-config name="helloc3p0">
ComboPooledDataSource cpds = new ComboPooledDataSource("helloc3p0");
Connection connection = cpds.getConnection();
System.out.println(connection);
connection.close();
}
二、使用DBCP建立连接:
(一)描述:
DBCP数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,
该连接池依赖该组织下的另一个开源系统:Common-pool.
pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服
务器整合使用,也可由应用程序独立使用。
(三)实现DBCP连接步骤:
<1>加入jar包:
连接MySql:
commons-pool-1.5.5.jar //依赖数据池
Commons-dbcp.jar:连接池的实现 //dbcp的jar包
mysql-connector-java-5.1.37-bin.jar //mysql获取驱动
连接Oracle:
ojdbc14.jar //加入oracle驱动
commons-pool-1.5.5.jar //依赖数据池
Commons-dbcp.jar:连接池的实现 //dbcp的jar包
<2>dbcp没有使用配置文件在代码中如何实现
//测试dbcp纯代码实现未基于配置文件(使用灵活度低)
//此处只是基本的几项连接池配置
@Test
public void testDbcp_1() throws Exception{
//创建数据源对象(相当于创建一个连接池)
BasicDataSource bds = new BasicDataSource();
//2.设置参数
bds.setDriverClassName("com.mysql.jdbc.Driver");
/*bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");实现oracle连接*/
bds.setUrl("jdbc:mysql://localhost:3306/数据库名");
/*bds.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:xe");*/
bds.setUsername("root");
bds.setPassword("root");
//设置连接池的初始连接个数
bds.setInitialSize(5);
//设置连接池的最多连接个数
bds.setMaxActive(10);
//设置连接池的最少的空闲连接个数
bds.setMinIdle(3);
//设置连接池的最多的空闲连接个数
bds.setMaxIdle(5);
//3.获取连接
Connection connection = bds.getConnection();
System.out.println(connection);
//4.关闭
connection.close();
}
<3>dbcp使用配置文件xml将属性配置配置文件中
★★注意:将xml配置或prope文件放在src下
测试将连上述接池配置属性以properties格式
dbcp-config.xml如:(mysql 和 oracle 记得改不同数据库的配置参数)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="xxxx" />
<property name="username"><value>xxxx</value></property>
<property name="password"><value>xxxxx</value></property>
<property name="maxActive"><value>20</value></property>
<property name="initialSize"><value>1</value></property>
<property name="maxWait"><value>60000</value></property>
<property name="maxIdle"><value>20</value></property>
<property name="minIdle"><value>3</value></property>
<property name="removeAbandoned"><value>true</value></property>
<property name="removeAbandonedTimeout"><value>180</value></property>
<property name="connectionProperties"><value>clientEncoding=GBK</value></property>
放在在配置文件dbcp-config.xml文件中基于配置文件(使用灵活度高)
放置在dbcp.properties中
dbcp.driverClassName=com.ibm.db2.jcc.DB2Driver
dbcp.url=jdbc:db2://192.168.3.11:50000/DBNAME
dbcp.username=db2admin
dbcp.password=password
dbcp.initialSize=30
dbcp.minIdle=10
dbcp.maxIdle=10
dbcp.maxWait=1000
dbcp.maxActive=30
测试dbcp基于基本配置实现如下:
@Test
public void testDbcp_2() throws Exception{
Properties pro = new Properties();
pro.load(new FileInputStream("src/dbcp"));
//创建数据源对象(相当于创建一个连接池)
BasicDataSource bds = (BasicDataSource) BasicDataSourceFactory.createDataSource(pro);
//获取连接
Connection connection = bds.getConnection();
System.out.println(connection);
//关闭连接
connection.close();//放回连接池
}
四、如果没有c3p0和dbcp
1、通过注册驱动来获取Connection connection连接
url:
格式: jdbc:子协议:子名称
jdbc:mysql://数据库服务器的主机名:端口号/* 数据库名
jdbc:mysql:///数据库名 (连接的数据库服 务器为本机)
2、注册驱动的两种方式
<1>方式一:通过调用registerDriver(此方法作作为了解不建议使用)
- 1、依赖性太强
-
- 2、导致驱动类加载两遍
-
//注册驱动方式一
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//获取连接
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,”root”,”root”);
<3>注册驱动方式二:Class.forName(“com.mysql.jdbc.Driver”);利用反射获取驱动推荐使用
Class.forName(“com.mysql.jdbc.Driver”);
//通过方式二注册驱动后获取连接的三种方式(基于其构造器参数不同)
//2.获取连接对象Connection的三种方式
方式一(构造器一):
获取连接对象Connection
/*
* 参数1:url
* 参数2:用户名
* 参数3: 密码
*
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名","root","root");
方式二(构造器二)
获取连接对象Connection
/*
* 参数1:url?user=用户名&password=密码
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?user=root&password=root");
方式三(构造器三)
获取连接对象Connection
Properties pro=new Properties();
pro.load(new FileInputStream("db.properties"));
/*
*
* 要求:属性文件中至少要包含 user属性和password属性
*
* 参数1:url
* 参数2:里面封装了user和password属性的 Properties对象
*/
Connection connection = DriverManager.getConnection(pro.getProperty("url"),pro);