数据库——数据库连接池(数据源)
第一部分:数据库连接池的相关概念
1.传统JDBC的缺点:在使用传统的JDBC开发中,每一次的数据库连接对象的创建和销毁都要花费内存和时间。减低开发的效率。为了克服这个缺点,提升性能,因此引入了连接池技术,来共享Connection;
2.数据库连接池的概念:创建多个数据库的连接对象,将其保存到一个池中,通过池来管理数据库的连接对象,因此,无需我们自己去创建Connection对象,直接通过池来创建,用完之后,调用该对象的close()方法,将该对象归还给池中。实现重复利用的效果。
3.连接池的规范:为了方便应用程序切换不同的连接池,Java为连接池提供了公共的接口:Javax.sql.DataSource,连接池都需要实现该接口。
第二部分:使用C3P0连接池
c3p0的使用步骤:
1.导入相应的jar-->数据库驱动还有c3p0的jar包
2.编写配置文件
配置文件的名称:c3p0-config.xml
配置文件的路径:src/classpath(类路径)
配置文件的内容:命名配置
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
</c3p0-config>
3.编写c3p0的工具类
package com.wgy.JDBC.Utils;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
private static Connection con = null;
public static ComboPooledDataSource getComboPooledDataSource(){
return dataSource;
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
第三部分:使用DBCP连接池
DBCP的使用步骤:
1.导入相应的jar包:
数据库驱动,DBCP相应的jar包
2.编写配置文件
配置文件的名称:*.properties
配置文件的路径:src/classpath(类路径)
配置文件的内容:properties不能编写中文
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydatabase
username=root
password=123
3.编写DBCP的工具类
package com.wgy.JDBC.Utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle;
/*
* 这里编写DBCP的工具类
*/
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBCPUtils {
private static DataSource dataSource = null;
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password =null;
/*
* 写法一:
* static{
try {
InputStream in = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties pro = new Properties();
pro.load(in);
dataSource = BasicDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}*/
/*
* 写法二:
* static{
try {
InputStream in = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties pro = new Properties();
pro.load(in);
driver = pro.getProperty("driver");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
dataSource = new BasicDataSource();
((BasicDataSource) dataSource).setDriverClassName(driver);
((BasicDataSource) dataSource).setUrl(url);
((BasicDataSource) dataSource).setUsername(username);
((BasicDataSource) dataSource).setPassword(password);
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}*/
static{
try {
ResourceBundle bundle =ResourceBundle.getBundle("db");
driver = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
dataSource = new BasicDataSource();
((BasicDataSource) dataSource).setDriverClassName(driver);
((BasicDataSource) dataSource).setUrl(url);
((BasicDataSource) dataSource).setUsername(username);
((BasicDataSource) dataSource).setPassword(password);
}
catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return dataSource;
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}