统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:151 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 Spring

线程和链接的绑定,和事务的写法,使得每个线程只要一个连接对象,从而让事务的一致性同一性更加准确

梦幻书涯
首页 Spring 正文
package com.sise.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class ConnectionUtils {
    private ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    private DataSource dataSource;

    public Connection getThreadConnection() {
        Connection conn = tl.get();
        if (conn == null) {
            try {
                conn = dataSource.getConnection();
                tl.set(conn);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void CloseTranaction() {
        tl.remove();
    }
}


下面就是事务管理的写法



package com.sise.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.sql.SQLException; public class TransactionManager {     private ConnectionUtils connectionUtils;     public void setConnectionUtils(ConnectionUtils connectionUtils) {         this.connectionUtils = connectionUtils;     }     /*      * 开启事务,不让他自动提交      *      * */     public void beginTransaction() {         try {             connectionUtils.getThreadConnection().setAutoCommit(false);         } catch (SQLException e) {             e.printStackTrace();         }     }     /*      * 提交事务      *      * */     public void commitTransaction() {         try {             connectionUtils.getThreadConnection().commit();         } catch (SQLException e) {             e.printStackTrace();         }     }     /*      * 回滚事务,不让他自动提交      *      * */     public void rollbackTransaction() {         try {             connectionUtils.getThreadConnection().rollback();         } catch (SQLException e) {             e.printStackTrace();         }     }     /*      * 释放链接,和解绑事务,使链接不绑定着事务,让下次可以用      *      * */     public void release() {         try {             connectionUtils.getThreadConnection().close();             connectionUtils.CloseTranaction();         } catch (SQLException e) {             e.printStackTrace();         }     } }

同时再daoImpl的数据库语句中必须加入:
connectionUtils.getThreadConnection()

return runner.query(connectionUtils.getThreadConnection(),"select * from mybatisacount", new BeanListHandler<AcountBean>(AcountBean.class));
再xml配置文件中去掉


        <!--注入数据源-->
<!-- 这个1语句:<constructor-arg name="ds" ref="dataSource"></constructor-arg>-->
<!-- 如果想线程和连接绑定,则需要再daoImpl里面的sql语句前面添加connectionUtils.getThreadConnection(),

return runner.query(connectionUtils.getThreadConnection(),"select * from mybatisacount"
, new BeanListHandler<AcountBean>(AcountBean.class));

而且要注掉这个1语句:<constructor-arg name="ds" ref="dataSource"></constructor-arg>
这个语句不注掉,就会创建多个连接,使事务不能使用


-->

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

这篇文章最后更新于2020-2-21,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
三大配置数据源出c3p0,dbcp,spring内置数据源配置办法
« 上一篇
基于子类的动态代理
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
Array

日历

热门文章