4.JDBC ConnectionManager类,根据sys-config.xml,类JdbcConfig,类XmlConfigReader,连接数据库,释放资源等功能
2011-10-13 20:05
417 查看
package com.bjpowernode.drp.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 这是一个管理JDBC connection的类 . * 浏览器的每一次访问服务器,服务器都会开启一个线程,即每一个request,对应一个线程. * 每一个线程即是一个ThreadLocal,放在ThreadLocal中的东西是属于同一线程共享的,所以在ThreadLocal放Connection, * 同一个request取出来的Connection是属于同一个的. * * @author Kevin * */ public class ConnectionManager { private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>(); /** * getConnection和connectionHolder.get()的区别 * connectionHolder.get()是尝试从ThreadLocal中获取Connection,如果没有,返回null,如果有,直接返回. * getConnection也是尝试从ThreadLocal中获取Connection,如果没有,则创建一个,然后返回,如果有,直接返回. */ public static Connection getConnection() { Connection connection = connectionHolder.get(); if (connection == null) { JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig(); try { Class.forName(jdbcConfig.getDriverName()); connection = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword()); connectionHolder.set(connection); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } return connection; } /** * Connection使用完毕,关闭 */ public static void closeConnection() { // 尝试从ThreadLocal获取Connection,如果没有,关闭Connection失去意义. Connection connection = connectionHolder.get(); if (connection != null) { try { connection.close(); connectionHolder.remove(); } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } /** * Statement使用完毕,关闭 */ public static void closeStatement(Statement statement) { if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } /** * ResultSet使用完毕,关闭 */ public static void closeResultSet(ResultSet resultSet) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } /** * 获取connection,把事务设置为手动提交,自己控制事务 */ public static void manualCommitTransaction() { // 看看ThreadLocal中是否有Connection,如果没有(因为这是第一次跟Connection打交道,所以没有Connection),必须创建一个. // 如果此处不创建Connection,将无法保证事务. Connection connection = getConnection(); if (connection != null) { try { if (connection.getAutoCommit()) { connection.setAutoCommit(false); } } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } /** * 一切操作正常,提交事务 */ public static void commitTransaction() { // 尝试从ThreadLocal获取Connection,如果没有,提交事务失去意义. Connection connection = connectionHolder.get(); if (connection != null) { try { if (!connection.getAutoCommit()) { connection.commit(); } } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } /** * 操作发生异常,回滚事务 */ public static void rollbackTransaction() { // 尝试从ThreadLocal获取Connection,如果没有,回滚事务失去意义. Connection connection = connectionHolder.get(); if (connection != null) { try { if (!connection.getAutoCommit()) { connection.rollback(); } } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } /** * 重置事务,如果事务是手动提交的,重置为自动提交,如果是自动提交的,重置为手动提交. */ public static void resetConnection() { // 尝试从ThreadLocal获取Connection,如果没有,重置事务失去意义. Connection connection = connectionHolder.get(); if (connection != null) { try { if (connection.getAutoCommit()) { connection.setAutoCommit(false); } else { connection.setAutoCommit(true); } } catch (SQLException e) { e.printStackTrace(); throw new ApplicationException("系统错误,请联系系统管理员!"); } } } }
相关文章推荐
- 1.JDBC sys-config.xml配置文件,访问数据库配置(Oracle)
- ibatis连接数据库的配置文件SqlMapConfig.xml---解析
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- JDBC连接数据库实现删除功能
- 关于数据库查询语句SqlDataReader的连接释放问题的解决办法
- jdbc公共操作之建立连接和释放资源
- 编码问题 关于hibernate jdbc数据库连接在xml配置与在properties文件配置的差异
- 建立mysql与数据库连接和释放资源 工具类
- 根据XML文档读取连接数据库信息
- webconfig.xml内配置数据库连接
- JDBC连接资源和流的释放示例
- jdbc与数据库连接之查询表功能
- 点击页面多次后,jdbc操作,抛数据库连接资源不足异常
- JDBC 通过Wrapper接口释放连接资源(关闭连接的新方法)
- ci框架连接数据库资源无法释放
- 07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao
- 07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao
- 配置struts-config.xml连接数据库
- 通过ServletConfig加载web.xml文件来连接数据库
- JDBC连接数据库和释放连接