Spring事务的性能问题

每次调用service方法的时候,DataSourceTransactionManager都会首先调用DataSourceUtils的getConnection方法,从而调用dataSource.getConnection(),耗时很严重。

因为service中有cache,先从cache中取,如果取到,则直接返回,如果取不到,则查询数据库,放到cache中,再返回。 大部分的情况是不需要读取数据库的,可spring每次都会获得一个数据库连接。
[b]问题补充:[/b]
不是浪费的问题,而是获得连接这个动作很耗时。在性能测试的时候,占了很大比例。
[b]问题补充:[/b]
这个问题是这几天才发现的,以前并不知道,代码都是这么写的。

service对外提供一个接口,具体实现要不要用cache是实现的问题。而如果按照你说的方法,我的接口中就需要实现两个方法,一个不使用事务,一个使用,暴露两个方法接口,好像不大好啊
[b]问题补充:[/b]
你不写我也知道你的意思。
但还是有我说得问题,本来我只需要提供一个public Object service();可改完之后就还要提供一个 public class DBOperatorService public void service(...)。而这个实际上也是对外暴露的,而又不允许别人调用(虽然有办法解决)。总觉得不太好。

我们在实际的应用中也是对那些单条的查询语句不加事务的, 只对数据库saveOrUpdate时抽出一个功能集中的service层!哈哈!

[size=medium]spring每次都会获得一个数据库连接
没问题的
connection是在池中的,用起来不是很浪费的[/size]

我更觉得这是一个设计上的问题, [quote]因为service中有cache,先从cache中取,如果取到,则直接返回,如果取不到,则查询数据库,放到cache中,再返回。 大部分的情况是不需要读取数据库的,可spring每次都会获得一个数据库连接。[/quote]我觉得你完全可以在要使用数据库的时候在去打开数据库连接啊!也就是说, cache中找不到时, 你在去调用由spring管理的数据层!

哈哈, 是啊!你提到"性能测试"我就知道你们代码写的差不多了!不过我的意思不是叫你暴露两个方法接口, 而是缩小事务范围, 怎么讲呢!你们现在看起来可能是这个样子:
[code="java"]@Transaction
public Object service(){

/**************Cache操作 ************/
Cache cache = getFromCache(...);
........
/*************************************/

/**************数据库操作 ************/
userDao.findById();
saveOrUpdate(...)
........
/*************************************/

}[/code]
那么缩小事务范围之后看起来就是这个样子:
[code="java"]private DBOperatorService dbService;

public Object service(){

/**************Cache操作 ************/
Cache cache = getFromCache(...);
........
/*************************************/

dbService.service(...); 

}[/code]
里面的DBOperatorService就是交由spring管理的service层:
[code="java"]@Transaction
public class DBOperatorService{

public void service(...){

    /**************数据库操作 ************/
    userDao.findById();
    saveOrUpdate(...)
    ........
    /*************************************/

}

}[/code].
这样的话, 只有在用到数据库的时候才会去开启事务, 也不需要你暴露两个方法接口, 只是重构出了一个功能更集中的service层.

我想你的cache里面放的大部分都是做查询数据库时得到的结果(猜的不对莫怪, 哈哈),robbin曾经有一篇关于<只读查询是否需要启动事务管理,兼论只读事务>的讨论, 地址:
[url]http://www.iteye.com/topic/8850 [/url],
也许你可以参考一下, 给只有查询的那些service方法不加事务, lz可以测试一下.说不定对lz有所帮助.