Jboss使用中遇到的一些问题

03-10-29 robotowen
在用Jboss3.2.2开发系统时遇到了一些问题:

1. 开发环境:MS SQLSERVER 2K , Jboss3.2.2 ,CMP2.0,JSQLConnection

2. 问题描述:在数据库中没有任何记录的时候,CMP进行Create、Set、Get等等操作时都很正常,用SQL SERVER的“事件探查器”跟踪发现数据库CPU的占用率不到2;然而当数据库中的记录操过十万级以后在Create、Set、Get时数据库CPU的占用膨胀到2000左右,同时发现在Create的时候JBOSS会在每条INSERT的前面加上一条相对应的SELECT COUNT(*)在执行SELECT的时候数据库的CPU占用就非常的高,执行INSERT的时候基本不会占用CPU资源;在对JBOSS配置文件进行修改以后(no-select-before-insert)Create方法有所改进,但是在数据库执行Select的时候仍然狂占CPU。

3. 解决方法:通过看了JBOSS的源码以后发现,JBOSS在执行CMP的SQL的时候用的都是PrepareStatement;我就尝试着把CMP的代码用JDBC直接访问数据库重写,在执行SQL语句的时候都用Statement来实现。在对数据库进行跟踪以后发现CPU占用急剧下降。

不知道别人有没有遇到同样的现象?

banq
2003-10-29 11:26
你可能没有研究J2EE的DAO模式,所以走了一段弯路。

J2EE的DAO模式是指Select之类的读操作不使用CMP,而是直接使用JDBC访问数据库。通过session bean + DAO +JDBC查询数据库。

CMP使用有前提的,不能疯狂使用它,否则内存很容易耗尽,性能下降。

使用PrepareStatement应该比Statement速度快。

robotowen
2003-10-29 11:51
其实DAO模式我们也有用到,在我最后把系统修改的时候就用的是DAO模式。还有关于PrepareStatement和Statement哪个速度更快的问题我觉得也要具体问题具体分析。PrepareStatement速度快主要也是体现在应用服务器比Statement快些,毕竟PrepareStatement在JVM中有预编译。但是如果要说SQL语言的执行效率来讲PrepareStatement和Statement就有着很大的差别我们可以关注一下数据库服务器的CPU占用量,特别是在对数据库进行Update和Select操作时特别的明显。

banq
2003-10-29 12:09
有道理,那你有没有关于PrepareStatement和Statement在什么样情况下使用的经验可供分享?

你那个用EJB+DAO的金山财霸很不错。

robotowen
2003-10-29 12:20
在没有出这次问题的时候我也一直以为PrepareStatement比Statement要快一些。

具体在什么时候用PrepareStatement和Statement我也暂时还没有特别多的经验。个人认为在方法中如果在循环中或在一个方法的生命周期内需要多次进行数据库操作就最好用PrepareStatement,而且在做Insert操作时PrepareStatement和Statement对数据库服务器的影响效果是相同的。当对数据量特别大的表进行操作的时候建议最好不用PrepareStatement。

猜你喜欢
2Go 1 2 下一页