james邮件服务接收邮件慢的问题之解决方案

[size=large] 公司邮件系统采用了james作为邮件服务,并使用ORACLE作为邮件存储数据库,平时都能正常收发,但是发现收邮件很慢,发邮件速度挺快的。网上也有很多人提出比较慢,但是一直没有人提出解决方案。
昨天,我用foxmail收邮件,无意中看到收邮件的时候停顿在STAT指令阶段,于是就想:是否STAT指令有效率问题。于是CMD之后TELNET 到邮件服务器的110端口,通过指令来接受邮件,发现执行STAT的时候非常慢。STAT执行后执行LIST速度很快。这样,基本确定是STAT指令的问题。打开JAMES的源码,看看POP3HANDLER这个类,STAT中在执行邮件的统计功能,计算邮件个数和邮件总大小,看了代码,唯一可能慢的就是循环计算每个邮件的大小的时候。前后加上时间戳,编译,打包,重启JAMES后,看打出来的时间戳,发现每次取数据库连接都需要100毫秒左右。这个速度够慢的。
于是再看看数据库的配置,已经连接方式。发现JAMES默认使用的是DBCP的basicDataSource,而basicDataSource的连接并不是连接池的方式,需要每次都去获取连接。于是,基本肯定是这里造成的慢。知道问题了,解决就简单了。JAMES的config里面有说明,有2中连接方式,一个是DBCP,还有一个是Mordred。
上面有写注释:
To use DBCP: org.apache.james.util.dbcp.JdbcDataSource
To use Mordred: org.apache.james.util.mordred.JdbcDataSource
-----------
虽然Mordred不被建议使用,但是看看org.apache.james.util.mordred.JdbcDataSource
的源码,可以看到,他自己实现了一个连接池。应该是可用的,于是CONFIG里data-source的class节点换成org.apache.james.util.mordred.JdbcDataSource
,重启james。再试,虽然还是没163的MAIL那么快,但是已经比刚才快了很多。那就先用这个吧。
其实,解决方案还有很多,比如:
1:自己实现一个datasource,自己实现一个连接池。
2:在使用连接池的基础上,在邮件存储的时候就把size计算出来,单独存放到一个字段。这样获取size的时候,直接读取该字段即可,这样速度应该是要快更多。
由于比较忙,所以暂时使用了修改datasourc的clsss的解决方案。
希望这篇文章对使用james的人有些帮助。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值