2011年12月29日
下面我们进行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
此时你再连接,就会发现能够登陆远程机器的数据库了。
2011年12月28日
针对我们上文双机冗余备份和负载均衡策略(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端口
关闭集群,执行命令:
2011年12月27日
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的感觉没有刚开始好,现在觉得里面博文质量不如以前。