ZeroBlue

留出时间,让自己微笑。
posts - 6, comments - 12, trackbacks - 0, articles - 0
   :: 首页 ::  :: 联系 ::  :: 管理

2006年8月29日

数据库锁的概念,类型,排锁语句:
锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象。即如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。这些问题包括:丢失更新、脏读、不可重复读和幻觉读。

找出表A中M字段大于500,Y(日期)早于当前数据库一天,X字段取值不重复的记录:
select * from A where x in
(select x from A group by x having count(x)=1)
and m >500 and y < getdate()-1;

从表A中统计X字段的不同取值数并只把记录数多于5的找出:
select * from A where x in (select x from A group by x having count(x)>5)

设表B结构与表A相同,将B中n字段值大于500的记录插入A
insert into A select * from B where n>500


对表A,建立和删除M,N字段联合唯一索引:
CREATE UNIQUE  INDEX myclumn_index ON A(x,y)
DROP INDEX A.myclumn_index 
 注意:当你的内存容量或硬盘空间不足时,也许你不想给一个表增加索引。对于包含索引的数据库,SQL Sever需要一个可观的额外空间。例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间。要看一看一个表的索引在数据库中所占的空间大小,你可以使用系统存储过程sp_spaceused,对象名指定为被索引的表名。

posted @ 2007-03-01 20:32 zeroblue 阅读(252) | 评论 (0)编辑 收藏

节选自《程序员》2006年第9期《茶杯里的风暴》一文,作者:金尹。如下:
  P2P网络向传统应用的渗透,将对Ruby、Python这些新兴的编程语言提出巨大的挑战。首先在P2P网络中单个运算节点上的程序并不需要像Web服务那样保持24×7稳定,也不需要支持大容量并发计算。Ruby、Python这些语言的快速开发优势得以显著地体现,他们将是未来桌面的主力开发语言。其次,为了共享P2P覆盖网上分散的计算资源,分布式计算所需的容错能力、分布式存储格式、算法、支持库乃至语言级别的支持都纳入到新语言的规划当中;最后,到我们的计算机上出现越来越多的客户端小程序时,为每一个程序开启一个庞大的虚拟机将是一个非常糟糕的办法,那么在共享虚拟机上,我们如何提供对多核的支持?而这些多核的虚拟机特性又如何从语言层面、支持库层面展现给开发者,同时又不失去语言的简洁特性?这些都是我们不能回避的话题!
  AJAX、Ruby窜红并非是一场茶杯里的风暴,而是巨大冰山的一角。无论是服务端还是客户端,并行/分布式计算的巨大需求都向编程语言提出严峻的挑战。然而目前大多数的编程语言设计之初并不关注并行/分布式计算,这些语言中的许多经典特性(比如OO)在并行/分布式计算上变成了捆住程序员的锁链。工欲善其事,必先利其器。在并行/分布式计算领域中我们必须抛弃原有的经验、习惯、以一种新的思维面对新的世界。

  再回过头来看看下面这篇文章:
         http://www.cnblogs.com/sharenet/archive/2006/05/18/403517.aspx

posted @ 2006-09-01 14:49 zeroblue 阅读(1577) | 评论 (7)编辑 收藏

Step 1:配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>

    
<display-name>springapp</display-name>
        
    
<servlet>
        
<servlet-name>springMVC</servlet-name>
        
<servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        
</servlet-class>
        
<load-on-startup>1</load-on-startup>
    
</servlet>

    
<servlet-mapping>
        
<servlet-name>springMVC</servlet-name>
        
<url-pattern>/page/*</url-pattern>
    
</servlet-mapping>

</web-app>
servlet-mapping定义所有以/page/开头的url请求都会被spring 的DispatcherServlet处理转发。默认情况下DispatcherServlet会读取<servlet-name>-servlet.xml文件的配置信息初始化,该文件中urlMapping的定义决定当前请求转发给哪个controller来处理。

Step2:定义/WEB-INF/springMVC-servlet.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    
<!-- 方法名解析器 -->
    
<bean id="InternalPathMethodNameResolver"
        class
="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
        
    
<!-- 视图解析器 -->
    
<bean id="viewResolver"
        class
="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
<property name="viewClass">
            
<value>org.springframework.web.servlet.view.JstlView</value>
        
</property>
    
</bean>
    
    
<bean id="controller" class="com.controller.IndexController">
        
<property name="methodNameResolver">
            
<ref bean="InternalPathMethodNameResolver" />
        
</property>
    
</bean>

    
<bean id="urlMapping"
        class
="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        
<property name="mappings">
            
<props>
                
<prop key="/controller/*">controller</prop>
            
</props>
        
</property>
    
</bean>
</beans>
urlMapping定义/controller/开头的url请求由名字为controller的控制器来处理,因为是多动作处理器,所以要定义MethodNameResolver来告诉springMVC应该调用controller的哪个方法,这里用的是InternalPathMethodNameResolver,该方法名解释器会把整个URL中最后一个"/"和最后一个"."之间的部分作为要调用的方法名

Step3:定义controller类并继承MultiActionController 
package com.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class IndexController extends MultiActionController {
    
    
public ModelAndView method1(HttpServletRequest request,
            HttpServletResponse respnose) 
throws ServletException, IOException {
        Map model 
= new HashMap();
        model.put(
"message""你调用的是方法1");
        
return new ModelAndView("/index.jsp""model", model);
    }

    
    
public ModelAndView method2(HttpServletRequest request,
            HttpServletResponse respnose) 
throws ServletException, IOException {
        Map model 
= new HashMap();
        model.put(
"message""你调用的是方法2");
        
return new ModelAndView("/index.jsp""model", model);
    }

}


通过配置文件,访问上面这个controller中某个方法的url即为:localhost:8080/page/controller/方法名


Step4:/index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%> 


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head></head>  
<body>

    
<c:out value="${model.message}"/>
</body>
</html>
因为InternalPathMethodNameResolver方法名解释器会把整个URL中最后一个"/"和最后一个"."之间的部分作为要调用的方法名,所以你可以在这个URL后面加任意文件格式的后缀,比如:
localhost:8080/page/controller/method1.jsp

localhost:8080/page/controller/method2.html
很爽吧,和真实的URL地址一样。


另:开发环境:MyEclipse5.0M2+tomcat5.5
  需要用到spring.jar和jstl.jar两个包。

附:源代码下载

posted @ 2006-08-31 13:39 zeroblue 阅读(10044) | 评论 (3)编辑 收藏

 

package  com.schedule;

import  java.io.BufferedReader;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.OutputStreamWriter;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
import  java.util.HashMap;
import  java.util.Iterator;
import  java.util.Map;

public   class  StaticPageService  {
    
private  Map < String, String >  urlMap;

    
private  String realPath;

    
public   void  createFile()  {
        
if  (urlMap  ==   null {
            
throw   new  NullPointerException( " The url map is should not be null! " );
        }

        Iterator
< String >  keys  =  urlMap.keySet().iterator();
        String inputLine;
        String enter 
=   " \n " ;
        StringBuffer buffer 
=   new  StringBuffer();
        
try   {
            
while  (keys.hasNext())  {
                String key 
=  keys.next();
                URL url 
=   new  URL(key);
                HttpURLConnection uc 
=  (HttpURLConnection) url.openConnection();
                BufferedReader in 
=   new  BufferedReader( new  InputStreamReader(uc.getInputStream()));
                
if (buffer.length() > 0 )buffer.delete( 0 ,buffer.length());
                
while  ((inputLine  =  in.readLine())  !=   null {
                    buffer.append(inputLine);
                    buffer.append(enter);
                }

                String file 
=  realPath  +  urlMap.get(key);
                OutputStreamWriter fw 
=   new  OutputStreamWriter(
                        
new  FileOutputStream(file),  " GBK " );
                fw.write(buffer.toString());
                in.close();
                fw.close();
            }

        }
  catch  (MalformedURLException e)  {
            e.printStackTrace();
        }
  catch  (IOException e)  {
            e.printStackTrace();
        }

    }


    
/**
     * 
@param  urlMap
     *            the urlMap to set
     
*/

    
public   void  setUrlMap(Map < String, String >  urlMap)  {
        
this .urlMap  =  urlMap;
    }


    
/**
     * 
@param  realPath
     *            the realPath to set
     
*/

    
public   void  setRealPath(String realPath)  {
        
this .realPath  =  realPath;
    }


    
public   static   void  main(String[] args)  {
        StaticPageService service 
=   new  StaticPageService();
        Map
< String, String >  urlMap  =   new  HashMap < String, String > ();
        
// map的key为要生成静态页面的url,value为生成后的静态文件保存的路径
        urlMap.put( " http://localhost:8080/index.jsp " " /temp/index1.html " );
        urlMap.put(
" http://www.yahoo.com.cn/ " " /temp/index2.html " );
        
// 此参数用来设置当前Web应用的真实路径
        service.setRealPath( " d: " );
        service.setUrlMap(urlMap);
        service.createFile();
    }


}

posted @ 2006-08-30 11:33 zeroblue 阅读(1025) | 评论 (2)编辑 收藏

  最近学习的兴趣很浓,昨夜本想look look专业方面的东东。打开笔记本发现没声音,初以为是软件故障,故重装驱动,不灵。怀疑中了病毒,于是升级最新补丁、杀毒。果然报告有病毒,操刀杀之,依旧不灵。嗯,是不是因为病毒破坏了系统文件?干脆Ghost恢复,我做了系统备份,哇哈哈。
  一番折腾,重新启动电脑,……涛声依旧……。此时方才大悟,是硬件本身出了问题,不会修,只有对着哭的份了。
  算了,用台式机。丫竟然一到windows画面就重启!!打开机箱,细细检查了一通,把零件拔下重插,开机,照旧。此时我已经有点脑充血了。
  拿出手头的工具盘,检查磁盘时提示有N处数据错误,无法恢复。只好忍痛格掉C盘,进行磁盘检查,然后Ghost恢复。谁知Ghost恢复后的系统竟然无法启动。彻底崩溃。
  只好全新安装操作系统,以下的动作全然是幽灵附体,本人毫无知觉。
  此时凌晨一点,万籁寂静,只余一男子独立桌前,欲哭无泪……

posted @ 2006-08-30 11:20 zeroblue 阅读(261) | 评论 (0)编辑 收藏

web.xml中定义的过滤器:
        (注:Appfuse的构建网上有丰富的资料,在此不再赘述)

1、securityFilter

< filter >
        
< filter-name > securityFilter </ filter-name >
        
< filter-class >
            org.acegisecurity.util.FilterToBeanProxy
        
</ filter-class >
        
< init-param >
            
< param-name > targetClass </ param-name >
            
< param-value >
                org.acegisecurity.util.FilterChainProxy
            
</ param-value >
        
</ init-param >
</ filter >

  此过滤器定义Acegi Security 应用。Acegi Security 被广泛应用于Spring社区,在基于Spring的项目中提供全面的安全服务。它包含了一组接口和类,可以直接在Spring IoC容器中进行配置。Acegi Security 完全基于接口设计实现,为用户定制和扩展提供了极大的空间。基于SpringAOP,Acegi Security 可以完成方法级的权限管理。
(
文档
 下载)

2、cacheFilter

< filter >
        
< filter-name > cacheFilter </ filter-name >
        
< filter-class >
            com.opensymphony.oscache.web.filter.CacheFilter
        
</ filter-class >
 
</ filter >

  OSCache是一个基于javaEE架构的缓存解决方案,主要针对页面缓存。由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现高速缓存的机制。 其提供了内存和磁盘缓存两种机制,这种缓存机制使你的Web应用具备了一定程度的容错性,比如当数据库因某些原因当掉时,远程用户仍能访问缓存中的内容。
   
但有意思的是,Appfuse并没用使用这个页面缓存机制。这个过滤器的filter-mapping被注释掉了。如下:

   <!--  Commented out  for   2  reasons: 
                                          1 ) it ' s a pain when developing JSPs, and

                                       2 ) it causes the Signup webtest to fail 
                                         大意是说这东西使开发Jsp页面变得很痛苦,并且无法测试(英文水平有限 ^_^)。
      -->

    
<!-- filter - mapping >
        
< filter - name > cacheFilter </ filter - name >
        
< url - pattern >* .jsp </ url - pattern >
    
</ filter - mapping -->

( 文档与下载   )

3、clickstream

< filter >
    
< filter - name > clickstream </ filter - name >
    
< filter - class > com.opensymphony.clickstream.ClickstreamFilter </ filter - class >
</ filter >

< filter - mapping >
    
< filter - name > clickstream </ filter - name >
    
< url - pattern >* .jsp </ url - pattern >
</ filter - mapping >

< filter - mapping >
    
< filter - name > clickstream </ filter - name >
    
< url - pattern >* .html </ url - pattern >
</ filter - mapping >

< listener >
    
< listener - class > com.opensymphony.clickstream.ClickstreamListener </ listener - class >
</ listener >


  又是opensymphony的东西,clickstream用来跟踪用户的页面操作。其功能非常强大,通过过滤器我们可以跟踪用户的每一次点击信息。并且在用户的Session结束时,可以将用户的跟踪信息输出到文件或形成一个输出流以便处理。当用户的Session开始时listener开始一次跟踪,filter捕捉每一次请求。
文档与下载

4、hibernateFilter

     < filter >
        
< filter-name > hibernateFilter </ filter-name >
        
< filter-class >
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        
</ filter-class >
    
</ filter >

  
< filter >  
        
< filter-name > opensession </ filter-name >
 
        
< filter-class > org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </ filter-class >
 
        
< init-param >
 
            
< param-name > singleSession </ param-name >
 
            
< param-value > false </ param-value >
 
        
</ init-param >
 
    
</ filter >  

  当使用hibernate的延迟加载时,你必须保证是在同一个Session中使用结果集,否则会抛出异常。而HibernateTemplate试图每次执行时打开和关闭Session。这时就应该采用 OpenSessionInViewFilter模式。
相关文档
5、UrlRewriteFilter

  < filter >
   
< filter-name > rewriteFilter </ filter-name >
     
< filter-class >
       org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
     
</ filter-class >
    
< init-param >
    
< param-name > logLevel </ param-name >
      
< param-value > commons </ param-value >
   
</ init-param >
 
</ filter >
< filter-mapping >
  
< filter-name > rewriteFilter </ filter-name >
  
< url-pattern > /* </ url-pattern >
  
<!-- dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher
-->

 
</ filter-mapping >

  Url重写,通过配置文件改写你的URL,将输入的URL映射到真实的URL地址来达到URL美化的作用。
文档与下载

6、sitemesh

  < filter >
  
< filter-name > sitemesh </ filter-name >
  
< filter-class >
   com.opensymphony.module.sitemesh.filter.PageFilter
  
</ filter-class >
 
</ filter >

  sitemesh是由一个基于web页面布局、装饰以及与现存web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观, 如一致的导航条,一致的banner,一致的版权,等等。它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容, 如htm的内容,使得它的内容也符合你的页面结构的要求。甚至于它能将html文件象include那样将该文件作为一个面板的形式嵌入到别的文件中去。
文档与下载 )( 学习

7、Display Tag Lib标签库

< filter >
        
< filter-name > exportFilter </ filter-name >
        
< filter-class >
            org.displaytag.filter.ResponseOverrideFilter
        
</ filter-class >
</ filter >

  Display Tag Lib是一个标签库,用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等,  而且使用起来非常的方便。能够大大减少代码量。
文档与下载

8、GZIPFilter

     < filter >
        
< filter-name > compressionFilter </ filter-name >
        
< filter-class > com.lady.webapp.filter.GZIPFilter </ filter-class >
    
</ filter >

将输出流压缩为GZIP格式,据说压缩比率可达70%-80%,这样输出到客户端的数据量大大减少,可以显著的提高性能。这是一个Appfuse自定义的过滤器,详情见下面链接。
文档

最后一个是I18N应用的过滤器,不多说了。

还有一个监听器非常重要,即IntrospectorCleanupListener:

     < listener >
        
< listener-class >
            org.springframework.web.util.IntrospectorCleanupListener
        
</ listener-class >
    
</ listener >

有现成的资料,COPY过来:
spring中的提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由  JavaBeans Introspector的使用而引起的缓冲泄露。
(引用:刘文涛的BLOG

posted @ 2006-08-29 13:48 zeroblue 阅读(1902) | 评论 (0)编辑 收藏