2008年10月21日 #

java 数据库缓冲池 使用c3p0

c3p0很容易使用的开源专业级jdbc数据库缓冲池。
它是sourceforge上的一个开源项目,
项目在
http://sourceforge.net/projects/c3p0
他的众多特性这里就不一一介绍了。
比较爽的一点就是
当Connection归还缓冲池时,c3p0会很小心的关闭
这条连接打开的Statement和ResultSet,免去了使用时
自己动手小心翼翼的关闭。

c3p0使用非常简单,这里给一个例子

package common.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;


import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

public final class ConnectionManager {
 private static ConnectionManager instance;
 
 public ComboPooledDataSource ds;
 private static String c3p0Properties="c3p0.properties";
 
 private ConnectionManager() throws Exception {
  Properties p = new Properties();
  p.load(this.getClass().getResourceAsStream(c3p0Properties));
  ds = new ComboPooledDataSource();
 }
 
 public static final ConnectionManager getInstance() {
  if (instance == null) {
   try {
    instance = new ConnectionManager();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return instance;
 }
 
 public synchronized final Connection getConnection() {
  try {
   return ds.getConnection();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return null;
 }

 protected void finalize() throws Throwable {
  DataSources.destroy(ds); //关闭datasource
  super.finalize();
 }
 
}

然后在ConnectionManager类的目录下再创建一个配置文件c3p0.properties
内容如下:
#db login parameters
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost/test?useUnicode=no&characterEncoding=GBK
user=test
password=test

#pool parameters
initialPoolSize=2
maxPoolSize=5
#maxIdleTime=10
#idleConnectionTestPeriod=5
autoCommitOnClose=true

完整的配置文件参数参看c3p0的文档

使用connection时很简单
Connection conn = ConnectionManager.getInstance().getConnection();
...
最后 conn.close() 即可,

posted @ 2008-10-23 10:24 金家寶 阅读(4318) | 评论 (2)编辑 收藏

JDBC也分2.0和3.0?

如题。研究中...以前没有注意过。

posted @ 2008-10-23 10:10 金家寶 阅读(276) | 评论 (0)编辑 收藏

鲤鱼论坛 研究笔记(未)

2008.10.21第一天
网站地址: http://www.liyunet.com/
源码下载: http://www.liyunet.com/bbs/download.jsp

我主要是利用该论坛的简易性来研究JSP技术,以及缓存技术。虽然说目前大部分论坛应用的都是主流框架技术,但说回来,这些框架也只是对JSP等相关技术的一个封装,而了解底部应用及其原理更容易让我理解主流框架的内部原理机制。不至于让框架把我们变成“傻子”。


那就开始吧
首先,和某些大虾一样的习惯,我们从WEB-INF下的web.xml开始,从以下代码中可以发现随着tomcat启动时,自动加载了InitServlet类。这是一个Servlet类。
WEB-INF\web.xml部分代码:
1
2<servlet-name>InitServlet</servlet-name>
3        <servlet-class>com.bcxy.servlet.InitServlet</servlet-class>
4        <load-on-startup>1</load-on-startup>
5      </servlet>
6

查看com.bcxy.servlet.InitServlet类,代码很简单:
开始做了一个对此类日志(log4j)的绑定。接着通过SystemConfig取得了系统配置中的连接类型conntype(查看classes目录下的SystemConfig.xml可知此变量是判断使用连接池的类型0:3P0; 1:Proxool)。接着是初始化操作,记录一些必要的启动信息(log4j)(其中做了本地地址和网络访问地址的转换)。
用DBUtil.close测试连接池是否加载成功。
最后是释放类所做的必要操作。判断使用的是哪一种连接池,然后关闭。这样我们的第一个类就分析完毕。
接着需要了解到
SystemConfig类是加载SystemConfig.xml配置文件,并设定方法去读取。其中有一定的类型转换。

此时似乎已经找不到头绪了。那这样吧。我们就开始访问我们自己搭建的论坛,从首页开始,也就是index.jsp页面。
浏览index.jsp代码,由上向下理解每一个语句的含义(整体分体)。

设定页面编码;导入IPLocalizer类(应该是做IP显示的工具类);插入INC/const.jsp页(过后会有分析);设定stats变量数值(通过阅读其他jsp页面发现,此变量的作用主要是在于在首页显示用户状态时,兼并显示当前用户做浏览的页面:也就是stats的值,这样我们可以在客户可访问的范围内对stats变量进行设置,就可以查看在线用户的当前行为);继续插入INC/theme.jsp(估计是定制论坛模板的文件);<table>标签内部就是连接到相关显示数据信息的jsp页面并附加了参数。其中的一些格式是通过上面引用文件中的变量设置,相对不难理解;论坛消息广播部分,通过一个可执行jsp页面vector显示在首页顶部,当中访问数据库的细节需要进一步研究代码);接着是帖子的遍历,也就是首页最关键的部分,这里看起来不是由jsp页面来负责获取数据,而是通过Forum类来获取一些过滤之后的数据:这里所说的过滤是例如置顶帖子,最新帖子等有一些特殊标记的数据:;
index.jsp的其他部分就都是大同小异了。都是通过一个遍历来展现具有相同特性的数据。;大家需要注意一些关于页面表现的而非java技术的部分,例如信息层的提示,和一些图片连接。
通过index.jsp的学习,我们大概已经了解了大部分jsp页面代码的表现形式和含义。当然,一定要注意在这个过程中,参数传递、参数获取的代码部分,不要遗漏。除了一些我们可以看到的页面之外,上面部分也讲到了一些并不用于显示给用户的页面,这里我们认为它是可执行页面,也就是说它对我们的数据和请求做了一些处理,或者说把我们的请求转交给了服务器(比如servlet)。

预计晚上要研究一下有关数据库方面的存取类JdbcWrapper以及连接获取和释放、数据查询插入。
2008.10.22
大概昨天写的已经忘的差不多了,那么我们还是从index.jsp文件开始,前几行没有什么问题,都是一些导入文件的标签,那么我们从SkinUtil.这个类入手。在查看SkinUtil类代码的时候我们发现里面应用了一些com\bcxy\bbs\util 包中类,其中含有三个工具类。(偷笑,看了文件大小,应该代码不多,我们看看里面都是什么)在开始之前我们应了解一下GCookie.java类的大概内容和作用。看导入包我们可以大概了解一下此类的作用:对URL的编码与解码,产生和读取Cookie,还有就是做一些日志记录(log4j)。
我们仔细阅读后,了解到,其中有一个重载方法,也就是setCookie方法,根据不同的参数,可以让我们选择直接赋予变量名和值的方法,或者是赋予变量名和值另外加上最大保存时间的方法。  类中的另一个方法是获取Cookie方法值。
ParamUtil类也很简单,是取得字符串和 取得整数的重载方法,其中的参数决定是否有默认值,是否需要转码。
SysUtil类中根据SystemConfig类中的读取方法读取配置文件systemconfig.properties,按照里面的设置,来判断是否对参数和数据库读取操作中的参数进行编码。其中还有一个方法是取得真实地址,当然这些都是根据systemconfig.properties文件中配置而定的。
BBSCconst.java类简单的设置了一些常量。作用是设置数据库表名的时候加上systemconfig.properties中设置的前缀。
回到SkinUtil.java类似乎看起来一些刚刚还陌生的类方法,显得明朗。前面设置了一个Cookie的变量名并赋了值。

ret = new JdbcWrapper().doIntSearch(sql, 0);

这里用到了新类,也就是我们昨天说过的要了解的关于数据库连接的类。也是今天要解决的重点。打开JdbcWrapper类,查看代码.(插一句,看代码的时候,我觉得先看包名,了解大概要用到的类和方法,去设想这个类要实现的功能),yi一眼看来,大概都熟悉,无非是连接数据库 读取,结果保存,异常,还有一些类似数组的HashMap还有遍历用得Iterator。想想,大概就是数据层的一些基础CRUD操作。但是其中有个类不是很熟悉,DatabaseMetaData类,查看sun公司的在线文档,发现这是个接口而且方法奇多,文档的第一句这么写,

Comprehensive information about the database as a whole. 

我也不能理解这句话包含了什么内容。不管他,在程序中慢慢体会吧。JdbcWrapper这个类有点长,不过,大部分方法都有类似的作用,也就是说真正不同功能的代码也只有几分之一而已。我看的都想睡觉了。

在网吧,因为不便,先离开咯
今天还好,自己有一台电脑,可以不限制时间。继续工作....
之前研究JdbcWrapper类的时候有一个小小的疑问。如下

 

 1     //######这里有一点不明白,为什么要判断getAutoClose()
 2    /*
 3     * 当需要事务支持时,需要设置autoClose=false,那就等到事务提交时再关闭数据库连接。
 4     * */

 5    public void closeConnection() {
 6        if (getAutoClose()) {
 7            DBUtil.close(pstmt, con);
 8        }

 9    }

10

今天看群里鲤鱼回答内容如下:

当需要事务支持时,需要设置autoClose=false,那就等到事务提交时再关闭数据库连接。


一时还没有理解开来。
看过来看过去,JdbcWrapper类对我来讲还是有一部分难以理解。索性不去管它,等在下面的代码中出现时,反复查阅应该会有更多的收获。

posted @ 2008-10-21 11:47 金家寶 阅读(339) | 评论 (0)编辑 收藏