Spring下如何不启用事务(Transactional)直接访问数据库?

商吉婆尼 2015-08-22 10:18:02

问一个 Transcational 事务 的问题。
下面几组代码,分别是 Service代码、Controller代码、控制台打印数据:


public Object test() {
// this.sessionFactory.openSession();
// this.debugLogger.debug("start test");
// Long x = this.queryScalar("select count(*) from QnzsMessage");
// this.debugLogger.debug("finish test");
return 0;
}

@Transactional(propagation = Propagation.NEVER)
public Object test1() {
return 1;
}


@RequestMapping(method = RequestMethod.POST, value = "test")
public @ResponseBody
ResponseVo test() {
this.debugLogger.debug("start test_0");
Object value = this.qnzsMessageService.test();
this.debugLogger.debug("finish test_0");
this.debugLogger.debug("start test_1");
value = this.qnzsMessageService.test1();
this.debugLogger.debug("finish test_1");
return ResponseVo.status(ResponseVoConstant.OK).value(value);
}


2015-08-22 21:55:27:167[DEBUG]: start test_0
2015-08-22 21:55:27:189[DEBUG]: finish test_0
2015-08-22 21:55:27:189[DEBUG]: start test_1
2015-08-22 21:55:27:189[DEBUG]: finish test_1
2015-08-22 21:55:27:329[DEBUG]: start test_0
2015-08-22 21:55:27:349[DEBUG]: finish test_0
2015-08-22 21:55:27:349[DEBUG]: start test_1
2015-08-22 21:55:27:349[DEBUG]: finish test_1
2015-08-22 21:55:27:474[DEBUG]: start test_0
2015-08-22 21:55:27:494[DEBUG]: finish test_0
2015-08-22 21:55:27:494[DEBUG]: start test_1
2015-08-22 21:55:27:494[DEBUG]: finish test_1


注释:Service类上打了 Transactional 注解,从而每个方法默认开启事物。

从控制台时间消耗看出:
在不连接数据库的情况下,Transcational(progration = NEVER) 注解下的方法耗时 0ms,注解下 耗时 15ms+

很明显,15ms不合理,我怀疑是事务的“提交”操作耗时。

而在一些仅查询的操作中,我也不希望事务“提交”。

但是现在,我不开启事务的话,没法连数据库:总是报No Session found in current Thread.

那么现在我想问的问题就是:
1、开启事务,是否查询类数据库访问也会额外消耗“提交事务”的时间?我觉得是的;
2、如果1是真的,如何配置、注解,使 查询类操作 不启用 事务?
...全文
1255 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gone记录 2019-03-12
  • 打赏
  • 举报
回复
方法上加注解@Transactional(propagation= Propagation.NOT_SUPPORTED)
商吉婆尼 2015-09-15
  • 打赏
  • 举报
回复
自己结贴。 同事帮忙写的:

  <!-- 用来将SQLSession放置到线程上 -->
  <filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
      <param-name>sessionFactoryBeanName</param-name>
      <param-value>sessionFactory</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
scmod 2015-08-23
  • 打赏
  • 举报
回复
查询上面不是不加@注解就行了? 或者progration 有个READONLY的我记得...查询专用好像也是不开启的意思
  • 打赏
  • 举报
回复
事务的话不要直接加在service类上面,建议分方法写,比如保存和修改、删除这种必须加上,查询的方法就没必要加了
商吉婆尼 2015-08-23
  • 打赏
  • 举报
回复
引用 2 楼 scmod 的回复:
查询上面不是不加@注解就行了? 或者progration 有个READONLY的我记得...查询专用好像也是不开启的意思
不是我想加,是我不加就没法连数据库…… readonly 试了一下,好像不行。

  public Object test() {
    return 0;
  }

  @Transactional(readOnly = true)
  public Object test1() {
    return 1;
  }

  @Transactional(propagation = Propagation.NEVER)
  public Object test2() {
    return this.queryScalar("select count(*) from QnzsMessage");
  }

2015-08-23 15:42:11:183[DEBUG]: start test_0
2015-08-23 15:42:11:319[DEBUG]: finish test_0
2015-08-23 15:42:11:319[DEBUG]: start test_1
2015-08-23 15:42:11:334[DEBUG]: finish test_1
2015-08-23 15:42:11:334[DEBUG]: start test_2
2015-08-23 15:42:11:337[WARN]: LogInterceptor catched in null : HibernateException
商吉婆尼 2015-08-23
  • 打赏
  • 举报
回复
引用 1 楼 shijing266 的回复:
事务的话不要直接加在service类上面,建议分方法写,比如保存和修改、删除这种必须加上,查询的方法就没必要加了
嗯,我发现这个时间消耗之后是准备放在方法上写的。 但是我不加 Transcational 注解就没法连数据库。 我试一下楼下的 progration = READONLY

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧