package com.shizhan.util;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.DataSources;
/**
* 数据库工具类
* 可以根据classpath下配置文件jdbc.properties中配置的参数来获取数据库连接并绑定到当前线程上
* 可以获取JDBC的事务管理器
*
*
*/
public class DbUtils {
private static Properties prop = new Properties();
/** 数据源 */
private static DataSource ds = null;
//用来把Connection绑定到当前线程上的变量
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
static{
try {
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties"));
} catch (IOException e) {
e.printStackTrace();
System.out.println("在classpath下没有找到jdbc.properties文件");
}
//使用C3P0连接池技术
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
DataSource unpooled = DataSources.unpooledDataSource(
prop.getProperty("jdbcUrl"),
prop.getProperty("user"),
prop.getProperty("password"));
ds = DataSources.pooledDataSource(unpooled);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
private DbUtils(){}
/**
* 根据数据库的默认连接参数获取数据库的Connection对象,并绑定到当前线程上
* @return 成功,返回Connection对象,否则返回null
*/
public static synchronized Connection getConnection(){
Connection conn = tl.get(); //先从当前线程上取出连接实例
if(null == conn){ //如果当前线程上没有Connection的实例
try {
conn = ds.getConnection(); // 从连接池中取出一个连接实例
tl.set(conn); //把它绑定到当前线程上
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
/**
* 获取事务管理器
* @return 事务管理实例
*/
public static synchronized TransactionManager getTranManager(){
return new TransactionManager(getConnection());
}
/**
* 关闭数据库连接,并卸装线程绑定
* @param conn 要关闭数据库连接实例
* @throws DaoException
*/
protected static void close(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
tl.remove(); //卸装线程绑定
}
}
}
}
package com.shizhan.util;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 事务管理器
*
*
*/
public class TransactionManager {
private Connection conn;
protected TransactionManager(Connection conn) {
this.conn = conn;
}
/** 开启事务 */
public void beginTransaction() {
try {
conn.setAutoCommit(false); //把事务提交方式改为手工提交
} catch (SQLException e) {
e.printStackTrace();
}
}
/** 提交事务并关闭连接 */
public void commitAndClose() {
try {
conn.commit(); //提交事务
} catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtils.close(conn);
}
}
/** 回滚并关闭连接 */
public void rollbackAndClose(){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtils.close(conn);
}
}
}
#db login parameters
driverClass=oracle.jdbc.driver.OracleDriver
jdbcUrl=jdbc:oracle:thin:localhost:1521:orcl
user=scott
password=tiger
#pool parameters
initialPoolSize=2
maxPoolSize=5
#maxIdleTime=10
#idleConnectionTestPeriod=5
autoCommitOnClose=true