2007-02-25

在Linux下,tomcat的默认系统输出为catalina.out,当应用中有大量的日志打出逻辑的时候,这个文件在系统运行一段时间以后会变得很大,而且不仅仅耗去硬盘空间,还会耗去不少内存。解决的办法有:

  1. 写个cron脚本来定时的处理这个文件
  2. 使用log4作为tomcat的默认输出,参考这里
  3. 修改server.xml配置文件中的Context的swallowOutput为true

这三种方式基本上都可以解决这个问题。

Tags: ,.
2007-02-09

在实际的开发过程中,很多时候都要用到base64编码,通过base64编码,可以对明文进行加密,转换成不可读的文本,能够在一定程度上防止信 息被他人阅读,所以一开始base64主要应用于邮件系统中。base64还有一个有趣的用法,就是编码二进制文件成ascii文本,比如要想通过xml 来传递二进制文件,就可以先用base64编码该文件,通过xml传递到接收端,接收端再decode成本来的二进制文件,因为base64算法效率相对 较高,所以这种方式成了传递二进制流的不错方式。

在标准的JDK API中还不带base64实现,如果你用的是sun的官方jdk,里面有两个类:sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder 实现了base64算法。推荐用apache commons codec,这个包实现了一些常见的编解码算法如md5、sha。其中base64编码的实现类为org.apache.commons.codec.binary.Base64,具体应用见它的文档。

Tags: .
2007-01-26

Sun在12月份发布了JDK1.6,以下是Sun的Java开发人员列举的Java SE 6的10大主要特性,如果需要用到里面的一些新特性,赶紧升级你的JDK版本吧。

  1. Web Services:包含了一个Web Services客户端实现JAX-WS,同时如加入了JAXB实现和Stax实现,使开发SOA程序更加容易。
  2. 脚 本:支持在Java代码中混入Javascript脚本,Java 6提供了一个标准接口,理论上支持所有脚本语言。在Java中使用脚本语言的一个好处是更容易让用户来扩展和定制程序,尤其是一些需要经常更改业务逻辑 的程序,如终端用户可以通过在表单中输入新的业务规则脚本来改变程序的逻辑。
  3. 数据库:内置了Apache Derby数据库,这对于开发桌面应用程序来说是个不错的功能,不用用户再额外安装其它外置数据库了,同时加入了JDBC4.0的一些新功能。
  4. 新的桌面APIs:加入了一些新的APIs,如Swingworker、GroupLayout 。
  5. 监控和管理:添加更多的诊断信息,绑定了不是很知名的 memory-heap 分析工具Jhat 来查看内核导出。
  6. 编译器访问: compiler API提供编程访问javac,可以实现进程内编译,动态产生Java代码。
  7. Pluggable Annotations:Java tool和framework 提供商可以定义自己的 annotations ,并且内核支持自定义annotation的插件和执行处理器
  8. 桌 面发布:Swing拥有更好的 look-and-feel , LCD 文本呈现, 整体GUI性能的提升。Java应用程序可以和本地平台更好的集成,例如访问平台的系统托盘和开始菜单。Mustang将Java插件技术和Java Web Start引擎统一了起来。
  9. 安全性:支持XML数字签名,整合了PKI、Java GSS、Kerberos、和LDAP。
  10. 性能和质量:号称性能至少提高15%以上,在稳定性和兼容性上到先在为止还没发现什么问题。
Tags: .

UUID又称为通用唯一标识符,是一个128位长的数字,一般用16进制表示,算法的核心思想是结合机器的网卡、当前时间和一个随机数来生成 UUID。UUID的应用非常广泛,比如Hibernate中ID Generator中的一种实现就是UUID。在系统中需要用到随机数的地方都可以考虑采用UUID算法。

在Java1.5中,已经包含了一个UUID的实现java.util.UUID。要随机生成一个UUID,只要用两行代码就可以了:String uuid = UUID.randonUUID().toString();

如果是jdk1.5以下版本,可以采用一个开源实现:http://jug.safehaus.org/ 或者用jakarta commons下的http://jakarta.apache.org/commons/sandbox/id/

如果系统中采用了Hibernate框架,也可以用Hibernate的UUIDHexGenerator。如:String uuid = (String) new UUIDHexGenerator().generate(null, null);

Tags: .
2007-01-24

在应用Ajax技术的过程中,往往面临一个选择,即前后台应该传递什么数据,可以有以下几种选择:HTML代码、JSON对象、 javascript代码、XML数据。在具体的项目中,如何来选择传递什么类型的数据,是架构师必须确认和统一的。从BlogMethods的开发过程 中总结了一些经验,加上自己的一些理解,简单谈谈这几种类型分别适合在什么情况下适用。

1.HTML代码:如果只是需要从服务器端取出内 容,然后显示在客户端,比如局部刷新页面上的一块内容,则可以直接在服务器端生成HTML代码,然后直接传递到客户端,通过innerHTML属性来显 示。毕竟在服务器端可以通过模板技术很轻松的生成HTML代码,而如果在客户端用javascript来动态组装一段HTML代码还是略显麻烦的。

2.JSON 对象:如果你需要在客户端缓存一些数据结构,比如在客户端上下文中,你需要缓存User对象,标签列表对象等等,则可以按照一定的数据结构在服务器端动态 生成JSON对象,然后传到客户端,通过js代码保存到一个全局对象中,比如 window.client.user,window.client.tags等,这样这两个对象会缓存在浏览器中,你可以随时通过js代码访问和操作这 两个变量。对于一些需要经常用到的对象,可以通过这种方式一次取出来,而不用每次用到的时候再取一次。

3.javascript代码:很多 时候,如你要取出一个很大的List对象,然后在客户端轮训使用,这个时候如果你在服务器端先生成JSON对象,然后返回到客户端,你可能需要在服务器端 和客户端要分别轮训两次,在服务器端轮训生成JSON对象,然后再到客户端轮训JSON对象列表来执行一些逻辑,当列表过大的时候,往往会比较耗性能,这 个时候,其实可以在服务器端把客户端要执行的javascript代码都生成,然后到客户端调用eval函数即可,这样可以省去客户端的轮训。

4.XML 数据:xml作为全能的数据封装格式,可以封装各种数据,在服务器端把数据封装成xml格式,然后到客户端按照一定数据标准在把xml转换成html或者 json对象。采用xml数据格式的好处是数据格式统一,尤其是对SOA架构的程序来说,只要定义了XML格式标准,第三方程序可以很方便的与该应用交 互,不管是Ajax程序还是其它程序,同时也便于系统的扩展。当然这样带来的问题是服务器端需要花成本来生成xml格式的文本,同时客户端又要花成本来解 析xml,在开发量上和性能上有一定的损耗。一般适合于做外部访问的接口。

5.混合类型的数据:BlogMethods大量采用了这种方 式,因为往往一次request的时候需要更新客户端的一部分对象,同时又需要从服务器端取出一部分HTML代码来刷新部分页面,这个时候以上4种类型都 有一定的局限性,BlogMethods采用的方式是同时返回多类型的数据,每个类型的数据之间用一些特定的字符隔开,比如同时传递javascript 代码和html代码,先在服务器端用模板技术动态生成要返回的内容,然后传到客户端,用javascript代码分别split出两份代码,用eval执 行javascript代码,同时把html代码附到要更新元素的innerHTML属性上。这种模式效率极高,也相当灵活,推荐使用,但不要滥用。

Tags: ,.

Ajax技术的优势或者优点这两年已经众人皆知,开发人员纷纷在各自的项目中应用Ajax技术,BlogMethods的后台也架构在Ajax技术之上,这里谈谈在开发过程中遇到的Ajax的一些问题以及这项技术的局限性。

首 先,采用Ajax技术以后,开发量大大增加,因为要考虑到兼容各类主流浏览器,往往一段js代码在IE下有效,放到firefox下就不行,同时CSS style在ie下和firefox下也有一些不同之处,加上javascript的灵活性和没有好的调试器,导致了工作量大大增加。

第二 点,由于需要大量的javascript代码,在第一次加载系统的时候,往往由于js文件过大,加上第一次加载需要load好几个文件,导致进入系统的时 间往往比传统web页面慢。当然可以通过在客户端cache js文件来解决部分问题,但是在进入系统的时候往往需要初始化很多数据到客户端,这个问题在带宽有限的情况下会显得很突出,比如最近由于海底电缆的问题, 访问GMail往往会提示访问不成功,但用传统HTML视图勉强可以使用,暴露的就是这个问题。

第三点,客户端耗内存,因为要在客户端保留 大量的数据,会导致浏览器占用的内存过大,如果你的js代码存在内存泄露的问题,随着使用时间的推移,可能会耗去客户端所有的内存。这里有一个如何折中的 问题,哪些数据没必要保存在客户端,哪些数据适合保存在客户端,根据应用的不同情况而定。

第四点,比起C/S架构程序的用户体验,Ajax 技术还是远远落后,标准的Ajax技术不支持流媒体如视频和声音,协议也局限于http协议,比如要实现一个IM聊天程序,视频和语音如果不外加 ActiveX或者Flash控件,是不可能实现的,所有消息也必须通过服务器中转,而不能实现真正意义上的P2P。

Tags: .
2007-01-17

在Linux下,MySQL的数据库名和表名是大小写敏感的,也就是说如果你建了一个数据库如BlogMethods,在其下有一张表为 BM_BLOG,你执行SQL:select * from blogmethods.bm_blog是会提示“找不到表”的。而在windows下,所有的数据库和表名都会是小写,即使你一开始建表的时候用的 SQL中是大写,到系统中也会变成小写,而且不管你执行select * from blogmethods.bm_blog还是select* from BLOGMETHODS.BM_BLOG都是可以的。

所以为了保准脚本可以跨平台,最好把数据库名和表名都统一改成大写或者小写,然后在写SQL的时候也统一有一个规定。

参考:

http://my.opera.com/relogout/blog/2006/10/18/linux-mysql

http://java.learndiary.com/diaries/2508.jsp

Tags: .
2007-01-02

如果你有这些平台上的开发经验,你应该已经知道如何选择,如果你只是做过Java开发或者PHP开发,在技术社区疯狂追捧RoR的浪潮中,在是否应该选择RoR上还犹豫不决,下面这段文字或许对你有所帮助。

你 的工作是编写高质量的、美观的web应用。你必须在明天之前把它开发出来,同时又必须在未来几年中维护和扩展它。你可以选择Java,基于J2EE的解决 方案通常有着良好的结构,但编写Java程序的工作量之大是令人生畏的。你也可以选择PHP之类的脚本语言,这样你可以快速的写出代码,但又得担心如何在 未来的几个月乃至几年中维护和扩展这些代码。

Ruby on Rails很可能正是你在寻觅的中庸之道。

Rails是一个完备的MVC web框架,它可以帮助你开发出结构严谨的应用程序,而又不会给你带来沉重的时间压力。你只须专注于应用的功能,Rails会帮助你搞定技术细节的问题。而且,由于采用Ruby编程,你将可以充分享受这个世界上最具动态性的语言的挥洒自如。

注:摘自《Agile Web Development with Rails》

Tags: .
2006-12-20

同XML一样,properties是Java中用的很普遍的一种文件类型,对于持久化简单的信息,如配置信息,或者local messages等等,都非常有用处,可以通过java.util.Properties来很容易的进行读写操作。

但 是properties只支持ascii编码,如果你在properties中用输入了中文,比如用properties来实现国际化,那么最终在程序中 读到的值会是乱码。对于properties中的中文,首先需要转换成ascii编码,通过jdk自带的native2ascii命令即可实现转换。如果 不想用命令行的方式,你可以下载Properties Editor,有独立的基于java webstart的版本,还有基于JBuilder和Eclipse插件形式的版本,看你自己喜欢。通过这些工具把properties中的中文或者其它非ascii编码文字转换成ascii编码,乱码的问题也就解决了。

Tags: ,.
2006-11-24

Tomcat性能优化根据不同的环境和条件,须分别对待,如服务器硬件环境,操作系统环境,网络环境,以及用户使用的情况等等,最好结合性能测试工具来做。以下列出几点常用的调优方法:

  1. 调 整Java参数,如果用的是Sun的Hotspot VM,可以Java命令加上参数”-server -Xms -Xmx”,-server表示启用Java HotSpot Server VM,-Xms和-Xmx分别表示JVM初始内存大小和可以使用的最大内存,根据具体情况和需要调大这两个参数的值,默认值分别为2m和64m,显然太小 需要调大。在Tomcat/bin下的catalina.bat(for windows)和catalina.sh(for linux and unix)文件的最前面加上JAVA_OPTS=`-server -Xms256m -Xmx512m`。
  2. 禁用DNS查询,设置connector中的enableLookups=”false”,该参数的具体说明见Tomcat文档。设置如下:
    • <Connector port=”8080″ maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ debug=”0″ connectionTimeout=”20000″ disableUploadTimeout=”true” />
    • <Connector port=”8009″ enableLookups=”false” redirectPort=”8443″ debug=”0″ protocol=”AJP/1.3″ />
  3. 调整Tomcat线程参数:
    • maxThreads,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
    • acceptCount,指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
    • connnectionTimeout,网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。可设置为20000毫秒。
    • minSpareThreads,Tomcat初始化时创建的线程数。
    • maxSpareThreads,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
  4. 这些参数需要根据实际情况调整。

附:几篇Tomcat相关的性能测试报告

相关链接:

Tags: ,.