2011年11月 的存檔

MyBatis3自定義typeHandlers

2011年11月28日 沒有評論

mybatis3中默認了標準的java類型的typeHandlers,對枚舉類型也內置了一個叫EnumTypeHandler的處理器,但是有一個問題,如果在數據庫里面的字段類型是SMALLINT、TYININT、INTEGER等數據類型,默認的EnumTypeHandler就不能處理了,http://asialee.iteye.com/blog/1013238,這個地方有比較詳細的說明。解決這個問題有兩種方法,一是修改數據庫字段的類型為枚舉類型,并且枚舉值用字符表示;另外一種方法就是自己實現一個typeHandlers。實現的方法很簡單,官方的手冊上就一個例子。配置的時候需要注意,不光只在 MapperConfig.xml 配置

<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

還需要在對應的字段在resultMap中配置jdbcType屬性,而且select的返回結果類型不能使用resultType,必須用resultMap,否則mybatis就無法應用用自定義的typeHandlers。為何一定要配置jdbcType呢?因為MyBatis為POJO中字段設置typeHandlers是根據在javaType和jdbcType來確定的,javaType可以根據POJO來獲取,MyBatis不會審視數據庫元信息來決定jdbcType,如果沒有指定,那么都是按null來處理,因而獲取typeHandlers通過javaType了,就算在MapperConfig.xml中配置的全局typeHandlers也無法正確應用。

另外一種配置是直接在resultMap中指定對應字段的typeHandlers,這樣可以不在MapperConfig.xml配置typeHandlers和設置jdbcType。

官方文檔中有如下說明:

使用這樣的類型處理器將會覆蓋已經存在的處理Java的String類型屬性和VARCHAR參數及結果的類型處理器。要注意MyBatis不會審視數據庫元信息來決定使用哪種類型,所以你必須在參數和結果映射中指定那是VARCHAR類型的字段,來綁定到正確的類型處理器上。這是因為MyBatis直到語句被執行都不知道數據類型的這個現實導致的。

由于沒有很好的理解“不會審視數據庫元信息來決定使用哪種類型”導致走了很多彎路,一直無法使用自定義的typehandler。

Tomcat-6.0.33之APR based Apache Tomcat Native library

2011年11月25日 沒有評論

最近使用tomcat 6.0.33這個版本,啟動的時候有個提示:

The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:...

tomcat可以整合本地apr,在處理靜態資源的時候速度更快,總而言之就是使用本地的apr庫提升處理效率。在網上一查,很多人提到了這個問題,解決這個問題其實很簡單,但window和linux處理方法不太一樣。下面就分別給出解決方法。

  • window平臺

在window下啟動的時候會提示was not found on the java.library.path: C:\Tools\jdk1.6.0_29\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS …,這個根據每個人的環境不同,可能給出的路徑也不太一樣,只要把Native library拷貝到上述路徑之一即可,Native library是什么呢,網上有提供下載,其實不要那么麻煩,在tomcat的bin目錄下就有,文件名是:tcnative-1.dll。例如我把這個文件拷貝到C:\Tools\jdk1.6.0_29\bin下,然后再啟動tomcat就沒有上述的提示了。

  • linux平臺

linux下比較復雜一點,因為tomcat包中沒有提供編譯好的so文件,所以需要自己編譯,tomcat發行版中提供了源碼,文件為tomcat的bin/tomcat-native.tar.gz,另外編譯時候需要依賴APR 1.2、OpenSSL,如果機器上沒有安裝,可以使用 yum -y install apr-devel openssl-devel 來進行安裝。解壓tomcat-native.tar.gz后會得到一個tomcat-native-1.1.20-src的目錄,Native library的源文件位于tomcat-native-1.1.20-src/jni/native下,進入該目錄,執行./configure,可能會看到configure: error: APR could not be located. Please use the –with-apr option.的錯誤提示,這個時候用–with-apr制定一下apr的位置即可,我使用的是

./configure --with-apr=/usr/bin/apr-1-config

,順利通過,然后執行 make && make install 編譯就算搞定,此時應該可以在/usr/local/apr/lib/下看到一個名為 libtcnative-1.so 的文件,拷貝該文件到tomcat啟動時提示的任何一個路徑即可。

更多關于apr的信息可以查看官方資料,地址:http://tomcat.apache.org/tomcat-5.5-doc/apr.html

eclipse的Toggle Block Selection Mode功能

2011年11月25日 沒有評論

用eclipse3.6一段時間了,今天無意中發現了Toggle Block Selection Mode功能,其用途就是文本編輯器支持塊選擇模式。何為塊選擇模式呢,就是類似于ultraedit的列模式。似乎這個功能在eclipse3.5版本就推出來了的。

這個功能其實蠻有用的,比如一個文件有很多行,現在只想把每行前面的10個字符復制出來,那么在塊選擇模式下就很容易做到了;另外在html之類的文件中可以輔助找出html標簽是否不匹配,前提的html文件寫的比較規范。

啟用此功能的快捷鍵為:Alt+Shift+A,通過這個它可以在快選擇模式和普通模式間進行切換。

分類: Java 標簽:

深入理解struts2的namespace

2011年11月23日 沒有評論

struts2提供了一個命名空間的概念,可以通過package的namespace屬性來設置,使用它可以避免action的名字沖突,同時也可以在邏輯上給action分類。關于namesapce的很多信息,可以參考strtus的官方文檔,地址是:http://struts.apache.org/2.2.3.1/docs/namespace-configuration.html

個人覺得,這個里面還是很多信息沒有表達清楚。例如該文檔最后有一段話如下:

Namespaces are not a path!
Namespace are not hierarchical like a file system path. There is one namespace level. For example if the URL /barspace/myspace/bar.action is requested, the framework will first look for namespace /barspace/myspace. If the action does not exist at /barspace/myspace, the search will immediately fall back to the default namespace “”. The framework will not parse the namespace into a series of “folders”. In the Namespace Example, the bar action in the default namespace would be selected.

大概意思就是說,如果在某個命令空間下沒有找到對應的action,然后就直接去缺省的命名空間下。但事實真的如此嗎?

通過一些測試,發現似乎遵循如下的規則:

1.假設請求路徑的URI,例如url是:http://www.twubdg.tw/path1/path2/test.do

2.首先尋找namespace為/path1/path2的package,如果存在這個package,則在這個package中尋找名字為test的action,若找到則執行,否則轉步驟5;如果不存在這個package則轉步驟3。

3.尋找namespace為/path1的package,如果存在這個package,則在這個package中尋找名字為test的action,若找到則執行,否則轉步驟5;如果不存在這個package則轉步驟4。

4. 尋找namespace為/的package,如果存在這個package,則在這個package中尋找名字為test的action,若找到則執行,轉步驟5;如果不存在轉步驟5。

5. 如果存在缺省的命名空間,就在該package下查找名字為test的action,若找到則執行,否則頁面提示找不到action;否則提示面提示找不到action。

上述一個很重要的地方就是一旦找到對應的namespace的package就停止向上級路徑查找了,另外缺省命名空間(package中沒有指明namespace屬性或namespace屬性值為空)的package的可以不存在。

以前一直比較困惑的是,當訪問http://www.twubdg.tw/test.do成功,那類似http://www.twubdg.tw/x/test.do,http://www.twubdg.tw/x/y/test.do也能正常訪問,而且執行的同一個action。而上述的試驗結果可以很好的解釋這個疑惑了。但是個人覺得這樣的設計不是太好,決定去源碼看個究竟,在org.apache.struts2.dispatcher.mapper.DefaultActionMapper找到關于如何在namespace中查找action的操作,有如下代碼:

    protected void parseNameAndNamespace(String uri, ActionMapping mapping, ConfigurationManager configManager) {
        String namespace, name;
        int lastSlash = uri.lastIndexOf("/");
        if (lastSlash == -1) {
            namespace = "";
            name = uri;
        } else if (lastSlash == 0) {
            // ww-1046, assume it is the root namespace, it will fallback to
            // default
            // namespace anyway if not found in root namespace.
            namespace = "/";
            name = uri.substring(lastSlash + 1);
        } else if (alwaysSelectFullNamespace) {
            // Simply select the namespace as everything before the last slash
            namespace = uri.substring(0, lastSlash);
            name = uri.substring(lastSlash + 1);
        } else {

注意到其中alwaysSelectFullNamespace這個信息,原來它屬于struts.properties常用配置的一項,其作用是控制是否一直在最后一個slash之前的任何位置選定namespace。由于struts2默認是設置是false,所以導致按照上述試驗結果成功,當把alwaysSelectFullNamespace在strtus.properties中設置為true時,此時struts2查找action就不會遞歸路徑去查找package,而是直接找路徑對應的package,如果沒有找到就去默認命名空間下查找,這就是官方文檔中所采用的說法。

個人建議把alwaysSelectFullNamespace設置為true,明確指定action在屬于命名空間的package中,不會操作url路徑隨便輸入的問題,同時執行效率也會略有提高。

linux的uniq命令

2011年11月21日 沒有評論

使用uniq命令可以過濾掉文本文件中重復的行以及統計等等功能,同時它也接受來著管道的輸入。借助awk,甚至可以對行中的列進行操作,例如統計nginx日志信息中獨立ip數、列出訪問次數最多的ip等。需要注意的地方是uniq只對相連的行進行處理,所以一般情況下要先進行sort操作。

假設有名為test.txt文本文件,其信息為:

ab
ac
ab
ac
ac
ad
ac

執行命令

uniq test.txt

此時得到的結果為:

ab
ac
ab
ac
ad
ac

從結果可以看到,這里只對3,4行的ac進行過濾,這顯然不是我們需要的結果,原因就是uniq只對相連的行進行運算了,現在先用sort排序,然后再執行uniq,例如:

sort test.txt | uniq

這時的結果為:

ab
ac
ad

可以看到再沒有重復行了。

例如通過nginx日志統計獨立ip的個數:

awk '{print $1}' /path-to-log-dir/access.log | sort | uniq | wc -l

查詢訪問最多的前10個ip

awk '{print $1}' /path-to-log-dir/access.log  | sort | uniq -c | sort -nr | head -10
分類: Linux 標簽: ,

使用neuxs搭建maven私服

2011年11月18日 評論已被關閉

私服的好處很多,可以在私服上建立公司內部倉庫,把公司的內部構件部署上去供其他人或項目使用;能夠部署第三方構件,某些第三方構建在公共的倉庫中沒有,如果項目中需要使用,就可以把第三方構建部署到自己的私服上,這樣mavne中就能正常使用了;在沒有私服的情況,項目開發的每個人都需要從遠程的中央庫下載依賴的構建,浪費帶寬不說,效率還低;等等……。

  • 安裝nexus

1、下載

下載地址:http://nexus.sonatype.org/downloads/,這里列出了所有版本,挑一個最新版本來使用。Nexus提供了兩種安裝方式,一種是內嵌Jetty的bundle,只要你有JRE就能直接運行。第二種方式是WAR,你只須簡單的將其發布到web容器中即可使用。為了方便就直接選用bundle版本。本文下載的是nexus-oss-webapp-1.9.2.3-bundle.tar.gz 。

2、安裝

在指定的目錄解壓下載的文件

tar xvf nexus-oss-webapp-1.9.2.3-bundle.tar.gz

解壓后會看到兩個文件夾,分別是nexus-oss-webapp-1.9.2.3和sonatype-work,前者包含了nexus的運行環境和應用程序,后者包含了你自己的配置和存儲構件的地方。nexus-oss-webapp-1.9.2.3/conf/plexus.properties中可以修改端口信息已經工作區的路徑。

3、啟動nexus
進入nexus-oss-webapp-1.9.2.3/bin/jsw/目錄,然后根據OS的版本進入相應的目錄,在linux下,運行./nexus start即啟動了服務,直接運行./nexus會看到提示信息。neuxs默認監聽端口是8081,此時在瀏覽器中運行訪問http://nexus-server-ip:8081/nexus應該可以看到neuxs的界面。

  • 配置nexus

新搭建的neuxs環境只是一個空的倉庫,需要手動和遠程中心庫進行同步,nexus默認是關閉遠程索引下載,最重要的一件事情就是開啟遠程索引下載。登陸nexus系統,默認用戶名密碼為admin/admin123。 點擊左邊Administration菜單下面的Repositories,找到右邊倉庫列表中的三個倉庫Apache Snapshots,Codehaus Snapshots和Maven Central,然后再沒有倉庫的configuration下把Download Remote Indexes修改為true。然后在這三個倉庫上分別右鍵,選擇Repari Index,這樣Nexus就會去下載遠程的索引文件。

新建公司的內部倉庫,步驟為Repositories –> Add –> Hosted Repository,在頁面的下半部分輸入框中填入Repository ID和Repository Name即可,比如分別填入myrepo和 my repository,另外把Deployment Policy設置為Allow Redeploy,點擊save就創建完成了。

修改neuxs倉庫組

Nexus中倉庫組的概念是Maven沒有的,在Maven看來,不管你是hosted也好,proxy也好,或者group也好,對我都是一樣的,我只管根據groupId,artifactId,version等信息向你要構件。為了方便Maven的配置,Nexus能夠將多個倉庫,hosted或者proxy合并成一個group,這樣,Maven只需要依賴于一個group,便能使用所有該group包含的倉庫的內容。

neuxs-1.9.2.3中默認自帶了一個名為“Public Repositories”組,點擊該組可以對他保護的倉庫進行調整,把剛才建立的公司內部倉庫加入其中,這樣就不需要再在maven中明確指定內部倉庫的地址了。同時創建一個Group ID為public-snapshots、Group Name為Public Snapshots Repositories的組,把Apache Snapshots、Codehaus Snapshots和Snapshots加入其中。

到這里neuxs的安裝配置就完成了,下面介紹如何在mavne中使用自己的私服。 閱讀全文…

分類: Java, Linux 標簽: ,

netstat命令的常見用法

2011年11月17日 沒有評論
  • 查看系統服務監聽狀況
netstat -tunlp
  • 查看連接某服務端口最多的的IP地址
netstat -nat | grep "10.150.185.178:80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20
  • TCP各種狀態列表
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn
或
netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

另外分析access.log獲得訪問前10位的ip地址可以用如下命令:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
分類: Linux 標簽: ,

maven部署構件至Nexus私服

2011年11月17日 沒有評論

首先在Nexus中創建一個自己私有的倉庫,步驟為Repositories –> Add –> Hosted Repository,在頁面的下半部分輸入框中填入Repository ID和Repository Name即可,比如分別填入myrepo和 my repository,點擊save就創建完成了。

如果要把構建部署至私服中,需要在構建的 pom.xml 文件增加 distributionManagement 配置項,有多種協議可以用來部署構建,這里主要講兩種。

  • 第一種配置如下:
<project>
	[...]	
	<distributionManagement>
		<repository>
			<id>myrep</id>
			<name>my repository</name>
			<url>file:/usr/local/mvn-private-server/nexus-oss-webapp-1.9.2.3/./../sonatype-work/nexus/storage/myrep/</url>
		</repository>
	</distributionManagement>
	[...]
</project>

說明:其中id就是需要部署構建的倉庫Id,name似乎不重要,可以隨便輸入,url就是倉庫的configuration中Default Local Storage Location項的對應的信息。采用此種方法,服務器不會對部署操作進行認證,同時配置也把倉庫的物理存儲地址完全暴露,感覺不是太好。

  • 第二種配置如下:
<project>
	[...]	
	<distributionManagement>
	  <repository>
		<id>tagphi</id>
		<url>http://nexus-server-ip:8081/nexus/content/repositories/myrep</url>
	  </repository>
	</distributionManagement>
	[...]
</project>

說明:上述的distributionManagement信息可以在對于的倉庫的Summary中找到。

配置好后,此時執行mvn deploy,部署應該不會成功,根據提示信息,重新執行 mvn deploy -e 或 mvn deploy -X,此時能看到具體的錯誤信息,報Return code is: 401錯,這個是因為發布者沒有權限,需要把用戶認證信息配置在maven的settings.xml中,該文件在mavne安裝包下的conf目錄下,這是一個全局配置,同時可以把該文件復制到 userdir/.m2 目錄下,這樣配置就只對當前用戶生效。在settings.xml文件中servers段中添加如下信息

    <server>
      <id>myrep</id>
      <username>deployment</username>
      <password>password</password>
    </server>

其中id就是部署倉庫的id,username是作為部署用戶,Nexus系統默認的deployment,密碼為deployment123,可以在security — users中找到,如果需要設置密碼,在用戶列表中找到該用戶,在該用戶上點擊右鍵,會出來一個菜單供重置密碼或修改密碼。此時在執行 mvn deploy,應該可以看到成功發布了。當第二次執行 mvn deploy 又失敗,這次失敗原因是Return code is: 400,該錯誤的原因是在創建倉庫時在configuration中的Deployment Policy設置為了Disable Redeploy,修改為Allow Redeploy即可。

the NTP socket is in use, exiting

2011年11月16日 沒有評論

centos下使用如下命令手動同步服務器時間

	ntpdate ntp.fudan.edu.cn
	或
	ntpdate ntp.api.bz

出現“the NTP socket is in use, exiting”錯誤。造成該原因是系統ntpd服務器正在運行中,可以通過 ps aux | grep ntpd 查看,如果還是要手動同步時間,就必須先停止該服務,命令為:

	service ntpd stop

然后再通過 ntpdate ntp.fudan.edu.cn 即可手動同步時間了。另外注意,如果想把它加入到crontab中,最好把ntpdate命令的完整路徑帶上,即/usr/sbin/ntpdate ntp.fudan.edu.cn,否則可能在某些版本的linux中不會被執行,同時用chkconfig把ntpd修改成不是自動運行的狀態。

分類: Linux 標簽:

清理MySql的日志文件mysql-bin.00000

2011年11月15日 1 條評論

有一個應用運行在aws的ec2上面,由于存儲硬盤比較小,只有8G左右的容量,最初剛配置好環境(按照了php、mysql、nginx等),使用的硬盤只有不到3G,運行一段后,發現硬盤已經用了5G多了,即使清除了nginx的日志,硬盤還是接近5G。決定找出是誰占用了硬盤空間。

通過命令

du -h –max-depth=1 /

查看根目錄下每個文件夾所占用存儲的大小,發現/var占用了快3G,進一步使用du命令,發現是存放mysql數據文件的文件夾占用了絕大部分空間,進入該文件夾,發現有很多mysql-bin.00000開頭的文件,而且其中的某些達到了1G以上,google發現原來這些用戶是mysql記錄的日志文件,用于數據庫崩潰后恢復數據和主從數據庫進行數據同步的。如果沒有進行主從數據庫,可以通過修改配置文件讓mysql關閉記錄操作日志功能,關閉只需要在log-bin=mysql-bin前加上一個“#”即可,不要忘記重啟mysql服務。

清理日志方法為:

PURGE MASTER LOGS TO 'mysql-bin.000013'; 
或
PURGE MASTER LOGS BEFORE '2010-10-18 00:00:00'; 

另外可以通過 RESET MASTER 來刪除整個日志文件,注意,如果使用主從數據庫,在操作前先確保從數據庫已經完全同步了主數據庫的數據。
上述命令都是登陸到mysql后執行的。

無覓相關文章插件,快速提升流量

30选5怎么中奖