Net上传附件大小控控值(转)

Server Error

404 – File or directory not found.

The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.

 

用户上传一个大小大约为160MB的文件至服务器出现这个错误。Insus.NET把上传文件于本机测试没有问题。但上传至服务器时,这个错误产生了。

本地可以,服务器却Error。可以肯定程序代码没有问题,怎样说呢?Insus.NET 测试尝试上传另一个相同的文件格式,只是大小有所改变,大小约为25MB,它即能成功上传了。

Insus.NET检查了web.config文件,可以上传的文件限制已经设置相当大了200MB。

<system.web>   
    <httpRuntime maxRequestLength=”204800″ useFullyQualifiedRedirectUrl=”true” minFreeThreads=”8″ minLocalRequestFreeThreads=”4″ appRequestQueueLimit=”100″ enableVersionHeader=”true” executionTimeout=”6000″ />
  </system.web>

 

问题出于哪里?

找到资料,原来IIS 的maxAllowedContent Length的缺省值为30000000 bytes.  上传大于这个长度的数据流被截断,导致文件或目录找不到。

 

因此Insus.NET尝试在web.config更改这个设置,添加下面节点:

Net上传附件大小控控值(转)
<system.webServer>    
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength=”2097152000″ maxQueryString=”5000″ maxUrl=”8000″></requestLimits>
      </requestFiltering>
    </security>
  </system.webServer>
Net上传附件大小控控值(转)

 

 最后测试上传200MB的文件,能成功上传。

程序员的十大烦恼

10. 注释 — 只解释了“how”却没有解释“why”

入门级的编程课程通常会教育学生们写代码前先写注释、而且要尽量多注释。 这种教育的出发点是“多注释肯定比少注释好、少注释肯定比没注释好”。可不幸的是,很多的程序员把这当成了一种任务,对每一行代码都注释一下。

Java code?
1
2
3
4
5
6
r = n / 2// 让 r 等于 n 除以 2  
  
// 当 r - (n/r) 大于 t 时进行循环  
while ( abs( r - (n/r) ) > t ) {  
r = 0.5 * ( r + (n/r) ); // 设置 r 等于 r + (n/r) 的一半  
}

经过这样的注释,你否明白了这段代码是干什么的?的确,我也没明白。 问题就在于,虽然有大量的注释,可它们只是描述了代码是干什么了,却没有说明代码为什么要这样写。

现在,请看一下我们采用另外一种方式对同一段代码进行的注释:

Java code?
1
2
3
4
5
6
// 使用牛顿-Raphson算法求n的平方根近似值  
  
r = n / 2;  
while ( abs( r - (n/r) ) > t ) {  
r = 0.5 * ( r + (n/r) );  
}

这就好多了!也许我们还是不能完全明白这段代码的作用,但至少是有了一点方向了。

注释是用来帮助读者理解代码的,不是用来解释语法的。 我可以大胆的认为,读者对for循环的工作原理是了解的;所以没必要写这样的注释:“// 对客户列表进行for循环操作”。读者不明白的是你的代码是做什么用的,你为什么要采用这种方式实现它。

9. 干扰

很少有程序员能在眨眼之间从一种活动中转换到编程的状态中。通常情况下,我们更类似于需要慢慢启动的火车,而不是能突然加速的 法拉利; 我们需要一定的时间才能进入工作状态,一旦我们进入稳定有效的工作状态,我们的工作效果和产出会很丰硕。 不幸的是,当思路不断的被客户、经理、以及你的同事打断时,你的大脑很难进入编程的状态。

当我们干一件事情时,有太多的琐事需要我们放在心里,我们需要先放下这个事情,处理那个人事情,回头又干这个事情,还不能有差错。这些干扰会中 断我们的思路,而重新整理清楚思路又要你花费大量的时间,这是让人懊恼的、没有比这更让人泄气、让人有挫折感的过程了。

8. 范围蠕变(Scope creep)

范围蠕变(Scope creep) (也称作焦点蠕变(focus creep), 需求蠕变(requirement creep), 功能蠕变(feature creep),以及其它一些乱七八糟的演变词语),指在项目管理里项目的需求变更失控。 当一个项目的范围没有明确的定义清楚、没有文档化、不受控时就会出现这种现象。 这通常被认为是一种有负面影响的事情,应该尽力避免。

范围蠕变通常会把一个简单的需求变成一个复杂惊人的需要大量时间的巨无霸。 那些负责需求调研的家伙们只需要敲几下无辜的键盘就能把事情变成这样:

版本 1: 显示这个地区的地图

版本 2: 显示这个地区的地图,要三维立体的

版本 3: 显示这个地区的地图,要三维立体的,而且能够使用它作为飞行导航图

一个本来30分钟能完成的任务变成了一项要几百人/天才能完成的超级复杂的系统。更糟糕的是,大多数情况下,需求变更是发生在开发阶段 的,这样一来你需要重写代码,重新回归,有时要把前几天才开发的代码删除。

7. 管理者 — 完全不懂编程

管理工作不是一种简单的工作。人是一种让人很讨厌的动物; 我们善变、喜怒无常,我们都自以为天下第一。想让这样的一群人都感到满意和团结,你需要付出像山一样大的努力。 然而,这并不意味着管理者就可以在对下属的工作毫不理解的情况下进行管理。 当管理者对我们的工作没有一点知识概念时,后果只会是需求频繁变动,不现实的工期,普遍的挫折感(管理者和开发人员)。程序员们对此的抱怨相当普遍,这也是产生争执不合的根源。

6. 写文档

在说这个条目之前我先承认,我们确实有很多的文档生成工具,但据我的经验,这些工具都是只适合生成API文档,以供其他程序员参考。如果你开发 的软件是平时人们每天都要用的,你必须要写一些外行人(例如你的实施,客服等)都能理解的文档手册。

我们可以很容易的看出,有些事情程序员们极不愿意去做。 你可以简单的回顾一下所有的开源项目。 人们百折不挠的对这些项目的一个索求是什么:文档。
我敢打保票的说,不管在哪里,至少会有一半的程序员当要求写文档时会说:“不能让其他人去写吗?“。

5. 程序 — 缺少文档

我可从来没说过我们程序员是说一套做一套的人。 程序员们经常会在他们的项目里用到第三方的类库和应用。 于是,我们需要文档。 很不幸呀,就像我在第6条里说的那样,程序员们痛恨写文档。这戏剧性的事情发生在我们自己身上。

当你需要使用一个第三方类库时发现,至少有一半的API无从知道是干什么好用的,没有任何事情比这个更打击人的了。 函数 poorlyNamedFunctionA() 和函数 poorlyButSimilarlyNamedFunctionB() 有什么区别? 在我使用 PropertyX 属性前是否需要测试一下它是不是 null 值?我估计只有通过自己的测试和报错才能弄清楚!

4. 硬件

任何一个曾经被叫去调试一个数据库服务器上奇怪的宕机现象,或是被叫去解决RAID驱动器不能正确的工作的问题的程序员,当发现是硬件问题时, 都会痛苦不已。 人们有一种普遍的误解,认为程序员就是搞电脑的,他们肯定知道如何修理电脑。 不可否认,有些程序员确实是个全才,但我估计,绝大部分程序员都不知道,或者根本不关心当程序被编译成机器码后如何工作的。我们只关心做出来的东西是否符 合需求文档,这样我们才能集中精力去解决这上层的任务。

3. 含糊不清

“网站宕机了”. “XX功能工作不正常”。 处理含糊不清的任务是种痛苦。 每次当非程序员被要求重现他们所遇到的问题时表现出的愤怒都让我吃惊不已。 他们似乎不太明白,仅仅一句”它宕机了,修复它!”是无法让我们开始工作的,我们需要更多的信息。

软件的运行是(大部分情况下)有迹可寻的。我们也乐见与此。 请迁就我们,帮我们指出是在哪个阶段,什么情况下出的问题,而不是简单的说一句”修复它“。

2. 其他程序员

程序员经常和其他程序员合不来。诧异吗,但这是真的。 这方面的事情我可以轻松的列出十大条,讲细点甚至可以单独写篇博客,所以这里我只列出几个常见的、让其他同事感到懊恼的程序员的特征:

脾气暴躁以至态度极不友好。

不能明白什么时候该去讨论系统的架构,什么时候是应该去动手去做。

无法进行有效的沟通,使用易于误解的专业术语。

自己的事情处理不好。

对要做的程序和项目缺乏兴趣。

那么,这最后的,但不是最糟糕的,序号为1的让程序员们烦恼的…

1. 自己写的代码 — 6个月以后的

Don’t sneeze, I think I see a bug.

回顾一下自己以前写的代码,是否也会愁眉苦脸?当时怎么会这么愚蠢!怎么能编写成这样的东西!烧掉!丢到火里!

现实是,软件技术界是一个不断变化的世界。 今天被看成是最好的方式,明天也许就会过时。 我们不可能写出完美的代码,因为判断我们的程序好坏的标准日新月异。 这令人很不爽,你的作品,今天看来是那么的完美,但也许不久之后就会变成被人嘲笑的对象了。 真是让人沮丧,因为不论我们如何努力的学习最新最棒的开发工具,设计,框架,以及开发方法,我们总是比最新的技术发展趋势慢了一拍。 对于我来说,这是做一个程序员最苦恼的事情了。我们不断的升级技术,是为了让软件更好,但却禁不住感到,我就像一个做沙毯(sand-painting)的和尚。

如何在web上实现对另一个应用程序的键盘输入,就像vb中的sendkey



set   WshShell   =   CreateObject( “WScript.Shell “)

WshShell.SendKeys   “{ESC} ”

但是要提示一个安全警告,这个警告怎么去除?

这个问题原来在.com的时候也碰到过。也一直没有搞定。后来是自己写的上传组件。其实你已经如果打算用activeX,可以自己写一个File组件.如果是要上传,还可以将其写成一个FTP上传的东西,那样上传也许会更好的。

其实WScript.Shell中也有SendKeys这个方法,MSDN中用了Sleep(100),我不知道为什么,你也可以试试,这是一个例子。打开calc自己算一个东西。。

set   WshShell   =   WScript.CreateObject( “WScript.Shell “)

      WshShell.Run   “calc ”

      WScript.Sleep   100

      WshShell.AppActivate   “Calculator ”

      WScript.Sleep   100

      WshShell.SendKeys   “1{+} ”

      WScript.Sleep   500

      WshShell.SendKeys   “2 ”

      WScript.Sleep   500

      WshShell.SendKeys   “~ ”

      WScript.Sleep   500

      WshShell.SendKeys   “*3 ”

      WScript.Sleep   500

      WshShell.SendKeys   “~ ”

      WScript.Sleep   2500

PS:取得当前的Document对象的方法是,利用ShellWindows这个对象,具体请参看MSDN中的HOWTO:   Connecting   to   a   Running   Instance   of   Internet   Explorer   ID:   Q176792,不过说实话,这种方法并不太适用。因为你得通过一些手段区分哪个是自己的窗口。

使用iconv进行内码转换(Big5->GB2312)

i conv 是一个通过unicode 作为中间码实现各种内码间相互转换的库,它基本上囊括了世界上所有编码方式,例如,ASCIIGB2312 、 GBK 、 GB18030BIG5UTF-8UCS-2UCS-2BEUCS-2LEUCS-4UCS-4BEUCS- 4LEUTF-16 、 UTF-16BEUTF-16LEUTF-32UTF-32BEUTF-32LEUTF-7 等等等,除此之外,还包括 泰语、日语、韩语、西欧等国家语言的编码。下面我们演示如何使用iconv 实现Big5GB2312 的转换,当然只要简单修改一下便可实现iconv 支 持任何编码间的转换。 


下载 
libiconv
linux 版本的iconv ,可在 http://www.gnu.org/software/libiconv/  下载 
iconv
win32 版本可以在 http://gnuwin32.sourceforge.net/packages/libiconv.htm  下载 

SVN 源码 
另外,还有一些演示代码,需要的可以到我的SVN 下载 
http://xcyber.googlecode.com/svn/trunk/Convert/

标签: libiconv , iconv , Big5 , GB2312 ,  大五码  内码

代码片段(1)

[ 代码] [C/C++/Objective-C] 代码

001

/****************************************************************************

002

 *  Big5ToGB2312 – Convert Big5 encoding file to GB2312 encoding file

003

 *  File:

004

 *    Big5ToGb2312.c

005

 *  Description:

006

 *    Convert Big5 encoding file to GB2312 encoding file using iconv library

007

 *  Author:

008

 *    XCyber   email:XCyber@sohu.com

009

 *  Date:

010

 *    August 7, 2008

011

 *  Other:

012

 *    visit http://www.gnu.org/software/libiconv/ for more help of iconv

013

 ***************************************************************************/

014

 

015

 

016

#include <stdio.h>

017

#include <stdlib.h>

018

#include <tchar.h>

019

#include <locale.h>

020

#include “../iconv-1.9.2.win32/include/iconv.h”

021

 

022

//#pragma comment(lib, “../iconv-1.9.2.win32/lib/iconv.lib”)  // using iconv dynamic-link lib, iconv.dll

023

#pragma comment(lib, “../iconv-1.9.2.win32/lib/iconv_a.lib”)  // using iconv static lib 

024

 

025

#define BUFFER_SIZE 1024   //BUFFER_SIZE must >= 2

026

 

027

 

028

void usage()

029

{

030

    printf(“/nBig5ToGB2312 – Convert Big5 encoding file to GB2312 encoding file/n”);

031

    printf(“XCyber@sohu.com on August 7, 2008/n”);

032

    printf(”  Usage:/n”);

033

    printf(”      Big5ToGB2312 [Big5 file(in)]  [GB2312 file(out)]/n/n”);

034

}

035

 

036

 

037

int main(int argc, char* argv[])

038

{

039

    FILE * pSrcFile = NULL;

040

    FILE * pDstFile = NULL;

041

 

042

    char szSrcBuf[BUFFER_SIZE];

043

    char szDstBuf[BUFFER_SIZE];

044

 

045

    size_t nSrc  = 0;

046

    size_t nDst  = 0;

047

    size_t nRead = 0;

048

    size_t nRet  = 0;

049

 

050

    char *pSrcBuf = szSrcBuf;

051

    char *pDstBuf = szDstBuf;

052

 

053

    iconv_t icv;

054

    int argument = 1;

055

 

056

    //check input arguments

057

    if(argc != 3)

058

    {

059

        usage();

060

        return -1;

061

    }

062

 

063

 

064

    pSrcFile = fopen(argv[1],”r”);

065

    if(pSrcFile == NULL)

066

    {

067

        printf(“can’t open source file!/n”);

068

        return -1;

069

    }

070

 

071

    pDstFile = fopen(argv[2],”w”);

072

   &nbs

073

p;if(pSrcFile == NULL)

074

    {

075

        printf(“can’t open destination file!/n”);

076

        return -1;

077

    }

078

 

079

    //initialize iconv routine, perform conversion from BIG5 to GB2312

080

    //TODO: if you want to perfom other type of coversion, e.g. GB2312->BIG5, GB2312->UTF-8 …

081

    //just change following two paremeters of iconv_open()

082

    icv = iconv_open(“GB2312″,”BIG5″);

083

    if(icv == 0)

084

    {

085

        printf(“can’t initalize iconv routine!/n”);

086

        return -1;

087

    }

088

 

089

    //enable “illegal sequence discard and continue” feature, so that if met illeagal sequence, 

090

    //conversion will continue instead of being terminated

091

    if(iconvctl (icv ,ICONV_SET_DISCARD_ILSEQ,&argument) != 0)

092

    {

093

        printf(“can’t enable /”illegal sequence discard and continue/” feature!/n”);

094

        return -1;

095

    }

096

 

097

    while(!feof(pSrcFile))

098

    {

099

        pSrcBuf = szSrcBuf;

100

        pDstBuf = szDstBuf;

101

        nDst = BUFFER_SIZE;

102

 

103

        // read data from source file

104

        nRead = fread(szSrcBuf + nSrc,sizeof(char),BUFFER_SIZE – nSrc,pSrcFile);

105

        if(nRead == 0)

106

            break;

107

 

108

        // the amount of data to be converted should include previous left data and current read data

109

        nSrc = nSrc + nRead; 

110

 

111

        //perform conversion

112

        nRet = iconv(icv,(const char**)&pSrcBuf,&nSrc,&pDstBuf,&nDst);

113

 

114

        if(nRet == -1)

115

        {

116

            // include all case of errno: E2BIG, EILSEQ, EINVAL

117

            //     E2BIG: There is not sufficient room at *outbuf.

118

            //     EILSEQ: An invalid multibyte sequence has been encountered in the input.

119

            //     EINVAL: An incomplete multibyte sequence has been encountered in the input

120

            // move the left data to the head of szSrcBuf in other to link it with the next data block

121

            memmove(szSrcBuf,pSrcBuf,nSrc);

122

        }

123

 

124

        //wirte data to destination file

125

        fwrite(szDstBuf,sizeof(char),BUFFER_SIZE – nDst,pDstFile);

126

 

127

    }

128

    iconv_close(icv);

129

    fclose(pSrcFile);

130

    fclose(pDstFile);

131

 

132

    printf(“conversion complete./n”);

133

 

134

    return;

135

}

[转]mybatis下的分页,支持所有的数据库

大 家都知道,mybatis的自带分页方法只是逻辑分 页,如果数据量很大,内存一定会溢出,不知道为什么开源组织不在里面集成hibernate的物理分页处理方法!在不修改mybatis源代码的情况下, 应该怎么使mybatis支持物理分页呢?参考了网上的一些信息,有了下面的解决方法:以oracle为例子

 

1.把hibernate下的dialect包全部拷贝到mybatis包的jdbc目录下,如下图所示:

[转]mybatis下的分页,支持所有的数据库

 

2.定义一个ResultSetHandler  Interceptor

package cn.machi.utils;

import java.sql.Statement;
import java.util.Properties;

import org.apache.ibatis.executor.resultset.FastResultSetHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.RowBounds;

@Intercepts( {@Signature(type = ResultSetHandler.class, method = “handleResultSets”, args = {Statement.class})})
public class DiclectResultSetHandlerInterceptor implements Interceptor
{
   
    public Object intercept(Invocation invocation) throws Throwable
    {
        FastResultSetHandler resultSet = (FastResultSetHandler)invocation.getTarget();
       
        RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(resultSet,
                “rowBounds”);
       
        if (rowBounds.getLimit() > 0
                && rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
        {
            ReflectUtil.setFieldValue(resultSet, “rowBounds”, new RowBounds());
        }
        return invocation.proceed();
    }
   
    public Object plugin(Object target)
    {
        return Plugin.wrap(target, this);
    }
   
    public void setProperties(Properties properties)
    {
    }
}

 

3.定义一个StatementHandler的Interceptor

package cn.machi.utils;

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

import org.apache.ibatis.executor.statement.PreparedStatementHandler;
import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.jdbc.dialect.OracleDialect;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.RowBounds;

@Intercepts( {@Signature(type = StatementHandler.class, method = “prepare”, args = {Connection.class})})
public class DiclectStatementHandlerInterceptor implements Interceptor
{
   
    private static final String DIALECT = “org.apache.ibatis.jdbc.dialect.OracleDialect”;
   
    public Object intercept(Invocation invocation) throws Throwable
    {
        RoutingStatementHandler statement = (RoutingStatementHandler)invocation.getTarget();
        PreparedStatementHandler handler = (PreparedStatementHandler)ReflectUtil.getFieldValue(statement,
                “delegate”);
        RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(handler,
                “rowBounds”);
       
        if (rowBounds.getLimit() > 0
                && rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
        {
            BoundSql boundSql = statement.getBoundSql();
            String sql = boundSql.getSql();
           
            OracleDialect dialect = (OracleDialect)Class.forName(DIALECT)
                    .newInstance();
            sql = dialect.getLimitString(sql,
                    rowBounds.getOffset(),
                    rowBounds.getLimit());
           
            ReflectUtil.setFieldValue(boundSql, “sql”, sql);
        }
        return invocation.proceed();
    }
   
    public Object plugin(Object target)
    {
        return Plugin.wrap(target, this);
    }
   
    public void setProperties(Properties properties)
    {
    }
}

4.定义工具类ReflectUtil

package cn.machi.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.apache.log4j.Logger;


public class ReflectUtil
{
    private static Logger log = Logger.getLogger(ReflectUtil.class);
   
    private static Object operate(Object obj, String fieldName,
            Object fieldVal, String type)
    {
        Object ret = null;
        try
        {
            // 获得对象类型 
            Class<? extends Object> classType = obj.getClass();
            // 获得对象的所有属性 
            Field fields[] = classType.getDeclaredFields();
            for (int i = 0; i < fields.length; i++)
            {
                Field field = fields[i];
                if (field.getName().equals(fieldName))
                {
                   
                    String firstLetter = fieldName.substring(0, 1)
                            .toUpperCase(); // 获得和属性对应的getXXX()方法的名字 
                    if (“set”.equals(type))
                    {
                        String setMethodName = “set” + firstLetter
                                + fieldName.substring(1); // 获得和属性对应的getXXX()方法 
                        Method setMethod = classType.getMethod(setMethodName,
                                new Class[] {field.getType()}); // 调用原对象的getXXX()方法 
                        ret = setMethod.invoke(obj, new Object[] {fieldVal});
                    }
                    if (“get”.equals(type))
                    {
                        String getMethodName = “get” + firstLetter
                                + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字 
                        Method getMethod = classType.getMethod(getMethodName,
                                new Class[] {});
                        ret = getMethod.invoke(obj, new Object[] {});
                    }
                    return ret;
                }
            }
        }
        catch (Exception e)
        {
            log.warn(“reflect error:” + fieldName, e);
        }
        return ret;
    }
   
    public static Object getVal(Object obj, String fieldName)
    {
        return operate(obj, fieldName, null, “get”);
    }
   
    public static void setVal(Object obj, String fieldName, Object fieldVal)
    {
        operate(obj, fieldName, fieldVal, “set”);
    }
   
   
    private static Method getDeclaredMethod(Object object, String methodName,
            Class<?>[] parameterTypes)
    {
        for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
        {
            try
            {
                //superClass.getMethod(methodName, parameterTypes);
                return superClass.getDeclaredMethod(methodName, parameterTypes);
            }
            catch (NoSuchMethodException e)
            {
                //Method 不在当前类定义, 继续向上转型
            }
        }
       
        return null;
    }
   
   
    private static void makeAccessible(Field field)
    {
        if (!Modifier.isPublic(field.getModifiers()))
        {
            field.setAccessible(true);
        }
    }
   
   
    private static Field getDeclaredField(Object object, String filedName)
    {
        for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
        {
            try
            {
                return superClass.getDeclaredField(filedName);
            }
            catch (NoSuchFieldException e)
            {
                //Field 不在当前类定义, 继续向上转型
            }
        }
        return null;
    }
   
   
    public static Object invokeMethod(Object object, String methodName,
            Class<?>[] parameterTypes, Object[] parameters)
            throws InvocationTargetException
    {
        Method method = getDeclaredMethod(object, methodName, parameterTypes);
       
        if (method == null)
        {
            throw new IllegalArgumentException(“Could not find method [“
                    + methodName + “] on target [” + object + “]”);
        }
       
        method.setAccessible(true);
       
        try
        {
            return method.invoke(object, parameters);
        }
        catch (IllegalAccessException e)
        {
           
        }
       
        return null;
    }
   
   
    public static void setFieldValue(Object object, String fieldName,
            Object value)
    {
        Field field = getDeclaredField(object, fieldName);
       
        if (field == null)
            throw new IllegalArgumentException(“Could not find field [“
                    + fieldName + “] on target [” + object + “]”);
       
        makeAccessible(field);
       
        try
        {
            field.set(object, value);
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
   
   
    public static Object getFieldValue(Object object, String fieldName)
    {
        Field field = getDeclaredField(object, fieldName);
        if (field == null)
            throw new IllegalArgumentException(“Could not find field [“
                    + fieldName + “] on target [” + object + “]”);
       
        makeAccessible(field);
       
        Object result = null;
        try
        {
            result = field.get(object);
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
       
        return result;
    }
   
}

5.更新mapper configuration文件,添加如下几条,注意plugins在整个configuration文件中的顺序

<plugins>
<plugin interceptor=”functionPoint.db.DiclectStatementHandlerInterceptor”/>
<plugin interceptor=”functionPoint.db.DiclectResultSetHandlerInterceptor”/>
</plugins>

6.使用方法同mybatis逻辑分页,拦截器会自动拦截执行SQL的地方,加上分页代码:

getSqlSession().selectList(mapId, queryKey,new RowBounds(pageId, pageSize));

 

好了,大功告成!

LINUX下用HP的IML工具查看服务器的日志信息

LINUX下用HP的IML工具查看服务器的日志信息

    打开“控制终端”,在里面输入: cd /media/cdrom/Compaq/csp/linux/install740.sh 会直接进行安装。

1.PSP 安装完成后,打开浏览器。输入: https://127.0.0.1:2381

2. 输入完用户名和密码后登录到 System Management Homepage 的画面。点击 LOGS

3. 可以在 LOGS 下,看到 IML 的有关硬件的日志及报错信息

4. 也可以在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hpimlview 来查看 IML 的日志。

5. 打开 IML 后可以用 TAB 键进行切换。按 ENTER 键,就能查看到每一条日志信息的详细内容。 ( 但在此次实验中这个 IML 的日志无法保存出来。 )

6. 在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hplog 可以查看当前 CPU 温度、系统风扇、电源情况、 PCI route 表 及 ASR 的一些数据。 ( 见下图 )

7. 在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hpuid 可以控制和查看 UID 灯的状态。

8. 在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hpasmcli 。然后再键入 Help 之后,有 CLEAR 、 DISABLE 、 ENABLE 、 EXIT 、 HELP 、 QUIT 、 SET 、 SHOW 的选项。(如 : 在 disable 下 关闭 HT . )

9. 运行 SHOW 可以查看列表中列出的信息

10. 键入 show server 后可以看到:机器的型号、机器的序列号、 BIOS 的版本、 ILO 、集成网卡的 MAC 地址、 CPU 的信息、内存的信息。

11. 键入 SHOW BOOT 可以看启动顺序。键入 SHOW FANS 可以查看风扇的状态。键入 SHOW HT 可以查看超线程是否开启。键入 SHOW IML 可以看 IML 的日志及信息。

 

 

HP ProLiant DL380 G6 服务器系列 – 自动重启的故障排查

1. 首先查看服务器是否有诊断灯报警。如果有则对应insight display 诊断版灯来确认是何种硬件故障。

 LINUX下用HP的IML工具查看服务器的日志信息

2. 检测DL380 G6服务器的firmware版本, proliant support pack包是否是最新。如果不是最新的hp 建议您更新到最新。

需要点击开始–程序–HP System Tools–hp insight diagnostic online edition之后里面可以查看firmware版本和proliant support pack 版本。

3. 检测服务器兼容性列表, 确认该系统是否能在DL380G6上兼容。

查看方法 :点击 此处 查看操作系统兼容性列表。

4. 收集日志,收集IML日志, 系统日志,survey 报告查看报错。

收集IML日志方法 :点击开始–程序–HP System Tools–HP Proliant Integrated Management Log Viewer 收集IML 日志

收集survey日志方法 :需要点击开始–程序–HP System Tools–hp insight diagnostic online edition 收集survey 报告

收集系统日志 :windows 在运行里面输入eventvwr之后可以保存系统日志和应用程序日志。

linux 中/var/logs

collectd

collectd是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。比如以RRD 文件形式。

当系统运行和存储信息的时候,Collectd会周期性统计系统的相关统计信息。那些信息可以用来找到当前系统性能瓶颈。(如作为性能分析 performance analysis)和预测系统未来的load(如能力部署capacity planning).如果你需要美观的图形来显示您的数据,并且已经厌烦了内部解决方案,恭喜您,你找到了正确的地方。

一般来说,一图胜过千言,所以这里显示了某个系统在过去60分钟内的CPU利用率图形。

collectd

在互联网上还有其他的免费,开源的项目类似于collectd的项目。为什么你要选择collectd呢?和其他项目相比,我们觉得collectd有一些主要的特点:第一,它完全是由C语言编写,故性能很高,可移植性好,它允许运行在系统没有脚本语言支持或者cron daemon的系统上,比如嵌入式系统。同时,它包含优化以及处理成百上千种数据集的新特性。collectd包含有超过70多种插件,其中有标准的case到非常特殊和高级的专题。同时,collectd提供强大的网络联网特性,它能以多种方式来扩充。最后,collectd开发及时同时文档支持也是非常好的。

虽然collectd能够很大程度满足您的管理需求,但是它还是存在一些不足:
-它本身不能生成图形。虽然它能写RRD文件,但是它不能从这些文件生成图形。在contrib/ 目录下包含简单的脚本,可以看看kcollectd,一个X window前端和drraw,一个非常通用的解决方案。
-监控功能已经被添加到了4.3版本,但是至今它只能进行简单门阀检测。

如何将GlassFish作为Windows服务运行

    本文档来自GlassFish官方网站,详细介绍了将 GlassFish 作为 Windows 服务运行设置方法。

Glassfish 附带一个名为 appservService.exe 的 Windows 可执行文件,它可与 Windows 服务控制器通信。其工作方式类似于 Java Service Wrapper 等程序。您为 Glassfish 创建的 Windows 服务使用几个参数来启动 appservService.exe,这些参数告知它在启动和停止时要执行哪些 asadmin 命令。

Glassfish 并未附带可为 appservService.exe 轻松创建 Windows 服务的工具,但是 Sun Java Application Server 9.x 的安装程序有一个 “Install as a Windows service” 复选框。如果您要为 Glassfish 创建 Windows 服务,则该说明中给出了可从命令提示符运行的一个相当大的命令。如果 Glassfish 安装路径包含空格,例如 C:/Program Files/Sun/GlassfishV2
uff0c那么查找正确方法对转义字符进行转义就变得复杂而不是快速了。

GlassfishSvc.jar

Ryan de Laplante 提供了一个简单的命令行工具,通过它可以轻而易举地创建 Windows 服务。下载 GlassfishSvc.jar(源代码),并将其复制到 Glassfish 安装路径(例如 C:/Program Files/Sun/GlassfishV2
uff09,然后从命令行运行以下命令:

C:/Program Files/Sun/GlassfishV2>java -jar GlassfishSvc.jar -i 

glassfishsvc v1.0 (Aug 19 2007)

Service name : GlassfishAppServer Glassfish installation path : C:/Program Files/Sun/GlassfishV2 Glassfish domain : domain1 Glassfish admin username : admin

Installing service… Done.-i 参数将使用默认选项安装服务。命令行参数的完整列表如下:

glassfishsvc v1.0 (Aug 19 2007)

DESCRIPTION: Installs and uninstalls a Windows service for Glassfish

USAGE: java -jar glassfishsvc.jar [-i | -u] [OPTIONS]

-i        Installs a Windows service for Glassfish. -u        Uninstalls a Windows service for Glassfish. -n name   Name for the Windows service. Use double quotes around names that contain spaces.  Defaults to GlassfishAppServer. -d path   Directory where Glassfish is installed. Use double quotes around paths with spaces, and escape back slashes. Defaults to current directory. -m domain Name of the Glassfish domain to start and stop. Defaults to domain1. -a user   Glassfish admin user name.  Defaults to admin. -p pwd    Glassfish admin password.  A password.txt file will be created in the Glassfish install directory containing the password in plain text, and the Windows service will be configured to read from it. This is usually not necessary. If no password is passed in, the password.txt file will not be created.

EXAMPLES: java -jar glassfishsvc.jar -i java -jar glassfishsvc.jar -i -p adminadmin java -jar glassfishsvc.jar -i -n MyServiceName -d "C://Program Files//Sun//Glassfish" -m myDomain -a admin5 -p secretpwd java -jar glassfishsvc.jar -u java -jar glassfishsvc.jar -u -n MyServiceName

AUTHOR: Ryan de Laplante ﹤ryan at ijws dot com>

群集配置文件

如果您安装了 Glassfish 群集配置文件,则 Glassfish 会在服务启动时询问管理员密码。要避免询问此问题,请在安装服务时使用 -p 选项。在 Glassfish 根目录中将创建 password.txt 文件,其中包含纯文本形式的密码。Windows 服务将配置为使用此文件,以便它可以在无人参与的情况下启动。您应该确保在此文件创建后对其配置相应的 NTFS 安全性,以便未授权用户对它没有读取或写入访问权限。

Windows 用户注销

默认情况下,JVM 可以捕获来自 Windows 的指示 OS 正在关闭或用户正在注销的信号,并正常地自行关闭。这意味着,一旦用户从 Windows 中注销,Glassfish 服务便会关闭。这有违于使用 Windows 服务的初衷,因此需要使用 -Xrs JVM 选项关闭此 JVM 功能。

打开 ﹤GF_HOME>/domains/domain1/config/domain.xml 文件,并查找含有大量 ﹤jvm-options>某个 JVM 选项﹤/jvm-options> 行的部分。在该部分中添加以下行:

﹤jvm-options>-Xrs﹤/jvm-options>

保存并关闭 domain.xml。如果 Glassfish 服务已在运行,请重新启动它以使更改生效。

注意:有报告指出,在某些 Windows 2003 Server 安装中将 -Xrs jvm-option 添加到 domain.xml 无法解决此问题。所报告的解决方案是将 jvm 选项添加到 ﹤GF_HOME>/lib/processLauncher.xml:

﹤process name=”as9-server”>

﹤sysproperty key=”-Xrs”/>

堆栈Stack介绍

堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。

Stack 类的方法和属性

下表列出了 Stack 类的一些常用的 属性

属性 描述
Count 获取 Stack 中包含的元素个数。

下表列出了 Stack 类的一些常用的 方法

序号 方法名 & 描述
1 public virtual void Clear(); 
从 Stack 中移除所有的元素。
2 public virtual bool Contains( object obj ); 
判断某个元素是否在 Stack 中。
3 public virtual object Peek();
返回在 Stack 的顶部的对象,但不移除它。
4 public virtual object Pop();
移除并返回在 Stack 的顶部的对象。
5 public virtual void Push( object obj );
向 Stack 的顶部添加一个对象。
6 public virtual object[] ToArray();
复制 Stack 到一个新的数组中。

 

实例

下面的实例演示了堆栈(Stack)的使用:

using System; using System.Collections;  namespace CollectionsApplication {     class Program     {         static void Main(string[] args)         {             Stack st = new Stack();              st.Push('A');             st.Push('M');             st.Push('G');             st.Push('W');                          Console.WriteLine("Current stack: ");             foreach (char c in st)             {                 Console.Write(c + " ");             }             Console.WriteLine();                          st.Push('V');             st.Push('H');             Console.WriteLine("The next poppable value in stack: {0}",              st.Peek());             Console.WriteLine("Current stack: ");                        foreach (char c in st)             {                Console.Write(c + " ");             }             Console.WriteLine();              Console.WriteLine("Removing values ");             st.Pop();             st.Pop();             st.Pop();                          Console.WriteLine("Current stack: ");             foreach (char c in st)             {                Console.Write(c + " ");              }         }     } }

当上面的代码被编译和执行时,它会产生下列结果:

Current stack:  W G M A The next poppable value in stack: H Current stack:  H V W G M A Removing values Current stack:  G M A