1、数据库事务

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
事务操作:当一个事务中执行多个操作时,要么所有操作都提交(commit),要么所有操作都回滚(rollback)到最初状态。

2、考虑事务后的代码实现

private TransferMoneyDao transferMoneyDao = new TransferMoneyDao();  
/**  
 * 模拟name2给name1转账  
 * @param name1  
 * @param name2  
 * @param money  
 */  
public void testTransfer(String name1, String name2, Double money){  
    Connection connection = null;  
    try {  
        // 1.获取数据库连接  
        connection = JdbcUtils.getConnection();  
        // 2.取消数据的自动提交  
        connection.setAutoCommit(false);  
        // 3.调用Dao层的转账方法  
        transferMoneyDao.income("zhangsan",money);  
        transferMoneyDao.outgo("lisi",money);  
        // 4.如果转账正常,手动提交事务  
        connection.commit();  
    } catch (Exception e) {  
        e.printStackTrace();  
        try {  
            // 5.如果转账出现异常,回滚数据  
            connection.rollback();  
        } catch (SQLException ex) {  
            ex.printStackTrace();  
        }  
    } finally {  
        // 6.关闭资源  
        JdbcUtils.closeResource(connection,null);  
    }  
}

3、数据库连接池

普通jdbc连接数据库,每一次连接使用完就会断开,当频繁的进行数据库连接时会很占用系统资源。
使用数据库连接池,相当于在一个“缓存池”中放入一定量的连接,需要时从中取出,用完后放回,实现了复用。
连接池技术有C3P0等,这里用的是阿里的Druid

druid的数据库连接池配置:

#驱动加载  
driverClassName=com.mysql.jdbc.Driver  
#注册驱动  
url=jdbc:mysql://127.0.0.1:3306/db_name?characterEncoding=utf-8  
#连接数据库的用户名  
username=root  
#连接数据库的密码  
password=1234  
#属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wall  
filters=stat  
#初始化时池中建立的物理连接个数。  
initialSize=2  
#最大的可活跃的连接池数量  
maxActive=300  
#获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。  
maxWait=60000  
#连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断  
timeBetweenEvictionRunsMillis=60000  
minEvictableIdleTimeMillis=300000  
#用来检测连接是否有效的sql,要求是一个查询语句。  
validationQuery=SELECT 1  
#建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。  
testWhileIdle=true  
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为false  
testOnBorrow=false  
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flase  
testOnReturn=false  
#是否缓存preparedStatement,也就是PSCache。  
poolPreparedStatements=false  
#池中能够缓冲的preparedStatements语句数量  
maxPoolPreparedStatementPerConnectionSize=200

优化一下工具类JDBCUtilsByDruid

public class JDBCUtilsByDruid {  
    // 1、导入druid.jar包  
    // 2、在druid.properties文件中编写好配置  
  
    private static DataSource dataSource;  
  
    // 3、在静态代码块中完成静态数据源的初始化  
    static {  
        // 创建properties对象,读取配置  
        Properties properties = new Properties();  
        try {  
            properties.load(new FileInputStream("src\\druid.properties"));  
            // 创建Druid连接池  
            dataSource = DruidDataSourceFactory.createDataSource(properties);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    /**  
     * 从数据库连接池中获取连接  
     * @return  
     * @throws SQLException  
     */  
    public static Connection getConnection() throws SQLException {  
        return dataSource.getConnection();  
    }  
  
    /**  
     * close是把connection连接对象放回到连接池中  
     * @param connection  
     * @param statement  
     * @param resultSet  
     */  
    public static void closeResource(Connection connection, Statement statement, ResultSet resultSet) {  
        try {  
            if (resultSet != null) {  
                resultSet.close();  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
  
        try {  
            if (statement != null) {  
                statement.close();  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
  
        try {  
            if (connection != null) {  
                connection.close();  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
  
    }}

4、Apache的DbUtils

解决ResultSet结果集不能复用的问题
原理:引入javabean,也叫PoJo或者Domian,一个javabean对象,对应一条表记录,再将这个javabean对象存入到ArrayList集合中。

导入commons-dbutils的jar包

public void testQueryRunner() throws SQLException {  
        Connection connection = JDBCUtilsByDruid.getConnection();  
        QueryRunner queryRunner = new QueryRunner();  
  
        /*  
        通用查询方法,query(),但比增删改多了结果集处理器ResultSetHandler  
        query方法就是执行一个sql语句,后面的1就是给?赋值,有几个问号就写几个  
        ResultSetHandler接口,用于处理ResultSet,介绍几种常用的实现类:  
        - 返回单条记录  
            BeanHandler将结果集中的第一行数据封装到对应的JavaBean实例中  
            MapHandler将结果集中的第一行数据封装到一个Map中,key是列名,value是对应的值  
        - 返回多条记录  
            BeanListHandler将结果集中的每一行数据封装到对应的JavaBean实例中,再存入List  
            MapListHandler将结果集中的每一行数据封装到一个Map中,再存入List  
        - 返回单行单列记录-->Object  
            ScalarHandler一般用于查询特殊值  
         */
//        String sql = "select * from a where id >= ?";  
//        AjavaBean ajavaBean = queryRunner.query(connection,sql,new BeanHandler<>(AjavaBean.class),1);  
//        List<AjavaBean> list = queryRunner.query(connection,sql,new BeanListHandler<>(AjavaBean.class),1);  
  
        /*        
        通用增删改方法,update(),返回的是受影响的行数  
         */        
        String sql = "insert a set name = ? where id = ?";  
        int affectedRow = queryRunner.update(connection,sql,"zhangsan",18);  
  
        // 关闭资源  
        JDBCUtilsByDruid.closeResource(connection,null,null);  
  
    }

原文地址:http://www.cnblogs.com/wang-zeyu/p/16884325.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性