mashiguang

小马快跑

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  11 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

2008年7月14日 #

 

最近公司客户反映有些页面运行速度太慢,通过对系统代码的分析,发现排行榜功能是罪魁祸首,因为数据量太大,每次刷新页面都计算一次排行榜,的确耗时费力。

其实可以让数据库自己计算排行榜,并把计算结果保存到一个单独的表里去,这个表只用来保存排行榜的数据,数据量很小,然后所有的排行榜查询都去select这个表。

计算排行榜的功能我们可以写成一个存储过程,但是排行榜的数据不是一成不变的,还需要不时的调用这个存储过程才行,oracle为我们提供了dbms_jobs

oracel dbms_jobs包可以提交作业到作业队列中,这个包中还提供其它一些函数管理以前提交的作业,如对作业进行修改、禁止或删除等操作。

常用函数:

submit(),提交作业到作业队列。

isumbit()

remove(),从作业队列中删除作业。

change(),改变已有作业的参数。

what(),改变作业要执行的代码。

next_date(),改变作业下一次执行时间。

interval(),改变作业执行的时间间隔。

broken(),暂停执行作业。

run(),强制执行作业。

最常用的submit()函数:

dbms_jobs.submit(

       job out binary_integer,

       what in varchar2,

       next_date in date default sysdate,

       interval in varchar default null,

       no_parse in boolean default false,

       instance in binary_integer default any_instance,

       force in boolean default false

);

submit函数参数:

job,作业的作业号,是个输出参数,所以调用submit函数时,这个参数要指定一个已存在的变量。

what,作业要执行的代码,一般是存储过程。

next_date,下一次作业运行的日期。

interval作业执行的间隔时间,这个参数默认值是null也就是what指定的代码只在next_date这一时间执行一次。

no_parse,默认值是false,当参数值是false,提交作业时就对what指定的代码进行语法分析;当参数值是true,第一次运行what指定代码时才进行语法分析。

instance,指明运行作业的数据库实例。

force,如果是true,instance可以是任何正数;如果是falseinstance指定的实例必须正在运行。

示例:

var jobno number;

begin

dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18点执行

commit;

end;

上面这段话要在 命令窗口 下运行,如在pl/sql developer里面的-->新键-->命令窗口

这样就会在每天的18点执行存储过程p_xxx_taxis。在我这里p_xxx_taxis执行的是计算排行榜的任务。

posted @ 2008-07-14 16:56 mashiguang 阅读(1019) | 评论 (6)编辑 收藏


调用ejb时,如果客户端和ejb不在同一个jvm,就要设置InitialContext,不同的应用服务器InitialContext写法也不同.
Context.INITIAL_CONTEXT_FACTORY:指定到目录服务的连接工厂
Context.PROVIDER_URL:目录服务提供者URL

//jboss:
Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"
Context.URL_PKG_PREFIXES, "org.jboss.naming"
Context.PROVIDER_URL, "localhost:1099"

//weblogic:
Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"
Context.PROVIDER_URL, "t3://localhost:7001"

//apusic(金蝶):
Context.INITIAL_CONTEXT_FACTORY, "com.apusic.jndi.InitialContextFactory"
Context.PROVIDER_URL, "rmi://localhost:6888"

//WebSphere:
Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"
Context.PROVIDER_URL, "iiop://localhost:900"


//J2EE  SDK(J2EE  RI):
Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"
Context.PROVIDER_URL, "iiop://127.0.0.1:1050"

//SilverStream:
Context.INITIAL_CONTEXT_FACTORY, "com.sssw.rt.jndi.AgInitCtxFactory"
Context.PROVIDER_URL, "sssw://localhost:80"

//OC4J:
Context.INITIAL_CONTEXT_FACTORY, "com.evermind.server.rmi.RMIInitialContextFactory"
Context.PROVIDER_URL, "ormi://127.0.0.1/"

//WAS5:
Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"
Context.PROVIDER_URL, "iiop://localhost:2809"

 

常用JNDI服务提供者连接工厂:
Filesystem:  Com.sun.jndi.fscontext.FSContextFactory或者com.sun.jndi.fscontext.RefFSContextFactory
LDAPv3:    Com.sun.jndi.ldap.LdapCtxFactory
NDS:     com.novell.naming.service.nds.NdsInitialContextFactory
NIS:     com.sun.jndi.nis.NISCtxFactory
RMI registry: com.sun.jndi.rmi.registry.RegistryContextFactory
IBM LDAP服务提供者:   com.ibm.jndi.LDAPCtxFactory
BEA 名字服务提供者:   weblogic.jndi.WLInitialContextFactory
JBOSS名字服务提供者:  org.jnp.interfaces.NamingContextFactory

posted @ 2008-07-14 16:35 mashiguang 阅读(1085) | 评论 (0)编辑 收藏

2007年12月13日 #

自JDK1.0开始就存在包装器类,但是在JDK5.0之前,必须手工地插入打包和拆包的代码.
JDK5.0中就有了自动打包功能,但在5.0中自动打包时存在一些差异,刚才看《java核心技术第7版》时才发现.

代码1:
Integer a=1000;
Integer b
=1000;
System.out.println(a
==b);//false
代码2:
Integer a=100;
Integer b
=100;
System.out.println(a
==b);//true
代码3:
Integer a=new Integer(100);
Integer b
=new Integer(100);
System.out.println(a
==b);//false

第一段代码不成立,而第二段代码成立的原因是:自动打包
自动打包规范要求boolean,byte,char≤127,介于-128→127之间的short和int被包装到固定的对象中.
打包和拆包是编译器认可的,而不是虚拟机,编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。

第三段代码不用多说肯定不成立.

 

posted @ 2007-12-13 17:03 mashiguang 阅读(685) | 评论 (5)编辑 收藏

2007年11月28日 #


在应用的web.xml中配置了InvokerServlet.

 <servlet>
  
<servlet-name>InvokerServlet</servlet-name>
  
<servlet-class>
   org.apache.catalina.servlets.InvokerServlet
  
</servlet-class>
  
<init-param>
   
<param-name>debug</param-name>
   
<param-value>0</param-value>
  
</init-param>
  
<load-on-startup>-1</load-on-startup>
 
</servlet>
  
<servlet-mapping>
    
<servlet-name>action</servlet-name>
    
<url-pattern>*.do</url-pattern>
  
</servlet-mapping>


在jboss4.0.5中使用没有问题,但迁移到4.2时,当使用到InvokerServlet就会出异常,解决办法:
在D:\jboss-4.2.1.GA\server\all\deploy\jboss-web.deployer下context.xml文件中的context元素中添加属性:privileged

<Context cookies="true" crossContext="true" privileged="true">

出现这个问题可能是tomcat5.5和tomcat6的差异,暂未查明,本文只供个人参考,不接受评论.

 

posted @ 2007-11-28 10:46 mashiguang| 编辑 收藏

2007年11月24日 #

     摘要: 用一个简单的ejb3.0示例记录ant打ear包的过程 源码下载 环境: apache-ant-1.6.5 jboss-4.2.1.GA jboss-annotations-ejb3.jar jboss-ejb3.jar jboss-ejb3x.jar 最后三个包在jboss里有. 1,建ejb3.0项目 session bean接口:HelloWorld pub...  阅读全文
posted @ 2007-11-24 00:44 mashiguang 阅读(1610) | 评论 (0)编辑 收藏

2007年11月1日 #

使用commons mail时需要的jar包:
1,commons-email-1.1.jar
2,mail.jar
3,activation.jar
(在web应用里只需要commons-email包)

发送简单的文字邮件:

SimpleEmail email = new SimpleEmail();

email.setHostName(
"smtp.sina.com");
email.setAuthentication(
"username""password");//在邮件服务商处注册的用户名和密码
email.addTo("mailTo@163.com");
email.setFrom(
"username@sina.com""alias");

email.setCharset(
"UTF-8");//gbk或gb2312,只要支持中文就行
email.setSubject("title");
email.setMsg(
"content");
email.send();

发送带附件的邮件:
// Create the attachment
EmailAttachment attachment = new EmailAttachment();
attachment.setPath(
"mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription(
"Picture of John");
attachment.setName(
"John");

// Create the email message
MultiPartEmail email = new MultiPartEmail();
email.setHostName(
"mail.myserver.com");
email.setAuthentication(
"username""password");
email.addTo(
"jdoe@somewhere.org""John Doe");
email.setFrom(
"me@apache.org""Me");
email.setCharset(
"UTF-8");
email.setSubject(
"The picture");
email.setMsg(
"Here is the picture you wanted");

// add the attachment
email.attach(attachment);

// send the email
email.send();

创建多个EmailAttachment对象,并调用MultiPartEmail.attach();就可以发送多个附件.

发送HTML格式的邮件:

发送html格式的邮件和简单邮件的区别就在创建HtmlEmail对象
并用email.setHtmlMsg(String)或email.setMsg(String)把含有html标签的字符串赋给email对象.
HtmlEmail对象还有一个setTextMsg(String)方法,这个方法参数里的html标签会被当做普通字符处理,不会被解析成html元素.
更详细内容可以看apache commons-email的用户指南.

posted @ 2007-11-01 16:51 mashiguang 阅读(690) | 评论 (3)编辑 收藏

2007年8月21日 #

贴子转自http://hi.baidu.com/bobylou,转之前并没有验证文章里的方法是不是有效,估计原作者把它放到blog之前应该做过测试了吧。

Struts本身有一套完善的防止重复提交表单Token(令牌)机制,但笔者目前的项目自写的framework没有用到Struts,故也得自写防止用户因为后退或者刷新来重复提交表单内容的Token机制。不难,容易实现。

实现原理:一致性。jsp生成表单时,在表单中插入一个隐藏<input>字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中。等到用户提交表单时,会一并提交该隐藏的token字符串。在服务器端,查看下是否在session中含有与该token字符串相等的字符串。如果有,那么表明是第一次提交该表单,然后删除存放于session端的token字符串,再做正常业务逻辑流程;如果没有,那么表示该表单被重复提交,做非正常流程处理,可以警告提示也可以什么也不做。

看代码。

首先是Token主类。类很简单,而且主要方法都给doc注释了

/*
* blog: 
http://hi.baidu.com/bobylou
* $Revision: 1.1 $
* $Date: 2007/07/18 10:02:55 $
* $Author: bobrow$
*/


package com.paizuo.framework.util;

import java.util.ArrayList;

import javax.servlet.http.HttpSession;

public class Token {

    
private static final String TOKEN_LIST_NAME = "tokenList";

    
public static final String TOKEN_STRING_NAME = "token";

    
private static ArrayList getTokenList(HttpSession session) {
       Object obj 
= session.getAttribute(TOKEN_LIST_NAME);
       
if (obj != null{
          
return (ArrayList) obj;
       }
 else {
          ArrayList tokenList 
= new ArrayList();
          session.setAttribute(TOKEN_LIST_NAME, tokenList);
          
return tokenList;
       }

    }


    
private static void saveTokenString(String tokenStr, HttpSession session) {
       ArrayList tokenList 
= getTokenList(session);
       tokenList.add(tokenStr);
       session.setAttribute(TOKEN_LIST_NAME, tokenList);
    }

   
    
private static String generateTokenString(){
       
return new Long(System.currentTimeMillis()).toString();
    }


    
/**
     * Generate a token string, and save the string in session, then return the token string.
     * 
     * 
@param HttpSession
     *            session
     * 
@return a token string used for enforcing a single request for a particular transaction.
     
*/

    
public static String getTokenString(HttpSession session) {
       String tokenStr 
= generateTokenString();
       saveTokenString(tokenStr, session);
       
return tokenStr;
    }


    
/**
     * check whether token string is valid. if session contains the token string, return true. 
     * otherwise, return false.
     * 
     * 
@param String
     *            tokenStr
     * 
@param HttpSession
     *            session
     * 
@return true: session contains tokenStr; false: session is null or tokenStr is id not in session
     
*/

    
public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
       
boolean valid = false;
       
if(session != null){
          ArrayList tokenList 
= getTokenList(session);
          
if (tokenList.contains(tokenStr)) {
             valid 
= true;
             tokenList.remove(tokenStr);
          }

       }

       
return valid;
    }

}



怎么使用?

在jsp页面端。

首先import该类:

<%@ page import="com.paizuo.framework.util.Token" %>

表单包含隐藏的token字符串:

 

<form>

<input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">

</form>

 

在Server端action中进行检验。

 

if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){
//进行正常业务流程
}

else{
//进行防重复提交处理流程
}

完毕。

posted @ 2007-08-21 11:45 mashiguang 阅读(960) | 评论 (4)编辑 收藏

2007年7月7日 #

1.创建mysql用户并授权:GRANT

语法:
GRANT privileges (columns)
ON what
TO username IDENTIFIED BY "password"
WITH GRANT OPTION

privileges :授予用户的权限
columns :权限运用的列,可选
what :权限运用的对象,可以是数据库,表,列
username :权限授予的用户
password :密码
WITH GRANT OPTION子句是可选的。

先来创建一个用户plmm(漂亮mm),给她最大的权限,可以对所有的表做任何操作,密码是"1234",但是她只能从本地登陆:
grant all
on *.*
to plmm@localhost identified by "1234"
再来创建一个用户klmm(恐龙mm),我们只给她查看test数据库里的table1表的权限,而且只能在192.168.0.%登陆,这里的"%"是个通配符,如果要使用通配符的话一定要用引号括起来.
grant select
on test.table1
to klmm@'192.168.0.%' identified by "1234"

下面表中列出privileges  除了上面用到的all和select还有哪些值可以选择
权限指定符 权限允许的操作
ALTER 修改表和索引
CREATE 创建数据库和表
DELETE 删除表中已有的记录
DROP 抛弃(删除)数据库和表
INDEX 创建或抛弃索引
INSERT 向表中插入新行
REFERENCE 未用
SELECT 检索表中的记录
UPDATE 修改现存表记录
FILE 读或写服务器上的文件
PROCESS 查看服务器中执行的线程信息或杀死线程
RELOAD 重载授权表或清空日志、主机缓存或表缓存。
SHUTDOWN 关闭服务器
ALL 所有;ALL PRIVILEGES同义词
USAGE 特殊的“无权限”权限

2.撤消用户权限:revoke
上面我们创建plmm用户时给了她所有的权限,现在要撤消她更新(update)数据库的权限
revoke update ON *.* FROM plmm@localhost
posted @ 2007-07-07 01:03 mashiguang 阅读(89) | 评论 (0)编辑 收藏

2007年7月6日 #

      以往每添加一个servlet就要在web.xml里添加<servlet><servlet-mapping>,随着项目的进度,servlet数目越来越可观.
web.xml里也密密麻麻的排满了<servlet><servlet-mapping>这些食之无味弃之崩溃的东西,有一种方法可以改善这种境况.
      在web.xml里添加如下的配置:
    <servlet>
        
<servlet-name>InvokerServlet</servlet-name>
        
<servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        
</servlet-class>
        
<init-param>
            
<param-name>debug</param-name>
            
<param-value>0</param-value>
        
</init-param>
        
<load-on-startup>-1</load-on-startup>
    
</servlet>
    
    
<servlet-mapping>
        
<servlet-name>InvokerServlet</servlet-name>
        
<url-pattern>/servlet/*</url-pattern>
    
</servlet-mapping>
      ok,现在web.xml里保留这一个servlet配置就可以满足所有的servlet调用了,比如调用UserManagerService这个servlet,在页面表单里这样写:
<form name="f" method="post" action="/servlet/com.mashiguang.servlet.UserManagerService">
      
<input/>
      
<submit/>
</form>
      注意表单action "/servlet/"后面是这个servlet class的全名.
posted @ 2007-07-06 19:17 mashiguang 阅读(1116) | 评论 (5)编辑 收藏

2007年7月4日 #

1.配置tomcat可以浏览web应用目录:
   修改%tomcat_home%/conf/web.xml,listings参数值为true代表可以浏览web应用的目录.

<init-param>
   
<param-name>listings</param-name>
   
<param-value>true</param-value>
</init-param>
posted @ 2007-07-04 18:29 mashiguang 阅读(117) | 评论 (0)编辑 收藏

仅列出标题  下一页