星期六, 八月 09, 2008

星期四, 八月 07, 2008

JSF无限递归错误Infinite recursion

运行.jsf文件,后台出现解析无线递归错误。最后出现
java.lang.StackOverflowError

错误原因在于同时声明了
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsf</param-value>
</context-param>


<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>


只要去掉 javax.faces.DEFAULT_SUFFIX的申明就解决问题了

JSF 访问控制Access Control方法

1.思路,扩展JSF提供的JAAS验证和Navigator 来定制满足自己要求的方法

JSF对安全的支持,是通过web.xml里JAAS相关申明和faces-config.xml里的导航规则说明,
以及在jsp或JSF页面里的相关 rendered标志的控制来做到。
也是 一个MVC的结构.
A.扩展自己的class (Control)
B.配置文件声明(web.xml,faces-config.xml) (Model)
C.jsp或JSF页面里的引用. (View)

web.xml里申明使用的导航配置文件,可以指定多个,用逗号,分开不同的配置文件。除了默认的faces-config.xml意外。
web.xml:
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-beans.xml</param-value>
</context-param>
一个技巧,定义一个网站或一个目录使用的导航规则,使用符号"*",如下
<navigation-rule> </navigation-rule>                        
<from-view-id>*</from-view-id>
<navigation-case> </navigation-case>
<from-outcome>globalhelp</from-outcome>
<to-view-id>/menu/generalHelp.jsp</to-view-id>



在JSP页面使用在faces-config.xml里定义的导航规则:
首先定义一个导航规则:
<navigation-rule>
<from-view-id>/pages/inputname.jsp</from-view-id>
<navigation-case>
<from-outcome><span style="font-weight: bold; color: rgb(255, 0, 0);">sayHello</span></from-outcome>
<to-view-id>/pages/anotherhello.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{GetNameBean.helloAction}</from-action>
<from-outcome>sayHello</from-outcome>
<to-view-id>/pages/hello.jsp</to-view-id>
</navigation-case>

</navigation-rule>

<h:commandbutton id="submit" action="sayHello" value="Submit">
sayHello就是在faces-config.xml里定义的。

http://sunxacml.sourceforge.net/faq.html
http://www.oasis-open.org/committees/xacml/

星期三, 八月 06, 2008

.JSF 使用及其他。

指定JSF pageEncoding必须使用:

在JSF文件第一行申明,用jsp的<%@page pageEncoding="UTF-8">来申明将会出现运行时间的

jsf The markup in the document preceding the root element must be well-formed

错误。

如果想区别jsp和jsf文件,让后缀为.jsf的文件直接用faceservlet来解析。需要在web.xml加入以下两组配置

1.修改默认的jsf文件默认后缀.
<context-param></context-param></span>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsf</param-value></span>


2.修改触发pattern
<servlet></servlet>
<servlet-name>Faces Servlet
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>


<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>


这样在浏览器里敲入http://localhost:8080/gate/index.jsf 就可以直接看到结果了。

Java数据库设计中的14个技巧

Java数据库设计中的14个技巧

http://news.newhua.com/news1/programming/2008/48/0848108471BJ3B21FAIB3C4G26JDJ3CB4436K58EG52EC9234IIKH3_3.html


下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。

1. 原始单据与实体之间的关系
  
可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一 的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。


2. 主键与外键
  
一般而言,一个实体不能既无主键又无外键。在E?R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。
  
主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也 没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体 之间的连接。


3. 基本表的性质
  
基本表与中间表、临时表不同,因为它具有如下四个特性:
  
(1) 原子性。基本表中的字段是不可再分解的。
   (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
   (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
   (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。


4. 范式标准
 
基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
  
在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。
  
表1 商品表的表结构
   商品名称 商品型号 单价 数量 金额
   电视机 29? 2,500 40 100,000

  
5. 通俗地理解三个范式
  
通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
  
  1. 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
  2.    第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
  3.    第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余.
  
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字
,允许冗余。

6. 要善于识别与正确处理多对多的关系

若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。 要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多 对多的关系,但能处理多对多的关系。

〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以 被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借 书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

7. 主键PK的取值方法
  
PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

8. 正确认识数据冗余
  
主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提 高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低 级冗余(重复性冗余)。

9. E--R图没有标准答案
  
信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。尽管 它没有惟一的标准答案,并不意味着可以随意设计。好的E?R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

10. 视图技术在数据库设计中很有用
  
与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视 图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。只有数据库管理员,带着多个人员共同掌握的 “安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

11. 中间表、报表和临时表
  
中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

12. 完整性约束表现在三个方面

  
域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。参照完整性:用PK、FK、表级触发器来实现。用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

13. 防止数据库设计打补丁的方法是“三少原则”
  
(1) 一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;
  
(2) 一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;
  
(3) 一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了 将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有 的人就是不习惯、不采纳、不执行。
  
数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。该原则是相对的,不是绝对 的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性) 的E--R图,要好得多。
  
提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将 主题数据库集成为全局综合数据库。集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E?R图中实体的个数、主键的个数、属 性的个数就会越少。
  
提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院 ”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。
  
“三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

14. 提高数据库运行效率的办法
  
在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
(1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
  
(3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
  
(4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
  
(5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。
 
总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

星期六, 八月 02, 2008

在Java使用JSON对象

JSON :www.json.org 不但是用来传递结构化的数据可以大显身手,也可以在静态的properties或XML数据中显示强大的威力。

由于现在java 5已经内置的支持javascript 引擎(http://www.mozilla.org/rhino/scriptjava.html)
所以可以在Java代码中通过手工编写调用javascrit来解析JSON的数据,
比如类似下面代码:

import javax.script.*;
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
engine.eval("a="+str);
String values= (String)engine.eval("a.string");
values里面的值为"JSON";

或者使用JSON的java类库来自(http://json-lib.sourceforge.net/)
代码如下:
这里把JSON对象放在Java的Properties里,注意,Java Properties最后一行必须是包含一个空行的独立行,否则最后一个字符将读不到,这可能是个bug或者怪癖吧。 注意下列的多行的写法,
每一行后面加入一个 \ 表示是同一行的内容.

com.test.t.properties文件里包含如下内容
DatabaseURL={\
"First":{"defaultDS":"java:/mysql","securityDS":"java:/secMysql"}, \
"Two":{"defaultDS":"java:/mysqlTwo","securityDS":"java:/secMysql"}, \
"Three":{"defaultDS":"java:/mysqlTHree","securityDS":"java:/secMysql"} \
}

import net.sf.json.*;
import java.util.ResourceBundle;
ResourceBundle t=ResourceBundle.getBundle("com.test.t");
JSONObject a=(JSONObject) JSONSerializer.toJSON( t.getString("DatabaseURL"));
JSONObject b=a.getJSONObject("First");//这是两级对象表示的方法
System.out.println(b.getString("defaultDS"));
打印结果为:java:/mysql

星期五, 八月 01, 2008

干净的安装Eclipse的Plugin

方法
步骤一 。在Eclipse的安装目录下找到links目录,如果没有links目录就建立一个目录
步骤二.用unzip或winrar展开plugin到一个建立的目录下,比如d:\Reponstity目录。
步骤三。在Eclipse的links目录下建立一个后缀为.link的文件。该文件里包含一行记录
path=d:/reponsity

这样,启动Eclipse的时候,就载入该插件了。同样卸载的时候,只需要注释掉path这样一行就可以了。

Seam 开发手册之一,添加新的Seam Runtime

1.新建一个Seam Project时候选择Seam runtime 并且选择Seam 版本(Jboss Web Tools自带) 1.2并且浏览到安装在硬盘上的最新的Seam安装目录the Seam 2.1,但是对话框无法改变Seam 版本字段. 显示一个错误的提示 "The selected seam appears to be of an incompatible version "2.1.0.A1"".
纠正错误的步骤。
1.首先建立新版本的seam

2.修改Project中使用的seam版本。

星期五, 七月 25, 2008

解决Java和Mysql 5.1 jdbc 之间包含汉字的SQL命令无法正常解析问题

Jsp Encode=UTF-->Servlet by jdbc--->mysql 5.1

如果包含汉字需要在jboss mysql-ds.xml里链接字符串加入如下

<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/gpsrm?useUnicode=TRUE</connection-url>
<connection-property name="characterEncoding">utf8</connection-property>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password></password>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>

星期四, 五月 22, 2008

vi的替换命令

关于vi替换命令的使用说明

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

n 为数字,若 n 为 .,表示从当前行开始到最后一行

:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky

可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

(n 为数字,若 n 为 .,表示从当前行开始到最后一行)

3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky


4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

5. 删除文本中的^M

问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。

· 使用命令:cat filename1 | tr -d “^V^M” > newfile;

· 使用命令:sed -e “s/^V^M//” filename > outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。

· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。

· :%s/^M$//g

如果上述方法无用,则正确的解决办法是:

· tr -d "\r" <>dest

· tr -d "\015" dest

· strings A>B

6. 其它

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g 功能同上

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索

字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作

JBOSS 4.2.X启动绑定IP,及外部访问问题

一般来说是两个方法。
一个是在JAVA_OPTS后面加入:-Djboss.bind.address=0.0.0.0,
同时并且要在/etc/hosts里加入 其他行除了 127.0.0.0 hostname localhost之外。

IPAddress hostname

另外一种是启动的时候加入-b 0.0.0.0的选择。
run.sh -b 0.0.0.0

这样也可以

星期二, 五月 20, 2008

EJB 的java.lang.ClassCastException错误

Jboss发布EJB成功后,再java 类中后调用出现错误:
一下代码行引起了错误:
PortableRemoteObject.narrow(objref, JControllerHome.class);
objRef是通过lookup找到的JNDI引用。
JControllerHome.class是stateless session bean

错误:

java.lang.ClassCastException: $Proxy59 cannot be cast to org.omg.CORBA.Object
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)

原因,当前Java Class有两个.class文件分别放在不用的目录下,JBOSS 4.2x系列的classloader对class安全载入验证严格,引起了这种问题。

解决方法:删除掉一个不需要的.class的文件,就可以了

星期三, 四月 30, 2008

如何得到JSON对象的数目?

JSON对象不支持length属性。如果想得到一个JSON包含的最顶层的对象的数目,必须用
for 函数来遍历
一种是单纯的数组:

strJSON = "['one','two',{obj1:'obj1_one',obj2:'obj2_two'}]";
var arrObj = eval('(' +strJSON+ ')');
alert(arrObj.length);

另外一种是复杂对象:

var jsonString = "{field1:'data1',field2:'data2',arrField1:['arrField1Content1','arrField1Content2']}";
var obj = eval('(' + jsonString + ')');

var objCount=0;
for(_obj in obj) objCount++;

alert(objCount);

星期一, 二月 11, 2008

RealPlay 11 的不兼容

如果机器安装了Realplay 11版本后,会出现很多视频或音频转换出现无声音的情况。
比如使用kmplayer放电影或 .rmvb无声音的情况.
或者WinAVI Video Converter 7.x,8.0版本转换视频到手机等其他格式的时候,只有图像,
没有声音。

解决的办法是用realplay 10.x的cook.dll来替换realplay 11版本的cook.dll,这样启动机器后,就正常了。这个dll在目录C:\Program Files\Common Files\Real\Codecs下。

这个情况很糟糕,希望以后能改进。

星期六, 一月 19, 2008

如何配置apache,jboss mod_jk一起工作

Apache和Mod_nk配置部分:
http://labs.jboss.com/jbossas/docs/Clustering_Guide/beta422/html/clustering-http-modjk.html

Apache下载:

http://httpd.apache.org/

Mod_Jk下载:
http://tomcat.apache.org/download-connectors.cgi
编译好的版本:
http://apache.mirror.phpchina.com/tomcat/tomcat-connectors/jk/binaries/
注意下载对应的apache http server的正确版本。
mod_jk-1.2.26-httpd-2.2.6.so   这个名字表示对应http server 2.2.6的版本,

其他配置,参看jboss文档

星期五, 一月 18, 2008

Kaspersky 注册表的删除

Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/SystemCertificates/SPC/Certificates]
[-HKEY_LOCAL_MACHINE/SOFTWARE/KasperskyLab/LicStorage]
[-HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Cryptography/RNG]

保存,为k.reg,然后运行就可以删除啦。

星期三, 一月 16, 2008

Redhat 如何打开 telnet

主要是iptable的负作用。
需要如此
/etc/init.d/./ipchains stop
/etc/init.d/./xinetd restart //重起xinetd

如果需要允许root远程登录,修改
/etc/securetty
加入:
pts/0,pts/1



星期六, 十二月 22, 2007

罗马数字的表示方法

I - 1 unus
II - 2 duo
III - 3 tres
IV - 4 quattuor
V - 5 quinque
VI - 6 sex
VII - 7 septem
VIII - 8 octo
IX - 9 novem
X - 10 decem
XI - 11 undecim
XII - 12 duodecim
XIII - 13 tresdecim
XIV - 14 quattuordecim
XV - 15 quindecim
XVI - 16 sedecim
XVII - 17 septendecim
XVIII - 18 duodeviginti
XIX - 19 undeviginti
XX - 20 viginti
XXI - 21 viginti unus
XXII - 22 viginti duo
XXVIII - 28 duodetriginta
XXIX - 29 undetriginta
XXX - 30 triginta
XL - 40 quadraginta
L - 50 quinquaginta

1~10: I II III IV V VI VII VIII IX X
11~20: XI XII XIII XIV XV XVI XVII XVIII XIX XX
21~30: XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX
31~40: XXXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL
41~50: XLI XLII XLIII XLIV XLV XLVI XLVII XLVII XLIX L
其中,I 为1
V为5
X为10
L为50

星期五, 十二月 21, 2007

Hibernate的数据库事务处理

1. 介绍数据库事务、事务隔离级别、悲观锁、乐观锁等概念。

2.数据库ACID特征:

Atomic(原子性):指整个数据库事务是不可分割的工作单元。

Consistency(一致性):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

Isolation(隔离性):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

Durability(持久性):指的是只要事务成功结束,它对数据库所作的更新就必须永久保存下来。

3.数据库系统支持两种事务模式:

自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。

手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。

4.MySQL中数据库表分为3种类型:INNODB、BDB和MyISAM,其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。

5.对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:

A.第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

B.脏读:一个事务读到另一个事务为提交的更新数据。

C.虚读:一个事务读到另一个事务已提交的新插入的数据。

D.不可重复读:一个事务读到另一个事务已提交的更新数据。

E.第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。

6.数据库系统提供了四种事务隔离级别供用户选择:

A.Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。

B.Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。

C.Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。

D.Read Uncommitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场 合,可以由应用程序采用悲观锁或乐观锁来控制。

7.当数据库系统采用read Commited隔离级别时,会导致不可重复读喝第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:

A.悲观锁:指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。

B.乐观锁:乐观锁假定当前事务操作数据资源时,不回有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。

8.悲观锁有两种实现方式:

A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句:select ... for update,在Hibernate中使用get,load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)

B.在数据库表中增加一个表明记录状态的LOCK字段,当它取值为“Y”时,表示该记录已经被某个事务锁定,如果为“N”,表明该记录处于空闲状态,事务可以访问它。增加锁标记字段就可以实现。

9.利用Hibernate的版本控制来实现乐观锁

乐观锁是由程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。

在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁,OR映射文件中的元素和都具有版本控制的功能,一般推荐采用

星期三, 十二月 19, 2007

VBA.Vbscript的定时器timer.任务安排功能的实现

方法:
Application.
OnTime(EarliestTime, Procedure, LatestTime, Schedule)
因为可以有许多的任务,所以默认的索引任务的唯一key,就是该任务开始的时间。就是:
EarliestTime,如果想可以控制一个任务,必须保留下来开始任务的时间。
vba中需要申明一个全局的public变量来保存,
例子:
Public RunWhen As Double

找一个地方调用下面的方法就可以了。

sub msgMovie
RunWhen = Now + DateTime.TimeValue("00:00:05")
Application.OnTime RunWhen, "msgMovie"
end sub

如果要停止这个任务,需要调用以下方法:
sub stopTime()
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, Procedure:="msgMovie", Schedule:=False
end Sub