L's profile行走在人生的边缘PhotosBlogLists Tools Help

Blog


    09/10/2005

    oracle数据大小超过字段的最大值....

    在项目中遇到这个问题,找了半天原因,最后想用CLOB类型了,不甘心,最后终于找到了这篇文章,记录下来,备忘。
     
    一般我们在java中使用数据库操作时,都是用PreparedStatement。可是该方法在Oracle9i
    中却出现问题,应该是Oracle的jdbc的问题,即使在现在的oracle9i中仍然出现。

    在Oracle中的varchar2字段类型的最大长度是4000。如果你定义了一个varchar2(4000)的字
    段,在java语言中使用PreparedStatement的setString()方法插入或更新该字段,一旦你放
    进库中的内容是2001个英文字符,或者667个中文字符,数据库立即抛出SQLException异常,
    报错:...数据大小超过字段的最大值....


    解决方法是对varchar2字段定义超过2000长的字段,改用setCharacterStream()方法。例如:


        
        .......
        
        String content = "mycontent";
        String strSQL = "INSERT INTO mytable(id, content) VALUES( ? , ? )";
        PreparedStatement stmt = conn.prepareStatement( strSQL );
        
        
        stmt.setString( 1, 'net7b.com' );
        
        // can't use setString() method if your content's length upto 2000
        stmt.setCharacterStream( 2, new StringReader( content, content.length() ) );
        stmt.executeUpdate();

        ......
        
        
        

    以上问题在long字段类型中也会出现。
    31/08/2005

    Linux的zone问题

    今天忽然间发现了还有个历史遗留问题未解决:两台Linux服务器,一模一样的时间,但文件从一台copy到另一台时,文件的时间总是会莫名其妙的减少整整4个小时!仔细对比了下,发现问题就出在zone上,一个是CST另一个是GET!没想到Linux下会自动计算时差……
    好,调整下zone,使用命令timeconfig,然后选择相应的时区,确定,退出。使用setup也可以进入timeconfig,还可以停止apache服务……等等
    • 调整Linux时间命令:date -s hh:mm:ss
    • 调整Linux日期命令:date -s yyyymmdd
    • 查看进程命令:ps -aef|grep xxx
    • 帮助命令:man xxx
    • ……
     
    05/08/2005

    用httpclient提交表单

    前两天接到一个任务,somebody想偷懒,想要个程序来代替他自己在某网站上人工去重复提交几百次表单。刚看到需求茫然不知从何下手,虽然知道有这样程序,但之前都没有去想过怎么实现,后试着用HttpConneciont去做,发现当connect了它的登录jsp后,接下来的业务操作URL一直返回用户没登录,原来使用HttpConnection需要自己去获取JSessionId来通知web容器当前操作已经登录,我是懒人喜欢偷懒,没办法只能关门放出“狗狗”,功夫不负有心人,原来这个世界还有httpclient滴,使用了httpclient所有问题迎刃而解,我只需要使用GetMethod、PostMethod方法就搞定,简单明了,不需要我去管session的维护。
    另ieHTTPHeaders是个很不错的查看httpHeader的IE插件
    18/07/2005

    续:tomcat5.5.9和rsync不得不说的问题

    上次说的TOMCAT不重新编译JSP的问题,到了今天终于水落石出:原来是rsync的source服务器的系统时间居然被设成了2004年!而其他3台dest服务器的系统时间是2005年,所以rsync同步过去的jsp文件最后被修改时间都是2004年的,tomcat一对比系统时间是2005年所以理所当然认为jsp没有被更新过落!
    不过还没来得及高兴又发现另一个另人沮丧的问题:3台dest服务器只有2台是同步成功的,而剩下那台出现的问题真是叫人郁闷得想撞墙,也不知道是什么回事,当source服务器的index.jsp被修改后,偏偏这台机器同步就不理会index.jsp已经被修改过,而source服务器其他的文件修改后,这台机器都会同步修改,而且试过把这台机器的index.jsp删除后,再执行同步,就会把source服务器的index.jsp同步过来,真是无知点解:(
    唉,又得开始漫漫寻求答案……
    15/07/2005

    tomcat5.5.9和rsync不得不说的问题

    项目里采用了4台web服务器,使用tomcat5.5.9+jdk1.5,为了更新代码方便,所以我们只手工更新其中一台服务器,其他3台服务都是通过rsync自动同步。谁知道这样居然会出现这样一个非常郁闷的问题,手工更新的那台服务器的jsp,tomcat就会重新编译,另外3台死活都不会,访问站点看到的都是旧的JSP,但使用vi查看另外3台服务器的jsp都是更新后的(证明rsync是正常工作了)
    这个问题折磨了我大半天,最后试着直接用vi手工去修改另外3台的jsp文件,发现tomcat是会重新编译的,那就证明,虽然rsync是同步更新了文件,但tomcat却没有发现这些文件已经被更新了:(
    关于这个问题的解决办法,目前还没答案,只能等下试试修改tomcat里的web.xml里的checkInterval项,让tomcat每隔一定时间去检查文件是否有更新,结果如何,期待ing
    14/06/2005

    Struts的validate问题

    虽然说自己用Struts也有些时间了,也做过了好几个项目,每次都是赶进度完成任务,都没有去想过这个validate机制的问题,以前都是client端脚本验证,然后action里判断再forward到error page去。今天自己想用form里重载validate()方法来实现server端验证,在validate里去做判断,有error就把一个message加入到errors对象里,由Struts自动加入到request里,然后在JSP上用<html:errors property="xxx"/>来显示message信息。遇到JSP里抛可恶的500内部服务器错误,但是所有的日志文件里都找不到异常信息,郁闷死,按照以前的经验来看通常这种情况(没有任何异常信息的500错误)都是Struts的forward的问题,然后想想validate的流程,如果返回的errors为空或长度为0,那么就正常返回到action的excute去处理(这是符合我碰到的实际情况的,如果输入正常,那么出来的结果也正常);如果errors有值那么就返回退出,不执行到action的excute,回到原来的input去(我的log信息也的确反映是在return errors后才出500错误),那这样看来问题是出在input上,去检查Strutst-config.xml发现果然action 里没有配置input,汗啊,以后真的要再细心点才行,切记,切记。

    13/06/2005

    getOutputStream()生命周期问题

    2005-01-18 09:38:18 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
    org.apache.jasper.JasperException: getOutputStream() has already been called for this response
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:254)
    ……

    在做登录随机验证码时,每次后台都抛这个异常,但却又不影响功能正常实现。这个问题我很迷惑,难道getOutputStream()的生命周期不时一次正常的request/response周期吗?为什么我每次刷新都说has already been called for this response,今天早上试着加上out.clear()后就一切正常,无解……

    08/06/2005

    flatten="true"

       <copy todir="${tomcat.home}/webapps/${ant.project.name}/WEB-INF/lib" flatten="true">
          <fileset dir="${dir.lib}">
            <patternset>
              <include name="**/*.jar"/>
              <include name="**/*.zip"/>
            </patternset>
          </fileset>
        </copy>

    原来在ant里,可以这样写,把不同lib目录下的JAR包一copy到lib目录下的,开始偶是一个一个目录分开去copy,汗啊,效率真TMD低……

    04/06/2005

    二级域名解析和URL转向

    昨天晚上想把games.iuni.com.cn这个二级域名解析并指向到http://partner.it.com.cn/games去,搞了很久,最终还是没成功,到了早上醒来又试了一下,哈哈,成功了。把这个过程记录下来,也算是一种总结吧。

    做域名解析,有三种类型:A类型(地址类型,也就是直接解析到一个IP地址上);MX类型(邮件服务器记录类型);CNAME类型(别名类型)

    最开始我是把games.iuni.com.cn用A类型解析到 219.136.248.118(partner.it.com.cn),从理论上来说应该可以看到http://partner.it.com.cn内容,结果却无法打开网页。发现直接访问http:// 219.136.248.118是无法打开网页的,那么我把games.iuni.com.cn解析过去理所当然也是无法打开网页。

    那就换种思路,我把games.iuni.com.cn用CNAME类型做别名,直接指到partner.it.com.cn或者partner.it.com.cn/games,然而结果都一样,都还是无法打开网页。我用nslookup games.iuni.com.cn来查看,发现域名解析很不稳定,一下是解析成功,一下是无法解析,我猜测这是DNS服务那边更新没有同步(因为我一直在改变这个解析),但是我想用这种别名的方式应该是可以达到目的的,只是不知道为什么我就没试验成功(不知道对不对?)

    到了早上,参考了一下别人做的解析,发现先把games.iuni.com.cn用A类型解析到61.135.129.21去,然后再用URL转向,把games.iuni.com.cn转向到http://partner.it.com.cn/games,结果就成功了。奇怪!这里我也没搞明白,这个61.135.129.21 IP地址是那里的服务器?为什么解析到这里,再转向就可以达到目的了?……搞不明白