数据库两大常见的连接池
有了jdbc为什么还需要连接池?
- 获取数据库连接需要消耗比较多的资源,而每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,
而数据库创建连接通常需要消耗相对较多的资源,创建时间也较长。而数据库连接对象的使用率低。 - 假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出
c3p0连接池使用方式:
1.导入jar包,c3p0jar包符和辅助包
2.书写配置文件 c3p0-config.xml名称固定,放的位置固定,放在src目录
配置文件固定写法如下:
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 1. 数据库的连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 2. 连接池参数 -->
<!--初始连接数-->
<property name="initialPoolSize">5</property>
<!--最大连接数-->
<property name="maxPoolSize">10</property>
<!--等待多久以后抛出异常-->
<property name="checkoutTimeout">2000</property>
</default-config>
<!-- 命名配置 -->
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///c3p0test</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>
注意:ComboPooledDataSource() 使用无参数的构造方法创建对象,会默认加载的src文件夹下c3p0-config.xml文件,并且
会默认读取default-config下的配置信息。
ConboPooledDataSource(命名配置) 使用的这个带参数的构造方法,可以将named-config name="otherc3p0"中的name
传递进去,可以创建对应的连接池
多个配置方案的好处:
1. 可以连接不同的数据库,如:jdbctest,c3p0test
2. 可以连接不同厂商的数据库,如:mysql,oracle
3. 可以指定不同的连接池参数
3.创建对象 ComboPooledDataSource 对象 可以获取一个数据源,这个数据连接池中可以在配置文件中配置开始
创建多少个连接池对象,也就是一个连接池中中有多个连接对象
4.然后可以使用datasource.getConnection();获取一个连接。
Druid连接池
1.导入jar包,一个jar包
2.书写配置文件,配置文件是properties文件,这个文件的名称随便写,位置随便放一般都是放在项目路径下,因为这个配置文件是自己来加载
配置文件写法:
# 数据库连接参数
url=jdbc:mysql:///jdbctest
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
# 连接池的参数
initialSize=3
maxActive=10
maxWait=2000
3.加载配置文件
加载方式:首先创建propeties对象,然后调用load方式,通过流的方式将配置文件加载到内存中即可!
4.得到数据源
类名称 :DruidDataSourceFactory
可以通过类名称去调用public static DataSource createDataSource(Properties properties)这个方法获取一个dataSource对象
对jdbcUtils的改造:
有了上面的连接池以后,对数据库的操作效率提高,同时一旦封装好类工具类以后,代码量意思大大的减少类,所以现在可以通过连接池对工具类的重新改造!
这个工具类不再是自己通过driverManger获取conn了而是通过连接池来拿取连接
如下:
class jdbcUtils{
/*创建一个数据源对象,并且静态处理,目的是当项目启动时候,创建这个数据源以后,在项目不关闭前提下都不再会创建这个数据源,这个比起每次使用用到
jdbc的时候都要创建一个数据源对象更加节省了内存,同时也大大的方便了调用,操作jdbc更加的方便!*/
//将这个数据源静态化
private static ComboPooledDateSource ds=new ComboPooledDataSource();
//创建一个公有的数据源获取方法getDataSource
public static DateSource getDateSource(){
return ds;
}
//提供一个getConnnection()方法,下次项目中需要使用到获取连接就直接调用这个方法即可
public static Connection getConnection(){
try {
return cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//创建释放资源的方法 release()
//释放资源 释放两个
public static void release(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
//释放资源 释放三个
public static void release(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stmt, conn);
}
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。