【官网带小程序源码】【dia源码】【njw源码】selectlist源码

2024-11-18 23:02:13 来源:spark最佳实践 源码 分类:焦点

1.如何实现mybatis的sqlsessiontemplate

selectlist源码

如何实现mybatis的sqlsessiontemplate

       SqlSession sqlSession = null;

       try {

        sqlSession = sqlSessionFactory.openSession();

        //namespace+id

        sqlSession.insert("cn.jarjar.dao.BlogMapper.insertBlog",源码官网带小程序源码 blog);

        sqlSession.commit(true)

       } catch (Exception e) {

        e.printStackTrace();

        sqlSession.rollback(true);

       } finally {

        sqlSession.close();

       }

       ä¹Ÿå°±æ˜¯è¦åƒåŽŸå§‹çš„java.sql.Connection对象一样,必须按照:新建连接->执行SQL->提交(查询不需要)->如果操作数据存在异常需要回滚->释放数据库连接。注意第一点和最后一点,每个SqlSession新建之后必须释放,不然会造成数据库连接泄露的危险。也就是意味着SqlSession是个有状态的对象,是无法进行复用的,所以只能局限于request或者方法的范围,也就是所谓的线程不安全。

       çŽ°è±¡2:如果使用spring集成mybatis,官方提供了整和包mybatis-spring.jar,如果完成配置之后,使用方式及其简单,简单示例如下:

       //注入spring中配置的SqlSessionTemplate对象,单例

       @Resource(name="sqlSessionTemplate")

       public SqlSessionTemplate sqlSessionTemplate;

       public void saveTestTrans(){

        this.sqlSessionTemplate.selectList("testdomain.selectAnySql", "select * from my_blog where id='1'");

       }

       è¿™é‡Œçš„SqlSessionTemplate不仅是单例的,而且不需要手工新建和关闭SqlSession

       é—®é¢˜1:

       é‚£ä¹ˆé—®é¢˜æ¥äº†ï¼Œä¸ºä»€ä¹ˆmybatis-spring.jar中的SqlSessionTemplate可以被多个dao复用,而且不会造成数据连接泄露呢,并且还可以自动新建和释放数据库连接?官方解答是因为SqlSessionTemplate是线程安全的,也就是确保每个线程使用的sqlSession的唯一并不互相冲突。

       é¦–先看了一下mybatis-spring的源码,发现SqlSessionTemplate是通过代理拦截和SqlSessionHolder实现的sqlsession线程安全和自动新建和释放连接的。看构造函数函数中构建代理类,该代理类实现SqlSession接口,定义了方法拦截器,如果调用代理类实例中实现SqlSession接口定义的方法,该调用则被导向SqlSessionInterceptor的invoke方法,这个方法中自动进行了SqlSession的自动请求和释放(如果不被spring托管则自己新建和释放sqlsession,如果被spring管理则使用SqlSessionHolder进行request和relase操作)

       ä»¥ä¸‹ç½‘址针对SqlSessionTemplate的线程安全特性进行了详细的探究:blogs.com/daxin/p/.html

       é—®é¢˜2:

       ç„¶åŽåˆæƒ³åˆ°è¿™æ ·ä¸€ä¸ªé—®é¢˜ï¼Œè™½ç„¶çŽ°åœ¨å‡ ä¹Žæ‰€æœ‰é¡¹ç›®éƒ½ä½¿ç”¨spring作为java程序的基本框架,如果我不使用spring管理mybatis,仅仅使用原始的mybatis,怎么样才能构建一个和SqlSessionTemplate相似的对象呢?

       é¦–先想到必须使用java的treadLocal构建一个sqlsession的对象,如ThreadLocal sqlSession = new ThreadLocal

       ()。

       ç»è¿‡æŸ¥æ‰¾ï¼Œå‘现mybatis自身就有这样一个类实现了类似的功能,类路径:org.apache.ibatis.session.SqlSessionManager,但是没有注释,可能存在mybatis-spring这种神器之后,mybatis放弃了对这个类的维护。

       è¯¥ç±»å®žçŽ°äº†SqlSessionFactory, SqlSession并且在其中定义了一个treadLocal的sqlssion对象,同时使用了代理拦截进行了sqlsession的自动管理,具体代码可以自己查阅,对于理解mybatis原理和java的代理机制很有帮助。

       é‚£ä¹ˆå†™ä¸ªç®€å•çš„程序验证一下SqlSessionManager是否真的可以保证线程安全和自动新建和释放sqlssion:TestSqlManager.java

       private static SqlSession sqlSession;

       public static SqlSession getSqlSessionTest(){

        if(sqlSession == null){

        //构建使用的SqlSessionFactory

        SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();

        sqlSession = SqlSessionManager.newInstance(sqlSessionFactory);

        }

        return sqlSession;

       }

       public static void main(String[] args) throws InterruptedException {

        Run run = new Run();

        List

        threads = new ArrayList

        ();

        for (int i = 0; i < ; i++) {

        Thread t = new Thread(run);

        threads.add(t);

        System.out.println("thread:{ "+t.getName()+"}, start");

        t.start();

        }

        for (Thread t : threads) {

        System.out.println("thread:{ "+t.getName()+"},join");

        t.join();

        }

       }

       æˆ‘本机装的mysql,通过监控语句:select SUBSTRING_INDEX(host,’:’,1) as ip , count(*) from information_schema.processlist group by ip;发现执行过程中存在连接并发的情况,但是执行之后全部释放掉了。

本文地址:http://8o.net.cn/html/95f163498270.html 欢迎转发