首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-20 
james邮件服务接收邮件慢的问题之解决方案公司邮件系统采用了james作为邮件服务,并使用ORACLE作为邮件存储

james邮件服务接收邮件慢的问题之解决方案
   公司邮件系统采用了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的人有些帮助。 1 楼 chinaJ10 2011-11-27   楼主牛鼻,james代码这么熟练,我现在想在收到收件后,调用一段自己的逻辑解析邮件中的附件,不知道楼主有什么意见没有?我找不到代码在哪里 2 楼 hlinternet 2012-06-21   博主你好, 我也在学习和调试james邮件系统,
我用的是apache jame 3.0 beta 3 MySQL 5.5.21
我的客户端用的是squire 这个WEB 邮件客户端.
但是,总是会报 连接被 IMAP 服务器中断 由squire页面报出来.
在james中却看不到错误日志.
MYSQL 的各种超时设置,最大连接设置也没有问题.
james的dbcp连接池设置最大连接也跟MYSQL一样.
刚开始登陆几个用户收发邮件还可以, 但是,会不定时报IMAP错误.
等到IMAP错误多了后, 就无法登陆,用FOXMAI.OUTLOOK收发也无法登陆.
除非重启JAMES服务才能正常.
不知道能否在这方面指点一下.谢谢!
如能看到, 方便的话能否通过网站给我留言.

热点排行