解惑

解己之惑,解人之惑

分类:Java (第18页共20页)

Java技术

使用Spring的声明式事务管理带来的性能问题

做了一个简单的项目,使用到了spring和hibernate,但是有一个很奇怪的现象,就是运行很慢,从最简单的登陆开始就很慢,跟踪了一下,竟然花
了20多秒,然后把里面的一个update操作注释掉后就快了很多,一般不到一秒了,但是下一个操作也很慢了。最开始是怀疑更新数据库导致的缓存的性能问
题,但是后来去掉缓存问题依旧,然后继续跟踪,发现有个get操作也很慢,而get方法体内的操作实际也是很快的,也是不到一秒,怀疑是spring封装
的HibernateTemplate的问题,但是仔细一想不太可能,这个应该是有很多人用过了,而且以spring的技术能力应该不会有这种问题。突然
想到我的这些DAO方法都是配置了声明式事务的,而事务对性能的影响实际上是很大的,原来的配置如下:
        <property name=”transactionAttributes”>
            <props>
           
    <prop
key=”insert*”>PROPAGATION_REQUIRED</prop>
           
    <prop
key=”update*”>PROPAGATION_REQUIRED</prop>
           
    <prop
key=”delete*”>PROPAGATION_REQUIRED</prop>
           
    <prop
key=”get*”>PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>

回忆了一下,我的DAO里面有很多不符合这个方法命名的方法,例如登陆方法本身就是login,还有一些addXxx方法以及isXxx,修改了add方法统一为insert方法,然后修改了声明的内容为:
        <property name=”transactionAttributes”>
            <props>
           
    <prop
key=”insert*”>PROPAGATION_REQUIRED</prop>
           
    <prop
key=”update*”>PROPAGATION_REQUIRED</prop>
           
    <prop
key=”delete*”>PROPAGATION_REQUIRED</prop>
           
    <prop
key=”*”>PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>

这样修改后问题得到解决。
需要说一下的是,如果这个里面不配置事务,速度也非常的慢。

MSN的聊天记录备份有BUG

今天发现MSN的聊天记录备份有问题,我和一个朋友的聊天记录超过了2M,因此在关闭聊天对话框的时候提示我是删除记录还是保存记录,我选择保存,但是过
一会再聊,然后关闭又提示。原来好像是会把旧的记录改名,然后创建一个新的记录文件,难道是有了就不能工作了?这个BUG也太简单了吧,微软的强大的测试
队伍就是这样的?

Mysql5的编码问题

现在在用新的Mysql5,发现和原来的不太一样,这次我们使用的是UTF-8编码,配置好了编码转换的过滤器,页面的编码设置也正确,驱动也应该没有问
题,完全相同的配置,使用mysql4.0就没有问题,后来大致查了一下资料,发现mysql4.1以后的变化很大,数据库,表,字段都可以设置编码,修
改了一下缺省的编码,但是没有其效果。后来因为要增加一个表,就用mysqlfront直接加了一个,在创建表的时候要选择字符集,就选择了utf-8,
结果这个表中存放的中文没有问题,可以正常读写,然后把其它的表使用属性进行了修改,结果问题依旧,仔细一看原来是字段的编码还是latin1,后来修改
了建库脚本,全部的表都使用utf-8编码,字段不设置编码方式,问题解决。

使用commons-email发送邮件

项目要发送邮件,本来是想找原来的发送邮件的代码拿过来用的,突然记起来commons项目增加了一个commons-email发送邮件,决定用现成的,看了一下,果然很方便,直接贴出网站上的发送HTML邮件的例子:

// Create the email message
HtmlEmail email = new HtmlEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe-AT-somewhere-DOT-org", "John Doe");
email.setFrom("me-AT-apache-DOT-org", "Me");
email.setSubject("Test email with inline image");

// embed the image and get the content id
URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
String cid = email.embed(url, "Apache logo");

// set the html message
email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>");

// set the alternative message
email.setTextMsg("Your email client does not support HTML messages");

// send the email
email.send();

不需要解释了。发送邮件的时候还可以嵌图片,呵呵,喜欢。
这个例子里面没有涉及的有两个常用的方面:
登录验证和邮件的编码格式,其实也很简单,验证调用一下

email.setAuthentication("me", "password");
对于中文邮件,设置下编码就行了:
email.Charset("utf-8");或者
email.Charset("utf8");

感受到JDK5的自动装箱和拆箱的便利

虽然JDK5推出很长时间了,但是实际上一直没有开始用,最多也就是了解了下新的特性,感觉也没有什么太吸引我的,这段时间做个项目,用的就是JDK5,
昨天在用的时候把一个字段的类型从long型修改为了Long型,奇怪的是eclipse没有像通常那样报错,后来想想原来是用的JDK5,现在有自动装
箱和拆箱的功能了,确实省了一些事。但是最后为了兼容性还是将类型修改一致了。

Hibernate和Spring配合使用的一个问题

最近的一个项目使用Hibernate3和Spring,DAO都是继承自
org.springframework.orm.hibernate3.support.HibernateDaoSupport,提供了一个
BaseDAO,提供了常用的get,getAll,insert,delete以及update方法,其它的DAO都不用关心这些操作了,但是在使用的
时候有一个问题,就是有时候会出现Illegal attempt to associate a collection with two open sessions的异常,但是在取得对象后使用session.close()也不行,会出现另外的一个异常session is not open or is closed,后来上网查了以下,原来是我的update方法有问题,原来就是getHibernateTemplate().update(object),修改为getHibernateTemplate().merge(object)问题解决。

2005.11.23更新:
按照API文档:
merge(Object entity)

          Copy the state of the given object onto the persistent object
with the same identifier.

update(Object entity)

          Update the given persistent instance,
associating it with the current Hibernate Session.
问题的根源可能在于要更新的那个对象是有一个关联集合的。

Random类的一个使用误区

昨天和一个朋友聊天谈到他的面试经历,其中提到一个题目是用最熟悉的语言写一个程序产生15个10到100的整数,他特别提到他用Java写了一些循环并每次重新用
当前时间的long值做种子,当时我就很奇怪,但是他说Random有问题,每次产生的随机数都是一样的。回想了一下,他可能是遇到了我曾经遇到的那个问
题,在使用Random的时候要把产生的Ramdom实例保存起来,不能每次用的时候都重新new一个。具体代码如下:
范例代码如下:
public class RandomTest {
  private static Random random = new Random();

  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

典型的误用代码如下:
public class RandomTest {
  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      Random random = new Random();
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

2005.11.18更新:
对于这个里面的误用代码JDK1.5确实修正了,但是修正的方法是修改了new Random(),1.5以前实际上是

public Random()
Creates a new random number generator. Its seed is initialized to a value
based on the current time:

 public Random() { this(System.currentTimeMillis()); }

Two
Random objects created within the same millisecond will have the same sequence
of random numbers.

而在1.5中是:

public Random()
Creates a new random number generator. This constructor sets the seed
of the random number generator to a value very likely to be distinct
from any other invocation of this constructor.

所以实际上1.5中并没有彻底解决这个问题,根据同样是他的文档:
If two
instances of Random are created with the same seed, and the same
sequence of method calls is made for each, they will generate and
return identical sequences of numbers.
那么典型的误用代码就变成了:
public class RandomTest {
  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      Random random = new Random(100000);
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

扩展已有框架或者组件完成快速开发框架

个人感觉现在的各种java框架和组件已经非常的丰富,但是将他们融合起来进行快速开发还有一个问题:
配置过于麻烦。
无论是spring还是hibernate,都需要很多的配置,当然hibernate有工具可以生成,但是似乎没有太大的必要。前几天在和朋友谈这些框
架的时候他们对我的思路提出了置疑,并且认为我想做的其实和spring和hibernate的功能并没有大的差别,既然你感觉配置麻烦,那么你干脆研究
下,做一个扩展或者插件来使用你想像中的规则不是更好。一句话给了我很大的启示,这个应该是一个不错的方向。

另外一个不能让我满意的就是表现层,虽然有了JSF,但是没有强大的工具支持开发JSF并不容易,而tapestry由于学习曲线比较陡而无法普及,而且
在我看来也是有些麻烦的,而struts或者是webwork肯定是不能满足我的期望的。类似velocity或者freemarker这样的模板语言到
是可以好好的研究下,也进行一下扩展,应该和javabean可以直接绑定。

Textarea的一些问题

今天发现Textarea的一些细节的问题,如果在里面输入html标签是可以的,但是如果输入的是&nbsp;或者是;&quot;,
那么如果不进行处理,回来显示的时候就显示为空格和”了,不再是&nbsp;和;&quot;,但是如果输入<b>
test</b>这样的HTML标签则没有问题。
另外就是如果输入的时候前面或者后面输入几个换行,那么提交以后这些换行就被丢掉了。

值得一用的JBuilder2006

今天看到了JBuilder2006的对等协作功能的介绍,给我的感觉是很不错,目前项目都是合作开发,而小组内的成员的合作方式还不是很好,如果在开发工具中集成了协作功能,特别是和工程密切相关的内容的共享协作功能,那么应该算是一个巨大的进步,今天晚上下载下来用用看了。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑