属性文件:DBconfig.properties
<span style="font-size:18px;">DBClassName=com.mysql.jdbc.Driver
DBUrl=jdbc:mysql://localhost:3306/synuatp
DBroot=root
DBpassword=sa</span>
工具类
<span style="font-size:18px;">package com.synuatp.core.dao.impl;
import java.beans.PropertyVetoException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
*
* @author zhutianpeng
* @version v1.1.0
*
* 功能:是利用单例模式实现一个获取数据源连接和释放连接的工具类(读取DBconfig.properties)
*/
public class DBConnectionC3P0{
private static String DBClassName;
private static String DBUrl;
private static String root;
private static String password;
private static DBConnectionC3P0 dbConnectionC3P0 = null;
private static ComboPooledDataSource comboPooledDataSource;
// private Connection conn;
private DBConnectionC3P0(){}
static{
Properties properties = new Properties();
try {
properties.load(new FileInputStream(new File("src/DBconfig.properties")));
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("【未找到DBconfig.properties文件...】");
} catch (IOException e) {
e.printStackTrace();
System.out.println("【读取DBconfig.properties文件时发生IO异常...】");
}
//获取属性文件中的参数
DBClassName = properties.getProperty("DBClassName");
DBUrl = properties.getProperty("DBUrl");
root = properties.getProperty("DBroot");
password = properties.getProperty("DBpassword");
System.out.println(comboPooledDataSource);
comboPooledDataSource = new ComboPooledDataSource();
System.out.println(comboPooledDataSource);
try {
comboPooledDataSource.setDriverClass(DBClassName);
comboPooledDataSource.setJdbcUrl(DBUrl);
comboPooledDataSource.setUser(root);
comboPooledDataSource.setPassword(password);
} catch (PropertyVetoException e) {
e.printStackTrace();
System.out.println("【加载数据源失败...】");
}
comboPooledDataSource.setInitialPoolSize(20);
comboPooledDataSource.setMinPoolSize(10);
comboPooledDataSource.setAcquireIncrement(5);
comboPooledDataSource.setMaxPoolSize(50);
}
/**
*
* @return
* 获取工具类的实例(单例模式)
*/
public static DBConnectionC3P0 getInstance() {
if(dbConnectionC3P0==null){
synchronized(DBConnectionC3P0.class){
if(dbConnectionC3P0==null){
dbConnectionC3P0 = new DBConnectionC3P0();
}
}
}
return dbConnectionC3P0;
}
/**
* 获取数据源的连接对象
*/
public Connection getConnection() {
try {
return comboPooledDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 释放数据库资源
*/
public void free(ResultSet rs, Statement st, Connection conn) {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("【ResultSet关闭失败...】");
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("【Statement关闭失败...】");
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("【Connection关闭失败...】");
}
}
try {
DataSources.destroy(comboPooledDataSource);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("【关闭数据源失败...】");
}
}
}
</span>
注:
①使用单例模式要注意在创建对象时的多线程问题。
②在导入c3p0包时还需要导入另一个依赖包。共需要导入两个包。