|
楼主 |
发表于 2009-3-13 10:49:20
|
显示全部楼层
Godaddy的Tomcat攻略(包含Spring框架),内含详细的使用心得
Godaddy提供JSP空间,价格比国内的便宜很多,而参数却好得多。
例如,它的Deluxe方案,150G空间,1500G流量,25个Mysql数据库,无限数据库大小。国内的JSP空间最大的通病是数据库太小。50M的数据库基本上存不了多少东西。
类似的服务还有Lunarpages等,Eatj提供免费试用的JSP空间,空间里的Tomcat是独立的,你可以控制Tomcat的重启。
一般的共享型虚拟主机是不分配独立Tomcat的,因为这样浪费了太多的内存。我在Eatj上试了一下我的应用程序,在免费空间上运行得很好,但网上的统计数据显示我用了68MB的存储器空间,随着网站的运行,估计内存还会持续增长,但Eatj的参数里限制了内存使用为64MB。
Godaddy的一些特性:Tomcat的版本是5.0.27,Mysql可选5.0或4.X的版本,Apache的版本是1.3.3,Apache缓存了所有的.htm文件,.htm类型文件不经过Tomcat处理就直接返回给了客户。
最好开发的时候,搭建和此一样的环境,Tomcat5.0.27必须在Tomcat项目的源码库里才下载得到。
Tomcat每天重启一次,时间是美国时间凌晨1点,也就是中国的16点(夏令时的时候是17点),但实际上,我观察到的改变是在18点-19点之后。正因为如此,class文件的改变只能在每天重启后生效,但JSP文件却能立即生效。这意味着你每天只能调试一次。
Godaddy不允许往服务器上写文件,虽然文件系统根目录下的/tmp可以写,但读出时仍然可能出错,看似服务器缓存了文件,不能即时反应文件的改变。总之不要利用文件系统做任何事情,以数据库代替。
数据库连接的时候加上useunicode,characterset=utf-8,因为如果不这样的话,Blob型字段读写会出错。因为数据库与应用之间传送Blob型二进制数据时,把某些字节进行了反斜线+字符的转码。
开发框架可以用,但要谨慎,这种共享型主机一般都对内存限制,象Spring这种耗内存的框架不要用。看看Spring所依赖的庞大类库就够吓人的。而实际上,Spring对WEB开发的作用不大。Spring建议用singelton的方式产生所有类的实例,而JSP容器出于节省内存的目的,更希望你的类是在"request"作用域,好让它用完了就回收。我的网站没有使用Spring,但设计的时候由于IoC技术的煽动,使用了同样支持IoC的JSF技术,但实际上,我现在想把JSF都去掉,直接用JSP实现。JSF看起来不够稳定,因为JSF在每个带form的页面请求送到服务器时,都尝试恢复缓存在服务器上的一个UIROOT,但http协议本身是没有状态的,非要做到有状态是会有问题的。而且JSF基本不支持url后带参数,常常会有很多麻烦,但这是web开发的基本需求。而且jsf的致命弱点是:你几乎不可能对jsf的页面进行美化。jsf的ui控件的编写需要太专业的知识。
我的网站用了hibernate,但我同样比较后悔。千万不要迷信hibernate的面向对象的诱惑,在高速数据处理领域,面向对象只是累缀。说到面向对象,当然得使用hibernate里的多对一、一对多、多对多关系,但实际上,实际使用中几乎不可能用到它。因为它的速度实在是太慢了。举个例子 ,学生对象实例里有个老师类的集合,而老师对象会包含老师的多方面的信息。页面上本只要显示一下老师们的姓名就行了,但通过学生取得老师,hibernate在后台做的却是把老师的所有信息都取出来了。这个例子可能不很明显,如果实际做网站,你就会发现,hibernate的关系什么用都没有,使用它只能是慢如蜗牛。hibernate比原生jdbc还是有较大简化,如果使用hibernate,我建议不要建任何关系。我觉得iBatis是个很好的替代品,但我没有亲自尝试。
用hibernate时常会出现cannot open connection的情况,可能是由于后台数据库太繁忙引起的,我没有找到根本的原因,但我用一种替代方式解决了这个问题,那就是catch org.hibernate.jdbcException,如果捕获到了,我把session关掉,再索取一个,然后重新执行我的逻辑。尝试次数为4,超过4次,我就不尝试了。
我在程序中不关闭sesssion,做了一个filter,在响应发送到用户之前关闭hibernate session。我做了个listener,负载hibernatesessionfactory的创建。因为我发现,如果不在此创建,而是在首次调用单例的HibernateSessionFactory时,创建sessionFactory是不成功的,我不知道是为什么。还有,我的hibernate代码里,不能使用session.load()方法,延迟加载看来是无效的。
开发框架的诸多问题,是不是让你很迷茫呢?这方面的书是如此之多!但实际上,有经验的熟手会告诉你一些真相,真正工业级的应用是不使用这些开发框架的,越是简洁的实现,越能体现速度,也越容易调试。诸多开发框架陡峭的学习曲线,使得你的调试过程是很漫长的。
似乎只有struts1.x被广泛应用,是事实上的标准。但我没有用过,没有发言权,只是给你一个建议。
有时,我们会发现,Tomcat返回的是一个空白页面,出错信息不见了,这是因为我们的filter里捕捉了异常,私自处理掉了,没有上抛给Tomcat,导致Tomcat并不知道发生了异常,改正方法就是不捕捉异常。需要finally的话,直接用try finally配对。
立即订购Godaddy主机:www.godaddy.com |
|