c3p0很容易用的开源专业jdbc数据库缓冲池?br />它是sourceforge上的一个开源项目,
目?
http://sourceforge.net/projects/c3p0
他的众多Ҏ这里就不一一介绍了?br />比较爽的一点就?br />当Connection归还~冲池时Qc3p0会很心的关?br />q条q接打开的Statement和ResultSet,免去了用时
自己动手心翼的关闭?/em>
c3p0使用非常单,q里l一个例?/em>
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();
}
}
然后在ConnectionManagercȝ目录下再创徏一个配|文件c3p0.properties
内容如下Q?br />#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的文?/em>
使用connection时很?br />Connection conn = ConnectionManager.getInstance().getConnection();
...
最?conn.close() 卛_Q?/em>
查看com.bcxy.servlet.InitServletc,代码很简?
开始做了一个对此类日志Qlog4j)的绑定。接着通过SystemConfig取得了系l配|中的连接类型conntypeQ查看classes目录下的SystemConfig.xml可知此变量是判断使用q接池的cd0:3P0Q?1:ProxoolQ。接着是初始化操作Q记录一些必要的启动信息(log4j)Q其中做了本地地址和网l访问地址的{换)?br />用DBUtil.close试q接池是否加载成功?br />最后是释放cL做的必要操作。判断用的是哪一U连接池Q然后关闭。这h们的W一个类分析完毕?br />接着需要了解到
SystemConfigcL加蝲SystemConfig.xml配置文gQƈ讑֮Ҏ去读取。其中有一定的cd转换?br />
此时g已经找不到头l了。那q样吧。我们就开始访问我们自己搭建的论坛Q从首页开始,也就是index.jsp面?br />览index.jsp代码Q由上向下理解每一个语句的含义Q整体分体)?br />
讑֮面~码Q导入IPLocalizerc(应该是做IP昄的工LQ;插入INC/const.jsp(q后会有分析Q;讑֮stats变量数|通过阅读其他jsp面发现Q此变量的作用主要是在于在首|C用L态时Q兼q显C当前用户做览的页面:也就是stats的|q样我们可以在客户可讉K的范围内对stats变量q行讄Q就可以查看在线用户的当前行为)Ql插入INC/theme.jspQ估计是定制论坛模板的文ӞQ?lt;table>标签内部是q接到相xC数据信息的jsp面q加了参数。其中的一些格式是通过上面引用文g中的变量讄Q相对不隄解;论坛消息q播部分Q通过一个可执行jsp面vector昄在首顶部,当中讉K数据库的l节需要进一步研I代码)Q接着是帖子的遍历Q也是首页最关键的部分,q里看v来不是由jsp面来负责获取数据,而是通过ForumcL获取一些过滤之后的数据Q这里所说的qo是例如置帖子,最新帖子等有一些特D标记的数据Q?
index.jsp的其他部分就都是大同异了。都是通过一个遍历来展现h相同Ҏ的数据。;大家需要注意一些关于页面表现的而非java技术的部分Q例如信息层的提C,和一些图片连接?br />通过index.jsp的学习,我们大概已经了解了大部分jsp面代码的表现Ş式和含义。当Ӟ一定要注意在这个过E中Q参C递、参数获取的代码部分Q不要遗漏。除了一些我们可以看到的面之外Q上面部分也讲到了一些ƈ不用于显C给用户的页面,q里我们认ؓ它是可执行页面,也就是说它对我们的数据和h做了一些处理,或者说把我们的h转交l了服务器(比如servletQ?br />
预计晚上要研I一下有x据库斚w的存取类JdbcWrapper以及q接获取和释放、数据查询插入?br />2008.10.22
大概昨天写的已经忘的差不多了Q那么我们还是从index.jsp文g开始,前几行没有什么问题,都是一些导入文件的标签Q那么我们从SkinUtil.q个cd手。在查看SkinUtilcM码的时候我们发现里面应用了一些com\bcxy\bbs\util 包中c,其中含有三个工具cR(LQ看了文件大,应该代码不多Q我们看看里面都是什么)在开始之前我们应了解一下GCookie.javacȝ大概内容和作用。看导入包我们可以大概了解一下此cȝ作用Q对URL的编码与解码Q生和dCookieQ还有就是做一些日志记?log4j)?br />我们仔细阅读后,了解刎ͼ其中有一个重载方法,也就是setCookieҎQ根据不同的参数Q可以让我们选择直接赋予变量名和值的ҎQ或者是赋予变量名和值另外加上最大保存时间的Ҏ。?cM的另一个方法是获取CookieҎ倹{?br />ParamUtilcM很简单,是取得字W串?取得整数的重载方法,其中的参数决定是否有默认|是否需要{码?br />SysUtilcMҎSystemConfigcM的读取方法读取配|文件systemconfig.propertiesQ按照里面的讄Q来判断是否对参数和数据库读取操作中的参数进行编码。其中还有一个方法是取得真实地址Q当然这些都是根据systemconfig.properties文g中配|而定的?br />BBSCconst.javacȝ单的讄了一些常量。作用是讄数据库表名的时候加上systemconfig.properties中设|的前缀?br />回到SkinUtil.javacM乎看h一些刚刚还陌生的类ҎQ显得明朗。前面设|了一个Cookie的变量名q赋了倹{?br />
q里用到了新c,也就是我们昨天说q的要了解的关于数据库连接的cR也是今天要解决的重炏V打开JdbcWrapperc,查看代码.(插一句,看代码的时候,我觉得先看包名,了解大概要用到的cdҎQ去设想q个c要实现的功能)Qyi一眼看来,大概都熟悉,无非是连接数据库 dQ结果保存,异常Q还有一些类似数l的HashMapq有遍历用得Iterator。想惻I大概是数据层的一些基CRUD操作。但是其中有个类不是很熟悉,DatabaseMetaDatac,查看sun公司的在U文,发现q是个接口而且Ҏ奇多Q文的W一句这么写Q?/p>
我也不能理解q句话包含了什么内宏V不他Q在E序中慢慢体会吧。JdbcWrapperq个cL炚wQ不q,大部分方法都有类似的作用Q也是说真正不同功能的代码也只有几分之一而已。我看的都想睡觉了?br />
在网吧,因ؓ不便Q先d?br />今天q好Q自己有一台电脑,可以不限制时间。l工?...
之前研究JdbcWrappercȝ时候有一个小的疑问。如?br />
今天看群里鲤鱼回{内容如下:
一时还没有理解开来?br />看过来看q去QJdbcWrappercd我来讲还是有一部分难以理解。烦性不ȝ它,{在下面的代码中出现Ӟ反复查阅应该会有更多的收莗?br />
代码 | 说明 |
---|---|
. | 匚w除换行符以外的Q意字W?/u> |
\w | 匚w字母或数字或下划U或汉字 |
\s | 匚wL的空白符 |
\d | 匚w数字 |
\b | 匚w单词的开始或l束 |
^ | 匚w字符串的开?/u> |
$ | 匚w字符串的l束 |
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一ơ或更多?/u> |
? | 重复零次或一?/u> |
{n} | 重复n?/u> |
{n,} | 重复nơ或更多?/u> |
{n,m} | 重复n到m?/u> |
使用括h定一个子表达式后Q?strong>匚wq个子表辑ּ的文?/strong>(也就是此分组捕获的内?可以在表辑ּ或其它程序中作进一步的处理。默认情况下Q每个分l会自动拥有一?span class="name" bakclassname="name">l号Q规则是Q从左向叻I以分l的左括号ؓ标志Q第一个出现的分组的组号ؓ1Q第二个?Q以此类推?/p>
后向引用用于重复搜烦前面某个分组匚w的文本。例如,\1代表分组1匚w的文?/u>。难以理解?LCZQ?/p>
\b(\w+)\b\s+\1\b可以用来匚w重复的单?/u>Q像go go, 或?span class="string" bakclassname="string">kitty kitty。这个表辑ּ首先?span class="desc" bakclassname="desc">一个单?/u>Q也是单词开始处和结束处之间的多于一个的字母或数?/u>(\b(\w+)\b)Q这个单词会被捕获到~号?的分l中Q然后是1个或几个I白W?/u>(\s+)Q最后是分组1中捕L内容Q也是前面匚w的那个单词)(\1)?/p>
你也可以自己指定子表辑ּ?span class="name" bakclassname="name">l名。要指定一个子表达式的l名Q请使用q样的语法:(?<Word>\w+)(或者把括h?span class="code" bakclassname="code">'也行Q?span class="code" bakclassname="code">(?'Word'\w+)),q样把\w+的组名指定ؓWord了。要反向引用q个分组捕获的内容,你可以?span class="code" bakclassname="code">\k<Word>,所以上一个例子也可以写成q样Q?span class="regex" bakclassname="regex">\b(?<Word>\w+)\b\s+\k<Word>\b?/p>
使用括L时候,q有很多特定用途的语法。下面列Z最常用的一些:
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匚wexp,q捕h本到自动命名的组?/u> |
(?<name>exp) | 匚wexp,q捕h本到名称为name的组里,也可以写??'name'exp) | |
(?:exp) | 匚wexp,不捕获匹配的文本Q也不给此分l分配组?/u> | |
零宽断言 | (?=exp) | 匚wexp前面的位|?/u> |
(?<=exp) | 匚wexp后面的位|?/u> | |
(?!exp) | 匚w后面跟的不是exp的位|?/u> | |
(?<!exp) | 匚w前面不是exp的位|?/u> | |
注释 | (?#comment) | q种cd的分l不Ҏ则表辑ּ的处理生Q何媄响,用于提供注释让h阅读 |
代码/语法 | 说明 |
---|---|
*? | 重复Lơ,但尽可能重?/u> |
+? | 重复1ơ或更多ơ,但尽可能重?/u> |
?? | 重复0ơ或1ơ,但尽可能重?/u> |
{n,m}? | 重复n到mơ,但尽可能重?/u> |
{n,}? | 重复nơ以上,但尽可能重?/u> |
名称 | 说明 |
---|---|
IgnoreCase(忽略大小? | 匚w时不区分大小写?/td> |
Multiline(多行模式) | 更改^?span class="code" bakclassname="code">$的含义,使它们分别在L一行的行首和行配,而不仅仅在整个字W串的开头和l尾匚w?在此模式?$的精含意是:匚w\n之前的位|以及字W串l束前的位置.) |
Singleline(单行模式) | 更改.的含义,使它与每一个字W匹配(包括换行W\nQ? |
IgnorePatternWhitespace(忽略I白) | 忽略表达式中的非转义I白q启用由#标记的注释?/td> |
RightToLeft(从右向左查找) | 匚w从右向左而不是从左向双行?/td> |
ExplicitCapture(昑ּ捕获) | 仅捕获已被显式命名的l?/td> |
ECMAScript(JavaScript兼容模式) | 使表辑ּ的行Z它在JavaScript里的行ؓ一致?/td> |
代码/语法 | 说明 |
---|---|
\a | 报警字符(打印它的效果是电脑嘀一? |
\b | 通常是单词分界位|,但如果在字符c里使用代表退?/u> |
\t | 制表W,Tab |
\r | 回R |
\v | 竖向制表W?/u> |
\f | 换页W?/u> |
\n | 换行W?/u> |
\e | Escape |
\0nn | ASCII代码中八q制代码为nn的字W?/u> |
\xnn | ASCII代码中十六进制代码ؓnn的字W?/u> |
\unnnn | Unicode代码中十六进制代码ؓnnnn的字W?/u> |
\cN | ASCII控制字符。比如\cC代表Ctrl+C |
\A | 字符串开?cM^Q但不受处理多行选项的媄? |
\Z | 字符串结或行尾(不受处理多行选项的媄? |
\z | 字符串结?cM$Q但不受处理多行选项的媄? |
\G | 当前搜烦的开?/u> |
\p{name} | Unicode中命名ؓname的字W类Q例如\p{IsGreek} |
(?>exp) | 贪婪子表辑ּ |
(?<x>-<y>exp) | ql?/u> |
(?im-nsx:exp) | 在子表达式exp中改变处理选项 |
(?im-nsx) | 辑ּ后面的部分改变处理选项 |
(?(exp)yes|no) | 把exp当作零宽正向先行断言Q如果在q个位置能匹配,使用yes作ؓ此组的表辑ּQ否则用no |
(?(exp)yes) | 同上Q只是用空表达式作为no |
(?(name)yes|no) | 如果命名为name的组捕获C内容Q用yes作ؓ表达式;否则使用no |
(?(name)yes) | 同上Q只是用空表达式作为no |
一? </s:form>可以上传文g的form?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
TCL or Python are not available, shell is disabled?/td> |
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32Tk is available, Tk-macros are enabledTCL is available, shell is enabled : help (select and press enter) |