2011年12月27日
下面我們進行SSI整合到Maven構建的程序之中,首先你需要選定你需要整合的版本,因為Maven依賴關系是需要指定Version的,下面是我整合所需要的SSI版本(我用Maven的依賴關系表示):
1 <!--Spring-->
2 <dependency>
3 <groupId>org.springframework</groupId>
4 <artifactId>spring</artifactId>
5 <version>2.5.6</version>
6 </dependency>
7 <!--Ibatis-->
8 <dependency>
9 <groupId>org.apache.ibatis</groupId>
10 <artifactId>ibatis-sqlmap</artifactId>
11 <version>2.3.4.726</version>
12 </dependency>
13 <!--Struts2-->
14 <dependency>
15 <groupId>org.apache.struts</groupId>
16 <artifactId>struts2-core</artifactId>
17 <version>2.1.8.1</version>
18 </dependency>
當然有的新手可能會問,有些依賴我怎么知道Maven的官方依賴中有沒有呢,我怎么知道他有沒有這個版本的呢,其實解決辦法也很簡單,大致可以分為兩種:
1、去Google上面搜索,你可以這樣搜索會更容易搜些:例如我們準備搜下spring的版本,可以這樣寫關鍵詞的“maven spring repository”,這樣搜索記錄的第一條基本上就是的。
2、自己在Maven本地的倉庫中建立依賴關系,默認是在.m2/repository文件夾下面,其中如何建立我不在詳細介紹,按照默認的樣式建就可以的,如果是自己生成的Jar依賴的話,就必須用這種形式了。
那行,下面我們首先進行Spring 所需的依賴配置,首先你在你的父Pom中的dependencies標簽下面寫上上述Spring的dependency,然后你執行命令mvn eclipse:clean eclipse:eclipse,然后在你的eclipse的目錄結構中就會spring-2.5.6.jar這個依賴的(ps.當然這個你要在eclipse中配置一下你的path,這里我不在贅述),同樣配置Ibatis也是一樣的做法,下面我們首先把spring和ibatis整合起來,其實如何整合最好的教程就是spring自帶的官方reference的,你可以參考上面的配置,七大概的位置實在中間層數據訪問/使用ORM工具進行數據訪問(當然我的是中文的reference)。
參考上面的配置我們即可配置一個demo,當然在這里我們需要主要的是xml文件我們為了統一,我們都會放在verticalmarket-config子工程下面,所以讓我們在verticalmarket-dal中引用這些xml配置文件的時候我們要配置項目依賴的,其配置和配置第三方包依賴差不多,下面是我的依賴:
1 <dependency>
2 <groupId>com.tkz.verticalmarket</groupId>
3 <artifactId>verticalmarket-config</artifactId>
4 <version>1.0</version>
5 </dependency>
至于其他的一些靈活配置,大家最好看Maven的官方文檔資料,最重要的是多動手實踐,這樣子才會發現問題,更好的解決問題。
下面我們構建我們項目的骨架,假定我們的項目為verticalmarket的一個項目,那么我們知道這個父工程下面我們要為其建立子模塊,主要是把表示層、業務層及持久層分為不同的模塊,其項目結構大致如下:
1 verticalmarket-dal
2 verticalmarket-manager
3 verticalmarket-service
4 verticalmarket-config
5 verticalmarket-web
當然結構可以隨意,按照你們自己約定俗成的就可以,這個僅為一個例子,下面就讓我們開始創建這個工程,當然Maven的一些基礎知識我不在說明了,可以看下Sonatype公司的教程 Maven權威指南。
1、構建verticalmarket的父母錄,在你的任意目錄下,打開shell窗口(Windows的cmd),輸入命令:
1 mvn archetype:create -DgroupId=com.tkz.verticalmarket -DartifactId=verticalmarket
2、在生成的verticalmarket文件夾下面我們可以看到一個src文件夾和一個pom.xml,刪除src文件夾,然后修改pom文件
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3 <modelVersion>4.0.0</modelVersion>
4 <groupId>com.tkz.verticalmarket</groupId>
5 <artifactId>verticalmarket</artifactId>
6 <packaging>pom</packaging>
7 <version>1.0</version>
8 <name>verticalmarket</name>
9 <url>http://maven.apache.org</url>
10 <dependencyManagement>
11 <dependencies>
12 <dependency>
13 <groupId>junit</groupId>
14 <artifactId>junit</artifactId>
15 <version>4.0</version>
16 <scope>test</scope>
17 </dependency>
18 </dependencies>
19 </dependencyManagement>
20 </project>
其中修改的重點為打包方式改為pom形式,這也就意味這這是一個父工程,另外版本號默認是SNAPSHOT意思是快照的意思,就是項目開發中的意思,你要是看著不爽可以把它刪掉,另外需要說明一下dependencyManagement標簽,這個標簽表示子類可以隱式的繼承父pom文件的依賴庫,在子pom中不需要指定版本號,推薦這樣,這樣可以方便開發,你要修改什么依賴的版本只需要更改父pom就可以了,dependencies是顯示繼承,你要是在子pom中聲明,就必須寫明版本號,不寫默認就繼承了。
3、下面我們構建子工程項目,進入verticalmarket目錄下,輸入命令:
1 mvn archetype:create -DgroupId=com.tkz.verticalmarket -DartifactId=verticalmarket-dal -Dpackage=com.tkz.verticalmarket.dal
然后在父目錄下面就生成了verticalmarket-dal子工程,此時父pom文件自動添加項目關系:
1 <modules>
2 <module>verticalmarket-dal</module>
3 </modules>
這就表示這個工程是verticalmarket子工程,同樣道理,其他命令如下:
1 mvn archetype:create -DgroupId=com.tkz.verticalmarket -DartifactId=verticalmarket-manager -Dpackage=com.tkz.verticalmarket.manager
2 mvn archetype:create -DgroupId=com.tkz.verticalmarket -DartifactId=verticalmarket-service -Dpackage=com.tkz.verticalmarket.service
3 mvn archetype:create -DgroupId=com.tkz.verticalmarket -DartifactId=verticalmarket-config -Dpackage=com.tkz.verticalmarket.config
4 mvn archetype:create -DgroupId=com.tkz.verticalmarket -DartifactId=verticalmarket-web -Dpackage=com.tkz.verticalmarket.web -DarchetypeArtifactId=maven-archetype-webapp
最后的-DarchetypeArtifactId=maven-archtype-webapp,表示這個是web程序結構,其他的默認就是java程序結構
4、然后可以執行命令:
1 mvn eclipse:clean eclipse:eclipse
即生成了eclipse結構,導入到eclipse中你既可以看到你的一個多模塊程序,到目前為止這個程序骨架就算搭建完成了,下一步我們考慮如何整合SSI程序到這個多模塊程序中
網上其實整合框架的資料其實很多的,但是其中整合SSI的相對比較少的,如果是用Maven整合的就是少之又少的,如果是用Maven構建的企業級應用(多模塊開發)整合SSI框架的實例基本上是沒有的,所以寫下這篇教程(當然這個教程其實算是入門級的多模塊應用程序開發),希望那些新手們做類似的開發時可以少走些彎路,當然也熱烈歡迎大牛指點不足。
廢話不再多說,下面我們開始:
首先我們必須搭建起Maven運行環境,當然這里是在你已經有Java運行環境的前提這下進行的:
1、下載Maven,現在最新版本為Maven 2.2.1,下載地址為http://maven.apache.org/download.html
2、解壓下載的apache-maven-2.2.1-bin.tar.gz(若你的是Windows環境你也可以選擇apache-maven-2.2.1-bin.zip,都是差不多的),到任意目錄下面,比如我的目錄為/home/用戶名/develop/programs。
3、配置Maven的環境變量,配置M2_HOME,例如我的配置M2_HOME=/home/用戶名/develop/programs/apache-maven-2.2.1,然后將M2_HOME加入到PATH當中
4、驗證Maven環境是否搭建成功,打開shell窗口(Windows的cmd窗口),輸入命令:
命令如下:
如果出現下屬信息即算搭建成功:
顯示信息如下:
1 Apache Maven 2.2.1 (r801777; 2009-08-07 03:16:01+0800)
2 Java version: 1.6.0_18
3 Java home: /home/用戶名/develop/programs/jdk1.6.0_18/jre
4 Default locale: zh_CN, platform encoding: UTF-8
5 OS name: "linux" version: "2.6.31-20-generic" arch: "i386" Family: "unix"
5、此時環境已經搭建OK了,下面我們就開始Maven構建企業級應用開發
在配置Mysql數據庫遠程連接的過程中,防火墻和授權都已經做了,可是還是不能鏈接上去,并且發現連接的時候報這個錯誤ERROR 1042 (HY000): Can't get hostname for your address,
查了下資料可能是Mysql的DNS解析有問題,只要我們在mysql的配置文件my.cnf中配置如下代碼就可以連接成功了:
1 [mysqld]
2 skip-name-resolve
此時你再連接,就會發現能夠登陸遠程機器的數據庫了。
針對我們上文雙機冗余備份和負載均衡策略(Mysql Cluster入門安裝配置指南)中配置好的mysql集群,我們應當下面就創建數據庫,利用Mysql Cluster來進行冗余備份和負載均衡,
在192.168.56.10或者192.168.56.20任意一臺機器上,訪問數據庫,命令為:
比如現在我在192.168.56.10機器上面創建數據庫assetscenterdb,執行命令:
1 create database assetscenterdb
創建成功之后,在192.168.56.20的機器上面就可以看到我們創建的這個數據庫,接下來我們要創建數據庫表,
這里我們注意數據庫表的ENGINE是ndb,比如說數據庫里面我的一個表結構這個樣子:
1 CREATE TABLE `AC_ASSET` (
2 `ID` int(11) NOT NULL AUTO_INCREMENT,
3 `TYPE_ID` int(11) NOT NULL,
4 `STATUS` tinyint(4) NOT NULL,
5 `SN` varchar(50) DEFAULT NULL,
6 `DESCRIPTION` text,
7 `ELTMS` varchar(50) DEFAULT NULL,
8 `ORDER_NAME` varchar(50) DEFAULT NULL,
9 `OWNER_NAME` varchar(50) DEFAULT NULL,
10 `WAREHOUSE_TIME` varchar(50) DEFAULT NULL,
11 `LOCATION` varchar(100) DEFAULT NULL,
12 `PRICE` double DEFAULT NULL,
13 `USER_NAME` varchar(50) DEFAULT NULL,
14 PRIMARY KEY (`ID`)
15 ) ENGINE=ndb AUTO_INCREMENT=1726 DEFAULT CHARSET=utf8;
只有這樣子,這兩臺機器才能共享數據庫的數據結構,此時在另外一臺機器上面,執行命令:
就可以看到我們創建的這張表。
那么Java程序如何訪問呢,我采用的Jdbc驅動為mysql-connector-5.1.12,連接串如下:
1 jdbc:mysql:loadbalance://192.168.56.10:3306,192.168.56.20:3306/assetscenterdb?roundRobinLoadBalance=true
使用roundRobin算法,若是其中一臺機器down掉以后,將會自動將不能訪問的數據庫服務器 踢除,如果還原后將繼續進行壓力分載。
其余的數據庫操作就和普通的一樣。
接下來我們還需要配置數據庫允許遠程訪問,比如我把服務器放在192.168.56.30機器上面,我需要在另外兩臺機器上面分別配置:
1 grant all on *.* to root@"192.168.56.30" Identified by "你的密碼"
然后你運行服務器就可以正常訪問了。
如果此時你的程序還不能正常訪問,那么你就需要看我這一篇博文Mysql數據庫“ERROR 1042 (HY000): Can't get hostname for your address”問題,
因為我就遇到了這種問題,我本地用上述配置就可以了,可是我把機器放到LAB中去了,mysql連接不上了,出現了ERROR 1042 (HY000): Can't get hostname for your address錯誤,
可能就是mysql的DNS解析除了問題,我的本地環境和Lab的DNS不一樣,才會造成這個問題的。
MySQL Cluster 是MySQL適合于分布式計算環境的高實用、高冗余版本。它采用了NDB Cluster 存儲引擎,允許在1個 Cluster 中運行多個MySQL服務器。MySQL Cluster 是一種技術,該技術允許在無共享的系統中部署“內存中”數據庫的 Cluster 。通過無共享體系結構,系統能夠使用廉價的硬件,而且對軟硬件無特殊要求。此外,由于每個組件有自己的內存和磁盤,不存在單點故障。


首先我們下載Mysql Cluster,下載鏈接地址為MySQL Cluster 7.1.17,我們采用的服務器為CentOS Server和Ubuntu Server,所以我們下載針對Linux Generic版本。
現在我有三臺服務器,兩個是CentOS Server,一個是Ubuntu Server,前兩個Server分別作為Data Node和SQL Node(Data Node和SQL Node在同一個機器上面),
后者作為Management Node,如果沒有真實機器的,可以用虛擬機模擬,下面是我的IP部署:
1 192.168.56.10 Data Node + Sql Node
2 192.168.56.20 Data Node +Sql Node
3 192.168.56.30 Management Node
下面是我機器的大致拓撲圖結構:

接下來我們就需要對這幾個節點進行詳細的配置工作:
1、配置Data Node和SQL Node
目前我們采用的三臺機器策略,所以把這兩個節點放在同一個機器上面,所以我們在一次配置就可以了。
首先我們在192.168.56.10這臺機器上面進行操作配置,192.168.56.20操作配置和這樣
我們需要在ROOT賬戶下面執行下屬操作,如果在CentOS中遇到命令找不到的問題,就參考我的BlogCentOS系統bash: groupadd: command not found問題
接下來我們要創建一個新的用戶組和用戶,命令如下:
1 groupadd mysql
2 useradd –g mysql mysql
將mysql cluster放在/usr/local/下面,執行命令:
1 tar -C /usr/local -xzvf mysql-cluster-gpl-7.1.17-linux-i686-glibc23.tar.gz
2 ln -s /usr/local/mysql-cluster-gpl-7.1.17-linux-i686-glibc23 /usr/local/mysql
進入到mysql目錄下面,執行數據庫初始化命令:
1 scripts/mysql_install_db --user=mysql
進行權限更改操作,命令為:
1 chown -R root .
2 chown -R mysql data
3 chgrp -R mysql .
2、配置Management Node
將ndb_mgmd和ndb_mgm腳本文件放入到/usr/local/bin目錄下面,命令為:
1 tar -zxvf mysql-5.1.56-ndb-7.1.17-linux-i686-glibc23.tar.gz
2 cd mysql-5.1.56-ndb-7.1.17-linux-i686-glibc23
3 cp bin/ndb_mgm* /usr/local/bin
更改其對應的權限,命令為:
1 cd /usr/local/bin
2 chmod +x ndb_mgm*
新建目錄/var/lib/mysql-cluster/,命令為:
mkdir -p /var/lib/mysql-cluster/
3、配置三臺機器的配置文件
兩臺數據節點的在/etc目錄下面創建配置文件my.cnf,其內容為:
[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
port=3306
[mysql_cluster]
ndb-connectstring=192.168.56.10
如果在運行過程中出現Mysql數據庫“Communications link failure due to underlying exception”問題,請參考這邊博文進行配置。
針對192.168.56.20機器只要把ndb-connectstring替換一下就行了。
在管理節點機器/etc目錄下面創建config.ini文件,其內容為:
1 [ndbd default]
2 NoOfReplicas=2
3 DataMemory=80M
4 IndexMemory=18M
5
6 [ndb_mgmd]
7 NodeId=1
8 hostname=192.168.56.30
9 datadir=/var/lib/mysql-cluster
10
11 [ndbd]
12 NodeId=2
13 hostname=192.168.56.10
14 datadir=/usr/local/mysql/data
15
16 [ndbd]
17 NodeId=3
18 hostname=192.168.56.20
19 datadir=/usr/local/mysql/data
20
21 [mysqld]
22 [mysqld]
4、啟動集群環境
首先我們需要先啟動管理節點192.168.56.30機器,執行命令:
1 ndb_mgmd -f /etc/config.ini --initial
如果出現The default config directory '/usr/local/mysql/mysql-cluster' does not exist這個錯誤信息,就手動創建這個文件夾。
接下來我們需要在192.168.56.10和192.168.56.20啟動數據節點,命令為:
第一次啟用需要加—initial參數,第二次啟動不能加這個參數。兩臺機器都分別執行這個命令。
接下來啟動這兩臺機器的sql節點,命令為:
1 bin/mysqld_safe --user=mysql &
兩臺機器都需要執行這個命令。
最后進入到管理臺查看我們的集群是否配置完成,輸入命令:
如果出現下面信息,說明配置成功:

如果看不到上述信息,可能是防火墻問題,你可以選擇把CentOS的防火墻關掉,命令為:
1 /etc/init.d/iptables stop
當然你可以選擇配置防火墻,開放一些必要的端口,可以參考我的另一篇文章CentOS 打開3306端口
關閉集群,執行命令:
MySQL默認的空閑等待時間是8個小時,一旦空閑超過8個小時,就會拋出“Communications link failure due to underlying exception”異常,修改/etc/my.cnf(windows下為my.ini),將超時時間設置為30天,在[mysqld]后面加入:
然后重啟mysql服務即可。
Session失效,我們需要跳轉到登陸界面,可是如果是IFRAME的話,可能就直接在IFRAME里面跳轉了,這不是我們想要的結果,其實我們只要加上下面這段代碼,就可以跳轉到一個全新的頁面,代碼如下:
1 <script type="text/javascript">
2 if(top != self) {
3 if(top.location != self.location) {
4 top.location = self.location;
5 }
6 }
7 </script>
在CentOS系統中防火墻默認是阻止3306端口的,我們要是想訪問mysql數據庫,我們需要這個端口,命令如下:
1 /sbin/iptables -I INPUT -p tcp --dport 3036 -j ACCEPT
我們需要保存我們的操作,命令如下:
1 /etc/rc.d/init.d/iptables save
此時我們可以查看端口的狀態,命令如下:
1 /etc/init.d/iptables status
當然如果你打開其他端口也一樣,只需要把這個端口號換乘你需要的端口號即可。
這幾天努力把ItEye上面的博文都遷到cnBlog上面來~~
可惜cnBlog沒有一鍵導入的功能~~
個人對ItEye的感覺沒有剛開始好,現在覺得里面博文質量不如以前。
如果我們需要在CentOS執行新建用戶組命令的時候,需要進入到ROOT權限,如果你用以下命令:
進入到ROOT賬戶,那么會出現上述的錯誤信息:“bash: groupadd: command not found”
這是因為執行這個兩個進入ROOT命令不會把你的PATH環境變量帶過去,你需要執行命令:
這樣子進入ROOT權限,執行groupadd或者useradd命令就不會有問題了。
1、我們需要在虛擬機得Ubuntu系統安裝ssh服務,其安裝命令為:
1 sudo apt-get install ssh
查詢其服務時候安裝成功的命令:
如顯示如下結果,即表明服務啟動成功:
1 tcp 0 0 *:ssh *:* LISTEN
2、修改VirtualBox虛擬機的網絡連接方式,其默認為NAT連接方式,我們將其改為Bridged Adapter連接方式
3、修改虛擬機中Ubuntu的IP地址,使其與外面系統在同一網段,例如我的外面機器IP為192.168.0.2,那么我
將其內部IP地址修改如下:
1 sudo vim /etc/network/interfaces
將這個interfaces文件的增加以下內容:
1 auto eth0
2 iface eth0 inet static
3 address 192.168.0.3
4 netmask 255.255.255.0
5 gateway 192.168.0.1
然后查看DNS文件,一般默認即為正確的:
sudo vim /etc/resolv.conf
然后重啟網絡,或者重啟系統即可,然后我們發現使用遠程連接軟件putty或者加強版的pietty連接即可!