posts - 31,  comments - 31,  trackbacks - 0
                 這幾天做項目,需要做一個類似于控制臺的界面,可以將日志回顯到一個文本區域里,幾經查找,反復測試寫了以下測試代碼。
          這是log4j.properties的配置內容
              log4j.rootCategory= ,WriterAppender

          log4j.appender.WriterAppender
          =org.apache.log4j.WriterAppender
          log4j.appender.WriterAppender.Threshold
          =debug
          log4j.appender.WriterAppender.layout
          =org.apache.log4j.PatternLayout
          log4j.appender.WriterAppender.layout.ConversionPattern
          =%d{ISO8601} - %- %m%n
          主程序
          import java.io.PipedReader;
          import java.io.PipedWriter;
          import java.io.Writer;

          import org.apache.log4j.Appender;
          import org.apache.log4j.Logger;
          import org.apache.log4j.WriterAppender;

          public class Log4jMain {
              
          static public Logger logger = Logger.getLogger(Log4jMain.class);

              
          public static void main(String[] arg) {
                  
                  
                  Logger root 
          = Logger.getRootLogger();
                  
          try {
                      Appender appender 
          = root.getAppender("WriterAppender");
                      PipedReader reader 
          = new PipedReader();
                      Writer writer 
          = new PipedWriter( reader) ;
                  
                      ((WriterAppender) appender).setWriter(writer);
                      
                      Thread t 
          = new AaaThread(reader);
                      t.start();
                      Logger logger 
          = Logger.getLogger(Log4jMain.class);
                      logger.error(
          "asdf");
                      logger.info(
          "asdf");
                      logger.debug(
          "asdf");
                      logger.fatal(
          "asdf");
                          //hh是一個class,test方法里只有幾個logger.info("aaa"),用于測試用,這東西可以去掉
                      
          new HH().test();

                  }
           catch (Exception e) {
                  }


              }

              
          }
          因為log4j提供的是 Writer,所以通過使用PipedWriter連接到PipedReader,并通過一個thread來處理PipedReader的數據就可以回顯了。如果你需要的話可以將下面的System.out.println(scanner.nextLine());改成你需要顯示的地方就行了。
          import java.io.PipedReader;
          import java.util.Scanner;

          public class AaaThread extends Thread {
              PipedReader reader;

              
          public AaaThread(PipedReader reader) {
                  
          this.reader = reader;
              }


              
          public void run() {
                  Scanner scanner 
          = new Scanner(reader);
                  
          while (scanner.hasNext()) {
                      System.out.println(scanner.nextLine());
                  }

              }

          }
          posted @ 2008-06-06 09:31 小平 閱讀(1224) | 評論 (0)編輯 收藏
          這里制作一個引子,具體內容比較多,而且hibernate文檔里的hql篇寫的很詳細
          可以這么用:
          List list = getHibernateTemplate().find("select new map(t1.c1,t2.c3) from table1 t1 ,table2 t2 where t1.c1=t2.c2");
          這樣的話list里的每個元素都是一個map,每個map里包含兩個元素
          注意:這里的table1和table2都是class名并不是真的表名,畢竟這是hql。除了可以用map還還支持list和自定義的bean。


          posted @ 2008-04-17 17:05 小平 閱讀(1893) | 評論 (0)編輯 收藏
          DB2的Type-4驅動真的很詭異,配了兩天沒配上,發現是多引了一個包。就是他----“db2java.zip(db2java.jar)”只要有了他就算你已經引入了db2jcc.jar、db2jcc_license_cisuz.jar、db2jcc_license_cu.jar也沒用。
          不知道怎么回事,本以為多引就沒錯,沒想到載這了。
          順便吧db2 type-4的配置方法貼下面:
          jdbc:db2://ip:port/數據庫
          驅動名:com.ibm.db2.jcc.DB2Driver

          我日他IBM!該死的IBM,我算是服了,配好的type-4驅動中文數據顯示的全是亂碼,準備切到type-2上試試,結構還是不行,查來查去是數據庫pagecode的事,數據庫的字符集改成gbk,客戶端的pagecode也改成跟數據庫一樣的,ODBC算是能用了,type-2也能用了,然后又用type-4一試!連不上了!說字符集不匹配,上網一查說要使用IBM專用的JDK,我日了,換了IBM的JDK,配好環境變量eclipse又不能用了!我算是被IBM搞死了,一氣之下也不準備再嘗試type-4了。
          我這里用的IBM JDK1.4,db2 V8
          posted @ 2008-04-17 16:51 小平 閱讀(2530) | 評論 (3)編輯 收藏

          近日抽風,想了解以下java與串口并口通訊的問題,上網查了半天,找到了sun幾年前的一個破包,comm.jar

          2.0版的,遇到一個比較奇怪的問題,這個包里的demo程序用cmd可以運行,但是用eclipse編譯就不能運行,一直以為是dll庫和配置文件的問題,幾乎將兩個文件copy到了系統中全部可能出現的地方都沒有解決。百般無奈之下,找到了http://blog.csdn.net/djsl6071/archive/2007/04/25/1583979.aspx這個博客,下載了rxtx把問題搞定了。
          posted @ 2008-04-17 16:40 小平 閱讀(575) | 評論 (0)編輯 收藏
          如果RMI客戶端鏈接補上服務器可能是以下情況導致的:
          1、網絡不通
          2、端口占用
          3、防火墻(客戶端機器的防火墻和服務器端的防火墻都有可能)
          4、服務器端所在機器安裝了linux虛擬機,或者使用的linux或者unix系統
          排除辦法:
          前三種情況都很好解決,主要是最后一個,需要在rmi服務啟動時加上一句
          java  -Djava.rmi.server.hostname=localhost ……
          其中localhost可以強制定義為機器的IP地址 
          posted @ 2008-02-15 14:11 小平 閱讀(887) | 評論 (0)編輯 收藏
                 為了滿足將plugin工程打成jar包,但是spring的配置文件不打進jar包的需求。很多時候我們為了可以方便手工配置spring的一些信息,而不用將jar解壓而從新壓縮,我們需要把Spring的配置文件放在plugin的jar包外這時,如果沒有正確的使用spring的Resource就不能加載spring的配置文件,經過多次嘗試終于找到一個比較合適的方法,與大家交流。
          public static BeanFactory getFactory() {
                  
          if (factory == null{
                      FileSystemResource resource 
          = new FileSystemResource("appcontextclient.xml");
                      factory 
          = new XmlBeanFactory(resource);
                  }

                  
          return factory;

              }

                  將appcontextclient.xml文件放到工程根目錄下,發布時將appcontextclient.xml放入到你的eclipse的安裝目錄即可(與eclipse的exe執行文件相同的位置),如果需要可在appcontextclient.xml文件前加入相關的路徑來更改你的目錄(但是有可能在調試過程中必須要把appcontextclient.xml文件放到你的eclipse IDE的安裝目錄里,因為大部分時間我們的eclipse IDE是何 workspace分開存放的,這樣我們在調試的時候非常別扭,要到IDE里去修改配置文件)。
                  以上方法并不是唯一的,只是我感覺用起來比較合適的,這樣在調試時既可以保證appcontextclient.xml文件在工程目錄范圍內,有可以在發布時使文件保持在安裝目錄而不是運行環境的workspace的臨時目錄里。
                  同時介紹幾個方法可以eclipse方法獲得eclipse工具的幾個重要路徑(注:"IDE"為我的plugin工程的PLUGIN_ID)
                  Platform.getInstallLocation().getURL()                                                 
                  file:/F:/tools/java/eclipse/eclipse-SDK-3.3-win32/eclipse/             
                  這是我的eclipse IDE的安裝目錄
                      
                  Platform.getLocation()                                                                        
                  D:/runtime-IDE.product                                                               
                  這是我調試插件時生成的臨時運行環境目錄,是在調試IDE工程時生成的,就是發布時插件所屬eclipse運行環境的WorkSpace目錄
                       
                  Platform.getInstanceLocation().getURL()                                             
                  file:/D:/runtime-IDE.product/                                                       
                   這個跟上面的一樣
                       
                  Platform.getLocation()                                                                        
                  D:/runtime-IDE.product                                                              
                   這個跟上面的也一樣
                  
                  Platform.getLogFileLocation()                                                             
                  D:/runtime-IDE.product/.metadata/.log                                         
                  運行環境的日志文件路徑,發布時插件所屬eclipse運行環境的WorkSpace目錄下的/.metadata/.log 
                   
                  Platform.getStateLocation(Platform.getBundle("IDE"))               
                  D:/runtime-IDE.product/.metadata/.plugins/IDE                           
                  運行環境中IDE的一個臨時目錄,發布時插件所屬eclipse運行環境的WorkSpace目錄下/.metadata/.plugins/IDE
                       
                  Platform.getUserLocation()                                                       
                  file:/C:/Documents and Settings/XX/user                                     
                   這是我的文檔的路徑(把用戶名X掉,哈哈)

                  Platform.getBundle("IDE").getLocation()                                    
                  update@D:/WorkSpace/IDE/                                                     
                  我的IDE工程的路徑,對應發布時插件的jar本身,在這個目錄下的文件將全部包含在發不得jar里。

                  Platform.getConfigurationLocation().getURL()       
                  file:/D:/WorkSpace/.metadata/.plugins/org.eclipse.pde.core/IDE.product/  
                  eclipse IDE 自己建的目錄

                  eclipse 本身也有很多加載資源文件的方法可以在org.eclipse.core.runtime.Platform這個類里找到,具體的就請大家找找API吧
          posted @ 2008-01-05 21:35 小平 閱讀(2014) | 評論 (0)編輯 收藏
          應要求在此提供ibatis批量插入demo下載,謝謝大家的關注,不過對于一些人的不禮貌行為我非常痛心。由于工作地點不能上網,不能上網,不能及時回復大家的留言我深表道歉。下載
          posted @ 2007-12-27 19:52 小平 閱讀(3423) | 評論 (9)編輯 收藏
          此問題網上大部分解決方法是這樣的:
          1.網上鄰居->本地連接->屬性->internet協議(TCP/IP)->屬性->高級->wins標簽->去掉啟用LMhosts查詢前的勾.
          2.控制面版->windows防火墻->高級標簽->本地連接設置->服務的標簽里勾選安全Web服務器(HTTPS)即可
          但是我的機器按照上面操作apache服務仍然不可以使用,于是索性將服務中的Windows Firewall/Internet Connection Sharing (ICS的服務關掉了,發現問題解決了,apache可以用了。對于安全問題可以選擇第3方的防火墻來解決。
          注意:費爾防火墻好像和apache沖突,也會導致WSASocket failed to open the inherited socket
          posted @ 2007-10-21 14:53 小平 閱讀(1462) | 評論 (1)編輯 收藏
                今天用sun的jdk調的沒有一點問題的數據抽取程序,方放到AIX上后不能用了,oralce報出向一個字段中插入了過長的數據,可是程序在幾天前還是沒有問題的,后來分析可能是字符集導致的,因為前幾天修改過informix數據庫的字符集由8859-1轉為了zh_cn.gb18030-2000,但解決過程異常艱難,后來吧informix的url改為<value>jdbc:informix-sqli://xx.xx.xx.xx:8888/XXXX:informixserver=whcspdev;DB_LOCALE=zh_cn.gb18030-2000;CLIENT_LOCALE=zh_cn.UTF8(原為zh_cn.gb18030-2000);NEWCODESET=gb18030,gb18030-2000,5488,utf8</value>就可以了。后來猜測了一下原因:
          1、oracle數據庫的jdbc驅動是是自動將數據庫的數據轉為unicode格式,這可能跟java的String默認為unicode有關,為了讓大家方便操作,
          2、sun jdk的String在初始時用的是Unicode格式,ibm的jdk應該也是,但是有一點,sun的jdk在通過informix jdbc驅動取數據時不會將數據轉成其他字符集,而是仍然使用Unicode,而IBM的則是通過CLIENT_LOCALE=zh_cn.gb18030-2000配置將數據格式轉為了zh_cn.gb18030-2000。
          所以在oracle作insert的時候就會由于字符集不匹配而報錯
          posted @ 2007-07-18 19:23 小平 閱讀(1000) | 評論 (2)編輯 收藏

                 前兩天遇到為org.eclipse.jface.text.TextViewer添加undo、redo 并添加Ctrl+z,與Ctrl+y功能這個問題,搜遍了國內網站,也沒有個好結果,終于多天后在一個國外的svn服務器上找到了一段代碼,解決了問題
          1、為TextViewer添加TextViewerUndoManager來管理記錄

          protected TextViewer textViewer;
               
          protected TextViewerUndoManager undoManager;
               
                
          //20是保存記錄的數量。
               undoManager = new TextViewerUndoManager(20);
               
               
          //綁定對textViewer控件的數據進行管理
               undoManager.connect(textViewer);
               textViewer.setUndoManager(undoManager);


          2、添加Ctrl+z,與Ctrl+y事件

          StyledText styledText = textViewer.getTextWidget();
          styledText.addKeyListener(
          new KeyListener( ) {
                      
          public void keyPressed( KeyEvent e )
                      
          {
                          
          if ( isUndoKeyPress( e ) )
                          
          {
                              textViewer.doOperation( ITextOperationTarget.UNDO );
                          }

                          
          else if ( isRedoKeyPress( e ) )
                          
          {
                              textViewer.doOperation( ITextOperationTarget.REDO );
                          }

                      }

                      
          private boolean isUndoKeyPress( KeyEvent e )
                      
          {
                          
          // CTRL + z
                          return ( ( e.stateMask & SWT.CONTROL ) > 0 )
                          
          && ( ( e.keyCode == 'z' ) || ( e.keyCode == 'Z' ) );
                      }

                      
          private boolean isRedoKeyPress( KeyEvent e )
                      
          {
                          
          // CTRL + y
                          return ( ( e.stateMask & SWT.CONTROL ) > 0 )
                          
          && ( ( e.keyCode == 'y' ) || ( e.keyCode == 'Y' ) );
                      }

                      
          public void keyReleased( KeyEvent e )
                      
          {
                          
          // do nothing
                      }

                  }
          );
          posted @ 2007-07-16 10:49 小平 閱讀(1870) | 評論 (3)編輯 收藏
                  到一個這東西都寫到3了,針對上回說到30000條數據的批量插入工作。30000條數據的批量插入在一個事務里處理固然是快,但是這只是測試環境,30000條數據在數據庫的緩存里必然對數數據庫的緩存和鎖數量都是一個大的挑戰,固在新的程序中我們使用了分批事務提交的方式,這樣為了保持數據的正確行就只能人為控制數據庫中已被插入的數據是否delete掉。另外,使用Batch塊提交會引發一個問題就是,如果batch塊中發生了異常,我們得不到異常數據的行號即任何信息,所以只能是魚和熊掌不可兼得(我已關注過insert方法中返回pk的方法了,但好像在batch中他反回不了出錯的行號,也許是我沒有找到方法,如有人有好方法請共享一下,在這里表示感謝),大家酌情考慮吧,只能到到自己需要的平衡點了。
                建議:如果對數據的準確性毋庸置疑的話就是用batch處理。如果不能確定準確性的話,如果對那條數據出錯無所謂的話就也可以用batch,但是非要返回出錯行號的話就不要用batch了,直接在外面套用一個事務,然后try catch一下,處理一下行號。
          posted @ 2007-06-28 21:32 小平 閱讀(3291) | 評論 (4)編輯 收藏
          今天發生了ORA-01461 :can bind a LONG value only for insert into a LONG ...到處查詢發現是一個字段中的中文內容導致,仔細分析了一下原因,是因為jdk1.5的String類型為utf-16編碼方式,而jdk1.4為utf-8,通過在oracle網上查詢10g的jdbc驅動有兩個版本,舊版的不持jdk1.5,只支持jdk1.4,通過換jdbc驅動問題解決。
          posted @ 2007-06-20 10:53 小平 閱讀(2804) | 評論 (0)編輯 收藏
          1、上回的心得中我強調了startBatch()的批處理的作用,但是其中的使用是個錯誤用法,并沒有發揮出startBatch()的實力,對此給與觀眾的誤導我將在此表示到欠,并貼出正確的用法
          public class LocalDaoImpl extends SqlMapClientDaoSupport implements LocalDao {

              
          public void insertBuNaTaxBatLst(final PaginatedList list)
              
          {
                   getSqlMapClientTemplate().execute(
          new SqlMapClientCallback() {
                          
          public Object doInSqlMapClient(SqlMapExecutor executor)
                                  
          throws SQLException {
                              executor.startBatch();
                              
          // do some iBatis operations here
                              for(int i=0,count=list.size();i<count;i++)
                              
          {    
                                  executor.insert(
          "insertBuNaTaxBatLst", list.get(i));
                                  
          if (i % 50 == 0{
                                      System.out.println(
          "----" + i);//沒有意義只為測試
                                  }

                              }

                              executor.executeBatch();
                              
          return null;
                          }

                      }
          );
              }


          }
          這樣才能利用上startBatch()威力。
          2、注意ibatis的事物默認情況下是自動提交的,如果發現速度上有問題可以留意一下,ibatis只有在顯示的聲明事物管理的情況下才自動將事物管理改為不自動方式。
          3、還是startBatch(),據我測試分析這個鬼東西只有在executeBatch(),才把所有的語句提交到數據庫,在提交之前緩存中保留了大量的sql語句和數據對象,很有可能out of memony,對此要留意,可以在大量數據要做插入時,分批用Batch,如:有40000條數據可將其分為4個Batch塊,讓后將這4個Batch用一個事物提交以保證數據完整性。
          注:最近在做數據抽取項目,愿與大家溝通心得
          posted @ 2007-05-30 21:46 小平 閱讀(5963) | 評論 (6)編輯 收藏
          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          framework

          j2me

          java

          linux

          web

          其他

          友情鏈接

          素材

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 林芝县| 张家港市| 繁昌县| 遂溪县| 武威市| 昆明市| 玛纳斯县| 方山县| 闵行区| 六安市| 肥东县| 海宁市| 泰顺县| 深水埗区| 沙雅县| 东源县| 绍兴县| 屯留县| 额敏县| 苍南县| 靖州| 嘉鱼县| 故城县| 南漳县| 沁水县| 通城县| 紫阳县| 阿鲁科尔沁旗| 大埔区| 长宁区| 西平县| 六盘水市| 西青区| 阜新市| 嘉荫县| 山西省| 游戏| 板桥市| 丰宁| 东莞市| 巫溪县|