MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1,摘自http://www.javaeye.com/topic/13335
Oracle9iR2和Oracle10G以上版本已经可以直接进行clob的插入,条件查询,模糊查询了。这一点,你可以试一试,我这周周一刚刚在 Oracle10.1.0.3 Linux x86上面试过,不管是where还是like,就像varchar2一样处理。
另外将Oracle JDBC Driver升级到最新的版本,即Oracle10.1.0版本同时发布的odjbc14.jar,那么你将直接可以对clob进行操作。
也就是说,如果你使用最新的Oracle JDBC Driver,使用比较新的Oracle版本,你就可以直接像操作varchar2那样操作clob,没有任何限制了。
4000字符的限制完全是因为Oracle的Thin Driver造成的,用OCI Driver是不会有这个问题的。也就是说,这个限制与驱动相关与数据库无关。
我试过使用10g的驱动跑9i的数据库,操作CLOB字段就和操作varchar2一样,并且没有4000的限制。一换成9i的Driver就错误依旧。。。8i的没有测试过,不过原理应该一样。
像Robbin说的那样,我用的是最新的最新的Oracle Database 10g (10.1.0.2.0) 驱动程序,数据库是Release 9.2.0.1.0 ,插入一条10万多字符的数据到clob类型的字段,抛出异常:Caused by: java.sql.SQLException: setString 只能处理少于 32766 个字符的字符串。我试了多次,还是无法解决。
Robbin说的没错,我试过了在xxx.hbm.xml中将数据库中Clob类型的字段映射成Hibernate的text类型,没有任何限制,但是映射成java.lang.String类型却有32K大小的限制。
oracle 10g 的驱动的确好
thin driver 也能顺利按照 String 方式处理 Clob 字段,可以适用于 8.16 以后的所有版本
映射成text在同一列中有多个clob字段的时候有bug,
保存时会将后一个字段的内容保存到前一个字段里面去,不知道什么原因,我实在有些莫名其妙。
换成spring的ClobStringType后一切正常
经测试,使用 Oracle 10g 的 JDBC 驱动,可以把 LONG 类型的字段当成超长的 VARCHAR2 类型字段看待。
注意:数据库中应该使用 LONG 型,而不是 CLOB 类型。使用 CLOB 类型,如果有中文,会莫名其妙的丢掉一些字符。这应该是 Oracle 的一个 bug。
适用于 Oracle 9.2 以上版本的数据库。(注意仅仅是使用 10g 的 JDBC 驱动而已,即 ojdbc14.jar 包)

参考:
* Oracle JDBC 驱动下载地址 http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
* Handling CLOBs - Made easy with Oracle JDBC 10g http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html

posted @ 2009-07-31 00:05 leekiang 阅读(912) | 评论 (0)编辑 收藏

1,
oracle10g装了几个实例,就会在service里看到多个OracleService,同时有多个OracleDBConsole,
只有OracleDBConsole起来了,才能访问http://127.0.0.1:1158/em,
那么如何知道每一个em的http端口呢?
有人说在oracle\product\10.2.0\db_1\sysman\config\emca.properties,
看了一下只有默认端口DBCONTROL_HTTP_PORT_DEFAULT为1158
后来在oracle\product\10.2.0\db_1\install\install\portlist.ini里
发现了每一个实例的Enterprise Manager Console HTTP 端口

posted @ 2009-07-30 16:41 leekiang 阅读(245) | 评论 (0)编辑 收藏

这个startup.bat脚本就是提供给使用者用来修改的,我们可以在其中设置JAVA_HOMECATALINA_HOME等环境变量,但我们并不需要深入到较为复杂的catalina.bat脚本中,这正是startup.bat脚本的真正用意所在。我们知道,软件设计模式中有一个重要的原则就是开闭原则,即我们可以允许别人扩展我们的程序,但在程序发布后,我们拒绝任何修改,因为修改会产生新的Bug,使得我们已经Bug-free的程序又要重新测试。开闭原则是面向对象世界中的一个非常重要的原则,我们可以把这个原则从Java类扩展至源代码级别。startup脚本就是要求用户不要修改catalina.bat脚本,这是符合软件设计思想的。我们如果想要彻底贯彻这个重要的软件设计原则,可以写一个新脚本tomcat.bat,脚本内容大致如下:

set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28
call %CATALINA_HOME%\bin\startup.bat

这个tomcat.bat文件可以存放在任何目录并能执行,并且不需要修改tomcat自带的任何脚本及其它环境变量,这就彻底贯彻了开闭原则。

浅析Tomcat的启动 http://www.56base.com/blog/u/evian/archives/2008/118.html

posted @ 2009-07-30 13:57 leekiang 阅读(269) | 评论 (0)编辑 收藏

前几天做项目的过程中,利用到Apache项目中的POI来实现基于Excel的数据模板输出,其中利用公式的方式嵌入超链接进行网页链接访问。  
  自己做了一些处理EXCEL单元格的方法,但在进行公式处理时,由于POI的问题,显示的公式信息一直都是乱码,后来在网上找到一些朋友关于这些问题的解 决方法,感觉帮助很大。因此,结合自己的实践经验,把修改POI内部源码的过程写出来,以其对资料做一整理,希望对后来的朋友也有所帮助。  
   
  1、首先,上网找到POI的发布版本的源码,我下的是poi-src-2.5.1-final-20040804.zip这个版本。  
  2、找到StringPtg.java这个文件,在解压后的\src\java\org\apache\poi\hssf\record\formula文件夹下面  
  3、利用文本编辑工具对StringPtg.java进行编辑  
  4、找到public   StringPtg(byte   []   data,   int   offset)这个方法,  
  对其修改如下  
  /**   Create   a   StringPtg   from   a   byte   array   read   from   disk   */  
          public   StringPtg(byte   []   data,   int   offset)  
          {  
                  offset++;  
                  field_1_length   =   data[offset];  
                  field_2_options   =   data[offset+1];  
                  if   (fHighByte.isSet(field_2_options))   {  
                          //   modified   by   rainsoft    
                          //   in   excel   chinese   is   stored   two   bytes   HIGH   bytes,LOW   bytes  
                          //   field_3_string=   StringUtil.getFromUnicode(data,offset+2,field_1_length);  
                          field_3_string=   StringUtil.getFromUnicodeHigh(data,offset+2,field_1_length);  
                  }else   {  
                          field_3_string=StringUtil.getFromCompressedUnicode(data,offset+2,field_1_length);  
                  }  
                                     
                  //setValue(new   String(data,   offset+3,   data[offset+1]   +   256*data[offset+2]));  
          }  
  其中主要利用getFromUnicodeHigh方法替换原有的方法进行处理。  
  5、再查找StringPtg(String   value),做如下的修改,  
   
  public   StringPtg(String   value)   {  
                  if   (value.length()   >255)   {  
                          throw   new   IllegalArgumentException("String   literals   in   formulas   cant   be   bigger   than   255   characters   ASCII");  
                  }  
                  this.field_2_options=0;  
                  //   add   by   rainsoft  
                  //   two   bytes   char   options   must   be   "1"              
                  try   {  
                      if   (value.length()!=value.getBytes("GBK").length)  
                          this.field_2_options=1;  
                  }   catch   (Exception   e)   {  
                  }  
                  //   end   add  
                  this.fHighByte.setBoolean(field_2_options,   false);  
                  this.field_3_string=value;  
                  this.field_1_length=(byte)value.length();   //for   the   moment,   we   support   only   ASCII   strings   in   formulas   we   create  
          }  
   
  6、至此对源文件的修改就结束了,下一步则需要对其进行编译输出。  
  7、利用docs/howtobuild.html的描述进行编译输出。  
  8、成功编译输出的POI???????.jar文件,复制到原有的编译路径,替换到原有的文件即可,最好删除原有的   POI文件。 
http://topic.csdn.net/t/20060309/10/4602637.html

posted @ 2009-07-29 15:59 leekiang 阅读(1347) | 评论 (0)编辑 收藏

http://bbs.blueidea.com/archiver/tid-2938030.html
http://tagsoup.com/cookbook/css/fixed/
http://bbs.51js.com/viewthread.php?tid=84761
http://www.happinesz.cn/archives/991/
网易论坛、凤凰论坛

posted @ 2009-07-23 15:16 leekiang 阅读(206) | 评论 (0)编辑 收藏

喜欢使用Firefox的朋友,一定安装了许多插件来丰富浏览器的使用体验。但是每当重新安装Firefox浏览器后,原先安装的插件全都需要重新 安装,浪费了不少的时间。今天就介绍如何备份Firefox的方法,以后每次重装完,只要恢复一下就能还原以前的Firefox配置便可,非常方便。

Firefox浏览器的配置都被保存在下面的几个文件夹下,其实方法十分简单,只要把下面的目录备份了,再次安装Firefox之后,将这几个文件夹覆盖就可以还原以前的配置了。
  c:\Documents and Settings\用户名\Application Data\Mozilla\Firefox
  C:\Documents and Settings\用户名\Local Settings\Application Data\Mozilla\Firefox

http://meilanzh.blogspot.com/2009/02/firefox.html

一、还原书签:
不知什么原因,突然firefow不能访问了,只好卸载后重装。按照下列步骤恢复书签。
第一步:先将C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles文件进行复制。
第二步:卸载firefox。
第三步:重装firefox。
第四步:将profiles复制到原来位置。此时打开firefox,可以发现原来的书签并未恢复。
第五步:按下shift+ctr+b键, 打开书签管理器。或直接点击书签菜单下的“管理书签”。
第六步:点击“导入以及备份/恢复/选择文件”,找到bookmarkbackups文件夹:C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles\XXXXXXXXX.default\bookmarkbackups。
第七步:选择某日备份的书签文件,如:bookmark-2009-01-31.json。点击完成导入。
这时,再次打开firefox,就可以看到原来的书签了。

二、还原插件
将复制下来的profiles\extentensions\下的文件粘贴在安装目录下C:\Program Files\Firefox Plus\App\firefox\extensions里。打开firefox,就可以看到原来的firefox了!

posted @ 2009-07-23 13:30 leekiang 阅读(1272) | 评论 (0)编辑 收藏

[org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session
org.hibernate.HibernateException: Unexpected row count: 0 expected: 1
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:32)

    先用对象操作得到Person p = get(Person.class,35);
    直连得到connection,执行delete person where id=35
    
    事务提交前hibernate会对对象进行检查,看属性是否有变化,如果有变化就会执行update操作。
    事务方法内既有对象操作,又有sql时,往往sql先执行,
    id=35的记录已经被删了,再执行update 35时就会报那个臭名昭著的HibernateException: Unexpected row count: 0 expected: 1,不能同步数据库状态
    为什么有的记录删除时会update,有的却没有?开始一直没找到原因,因为update语句太长了,
    后来灵机一动,在映射里加了dynamic-update="true",update语句变成了可爱的update Person set zd=? where ID=?
    一查AbstractPerson,发现getZd()被修改了:
        public String getZd() {
        if (zd != null)
            return zd;
        else
            return "";
       }
    这样凡是zd为null的记录,删除时都会报错。
    
    总结:(1)HQL和sql共用时要小心,一不小心就出现数据不同步,有空看看事务的处理
          (2)映射的类里的get方法不要随便修改

posted @ 2009-07-22 11:13 leekiang 阅读(2435) | 评论 (0)编辑 收藏

Ajax的应用中,由于安全的问题,浏览器默认是不支持跨域调用的。传统解决的方法,包括:(参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)

Local proxy:
Needs infrastructure (can't run a serverless client) and you get double-taxed on bandwidth and latency (remote - proxy - client).
Flash:
Remote host needs to deploy a crossdomain.xml file, Flash is relatively proprietary and opaque to use, requires learning a one-off moving target programming langage.
Script tag:
Difficult to know when the content is available, no standard methodology, can be considered a "security risk".

以上方法都各有缺陷,都不是很好多解决方案。后来出现了一种叫JSON with Padding 的技术,简称 JSONP .(原理参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),应 用JSONP可以实现JSON数据的跨域调用。非常的幸运,JQuery1.2以后支持JSONP的应用。下面侧重说明在JQuery中,Json的跨域 调用。

      应用JSONP实现Json数据跨域调用,需要服务器端与客户端的合作完成。引用Jquery官方的例子,客户端掉用如下:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#images");
if ( i == 3 ) return false;
});
});

 

    注意这里调用的地址中jsoncallback=?是关键的所在!其中,符号会被Query自动替换成其他的回调方法的名称,具体过程和原理我们这里不理 会。我们关心的是jsoncallback=?起什么作用了?原来jsoncallback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什 么工作呢?服务器要接受参数jsoncallback,然后把jsoncallback的值作为JSON数据方法名称返回,比如服务器是JSP,我们会这 样做:

 

      ...

      String jsoncallback=request.getParameter("jsoncallback");

      ...

      out.print(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");

 

Jquery取得的数据可能如下:

      JQUET0988788({"account":"XX","passed":"true","error":"null"})

 

总结,用JSONP要做两件事:

      1/请求地址加参数:jsoncallback=?

      2/服务器段把jsoncallback的值作为方法名传回来,如JQUET098788(...)

参考:

http://www.javaeye.com/topic/169765

http://www.javaeye.com/topic/260647

posted @ 2009-07-19 01:48 leekiang 阅读(2323) | 评论 (0)编辑 收藏

父类(Father)如果定义了一个静态方法,如:
protected synchronized static void echo(String str) throws Exception
{     
        System.out.println(str);
        Thread.sleep(10000);
}
Son和Daughter继承了父类,在两个线程里面相继调用Son.echo();和Daughte.echo.会发现后调用的要等到先调用的完后才能调用,所以echo方法并不是真正的被子类继承了,它们用的还是Father的方法。
如果把静态方法改称非静态的,用new出来的对象调用则不会出现上述情况。

static方法不能被override,而不是不能继承.

如果Son类里有个同样的echo方法,
然后Father p= new Son();p.echo();此时实际调用的是Father的,注意这与非静态方法不一样。

如何调用父类的静态私有方法?
private static boolean test(String s) thows Exception
    {
      Class c 
= Test.class;
      Method m;
      Object ret 
= null;
      m = c.getDeclaredMethod("test", new Class[] { String.class});
      m.setAccessible(
true);//必须加
      ret 
= m.invoke(nullnew Object[] { s });//第一个参数必须为null
     
return ((Boolean) ret).booleanValue();
    }


再来一个例子:

public class Father {
    
private static String n = "";
    
public static void name() {
        n 
= "father";
    }
    
public static String getN() {
        
return n;
    }
}

public class Son extends Father {
    
private static String n = "";
    
public static String getN() {
        
return n;
    }
    
public static void name() {
        
//Father.name();
        n="son";
    }
}

public class TestStatic {
    
public static void main(String[] args) {
        Son.name();  
        System.out.println(Father.getN()
+"-"+Son.getN());
    }
}
如果Son没有name()方法或者name()方法里是"Father.name();",则输出是"father-"
如果Son的name()方法有自己的实现(见上面代码),则输出"-son"。


参考:
http://bbs.chinaunix.net/archiver/?tid-583540.html
http://www.blogjava.net/jiangmin/articles/69386.html
http://www.blogjava.net/forgood/archive/2009/01/11/250870.html

posted @ 2009-07-16 23:12 leekiang 阅读(2073) | 评论 (1)编辑 收藏

				
						
								
如果引入jquery后再引入
Scriptaculous的effects.js,就可能出现莫名其妙的问题。
jQuery("#id")正常,但类似于jQuery("name='test'")之类的查询就会出错。
原因是旧版本(1.5.1)的effects.js里有代码污染了Array的call方法
Array.prototype.call = function() {
  
var args = arguments;
  
this.each(function(f){ f.apply(this, args) });
}

参考一
参考二
http://www.javaeye.com/topic/84683
http://www.javaeye.com/topic/184859

posted @ 2009-06-11 14:50 leekiang 阅读(352) | 评论 (0)编辑 收藏

仅列出标题
共54页: First 上一页 23 24 25 26 27 28 29 30 31 下一页 Last