我想了一个问题针对我得系统,请大家提看法、

应为我们的系统95% 全部是读数据库中的内容。

原先做法是 :页面声明业务对象。然后调用他的内务处理结果。
性能:每一个浏览客户都要创建一个对象,然后浏览结果.


最近看了很多开元项目,于是想改进我的系统:


现在做法是:类中每一个方法:加上静态关键字 这样就不用声明类对象。
我想可以提高效率。所有用户共享一个方法。(应为都是读数据)。
最后关闭数据库,在关闭方法上加一个同步关键字。(可以避免,错误关闭数据库)

== 我不知道我得想法是否正确,请大家指教。

抛块砖头,不当之处请指正

看上去你所说的系统并不是很大规模
否则业务逻辑的处理放在jsp里不太合适

对于你所说的情况
缓存的确是非常合适的性能解决方案
而且因为只读,所以不用考虑由于改变数据而引起的数据不同步
所以最简单的就是写一个cache类,封装一个static HashMap,用来缓存读取出来的数据

另外,建立/关闭/再建立数据库连接的代价是很昂贵的,应该尽可能的减少这种操作。所以,连接池是必须的(当然大部分AppServer内置了连接池,前提是你使用jndi――这一点不敢肯定,我理解不透彻的说^_^)

不知道这么说是否能够切中问题的要害


我所说的这种方法能否可行?

连接池用了。。。

作一个缓存类,不太理解。。

大概想法如:
1。获取数据库资源。
2、把这些资源加入:HashMap hm=new HashMap() 中
3。页面读取 HashMap 获取楚剧输出。

问题:1。获取数据库资源,直接输出不是很快嘛。。?

JSP Smart 出了一款 SmartCache,利用的是 HTTP Status 304 来做的.
可以支持对文件和 DB 的 Cache. 我个人觉得用法比较麻烦~~ 不过如果你要做 Cache,也许它是一款不错的选择。

我的理解是否正确呢?

>
> 我所说的这种方法能否可行?
>
> 连接池用了。。。
>
> 作一个缓存类,不太理解。。
>
> 大概想法如:
> 1。获取数据库资源。
> 2、把这些资源加入:HashMap hm=new HashMap() 中
> 3。页面读取 HashMap 获取楚剧输出。
>
> 问题:1。获取数据库资源,直接输出不是很快嘛。。?
>


你这实际就是简单的连接池吧
没必要自己写了,有很多成熟的产品
而且大部分AppServer现在都内置了可配置的连接池的
而且,我觉得你这样会有很严重的问题
比如说
你建立了一个数据库连接,然后把它扔到HashMap里
在jsp中,取出数据库连接进行查询,查询完成后也不释放
是这样吧?

如果是这样的
那多个用户。即多个线程同时访问你的Context怎么办
WebApp一定要是多线程的

连接池是成熟产品。

哈希表当中只是数据库中获取的数据。并没有存在连接。连接在放入哈希表中时就已经关掉了。。。


我想以上面我说的那种方式去做,我想性能会有一定的提高。

首先如果全使用 static 的方式进行访问,这在一定程度上限制了编程的方式,有些变量就只有申明为 static 的,这带来扩展与维护的问题。因为有些变量是 static 的,也会带来不可预测的问题。

我始终认为代码不仅仅是写给自己用的,更多的时候是写给别人用的。很可能在某个时候,就会有程序员需要修改你的程序(也许这会是你自己),这时,你当初对代码的控制就会显得很重要。 不知道你是否能够体会。 我们写代码,有时是要定义很明确的接口与方法,别的程序员只能通过这些方法来访问系统,每个方法都有一段解释,解释该方法应该在什么样的情况下调用,怎么调用等。 如果这样的控制做得好,原有的系统设计就会保持得比较好,否则经过一两次修改,原有的系统将越来越难以维护。
==============================================================
[*] cache 实际上只是一块内存,使用 Hashtable 也好,使用 List 也好,又或者其它的数据结构,都无所谓,只要能很好的描述与保存业务数据就行。
[*] 连接池只是用来缓存数据库链接的,它并不能缓存数据。
[*] PoolMan 是很有名的数据库连接池实现,在 Poolman 里有实现数据的 cache. 它的原理就是对每个 select 语句的结果进行缓存,只要 select 语句一样,返回的结果集 ResultSet 就一样。因为 PoolMan 自己实现了 JDBC API, 所以,它可以很方便地做到这一点。这只是在 JDBC 驱动一层做 cache 的应用,你也可以在应用不同层次上按需求做 cache. 只要懂清楚 cache 就是牺牲内存换取数据。它只是一块内存而已。