JDBC(四)-连接池、配置文件
配置文件
每次进行JDBC操作,都要进行加载驱动管理器和获取connection连接,他们值都是固定的,是不是很烦,另外目前信息存储在MySQL数据库中,但在开发和部署时有可能使用不同的数据库,也可能因为客户的需求而更换数据库产品。此时的做法有何弊端呢?
让用户脱离程序本身修改相关的变量设置–使用配置文件
- 后缀名为.properties
- 格式是“键=值”格式
- 使用#来注释
- 一定要放在src目录下
常见方法
单例模式进行读取文件
package cn.kgc.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
private static ConfigManager configManager;
private static Properties properties;
//在构造工具类时,进行配置文件的读取
private ConfigManager(){
String configFile = "db.properties";
properties = new Properties();
InputStream in = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
try {
properties.load(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//通过单例模式设置实例化的个数
public static ConfigManager getInstance(){
if(configManager==null){
configManager = new ConfigManager();
}
return configManager;
}
//通过key获取对应的value
public String getString(String key){
return properties.getProperty(key);
}
}
连接池技术
当一个用户要使用软件时,就需要频繁的使用数据库进行增删改查,每次增删改查操作都需要获取连接,频繁的连接导致系统的安全性和稳定性差。如果说一个用户的频繁获取连接尚能接受,那么成千上万的用户进行增删改查来获取连接,对系统来说将是一个巨大的负荷!
我们可以设计一个用来存放连接的池子,这个池子起名为连接池。连接池中存放一定数量的连接,当用户需要获取连接时,就从这个池子中获取,用完后关闭资源,再将连接放回连接池。如此,一个连接就可以被反复使用,大大降低系统的压力解决了建立数据库连接耗费资源和时间很多的问题,提高了性能。
- 连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。
- u由于对JDBC中的原始连接进行了封装,从而方便了数据库应用对于连接的使用(特别是对于事务处理),提高了获取数据库连接效率,也正是因为这个封装层的存在,隔离了应用的本身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。
- 连接池主要由三部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。
- 知名的连接池厂商:DBCP 、C3P0、Druid(阿里巴巴)
C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。
步骤
-
官网上下载jar包
-
在工程中添加C3P0的相关Jar包
c3p0依赖包:c3p0-版本号.jar ,mchange-commons-java-版本号.jar
-
在工程的src目录下创建配置文件c3p0-config.xml。
-
记得修改配置文件中的驱动管理器、数据库、账号、密码
编写C3p0工具类
package cn.kgc.housys.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static DataSource dataSource;
private static C3P0Utils instance;
private C3P0Utils(){}
private static class C3P0UtilsHelper{
private static final C3P0Utils INSTANCE = new C3P0Utils();
}
public static C3P0Utils getInstance(){
instance = C3P0UtilsHelper.INSTANCE;
return instance;
}
public static DataSource getDataSource(){
dataSource = new ComboPooledDataSource("mysql");
return dataSource;
}
public Connection getconnection() throws SQLException{
getDataSource();
return dataSource.getConnection();
}
}
修改BaseDao获取Connection连接部分
private Connection conn = null;
private PreparedStatement ps=null;
/**
* 打开数据库连接
*
* @return 一个数据库连接对象
*/
public Connection getConnetion() {
try {
//获取连接
conn=C3P0Utils.getInstance().getconnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}