ibatis可以移植到linux系统移植上吗

spring+struts+ibatis+linux+resin问题!!! - ITeye问答
没办法了!!!搞了一天没解决,在windows下的tomcat运行一点错误没有,但是发布到linux下使用resin时就出这个错误,郁闷一天了!我觉得是编码什么的出的问题,本人对linux不大熟!&&&&&
onException: Error creating bean with name 'ibatisTemplate' defined in file [/opt/ku6ads/ku6ads/WEB-INF/classes/spring-config/applicationContext.xml]: Cannot resolve reference to bean 'sqlMapClient' while setting bean property 'sqlMapClient'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlMapClient' defined in file [/opt/ku6ads/ku6ads/WEB-INF/classes/spring-config/applicationContext.xml]: Invocation o nested exception is java.lang.NoSuchMethodError: com.ibatis.common.xml.NodeletParser.parse(Ljava/io/InputS)V
&&&&&&& at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
&&&&&&& at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&&&&&&& at java.security.AccessController.doPrivileged(Native Method)
大侠们帮我看看,万分感谢,以下是配置文件的一部份!
&bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&
&property name="driverClassName" value="com.mysql.jdbc.Driver"&&/property&
&property name="username" value="root"&&/property&
&property name="password" value="123"&&/property&
....
&/bean&
&&&&&&& &bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" &
&property name="dataSource" ref="dataSource"&&/property&
&tx:annotation-driven transaction-manager="transactionManager"/&
&bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&
&property name="configLocation" value="classpath:sqlmap-config.xml"&&/property&
&property name="dataSource" ref="dataSource"&&/property&
&bean id="ibatisTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"&
&property name="sqlMapClient" ref="sqlMapClient"&&/property&
sqlmap-config.xml文件中我全删除了,只有如下部分,但依然报同样的错
&?xml version="1.0" encoding="utf-8" ?&
&!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"&
&sqlMapConfig&
&settings useStatementNamespaces="true"/&
&&&&&&&& &sqlMap resource="sql/sys/SysSequence.xml" /&
&/sqlMapConfig&
问题补充:liuyuantp 写道Error creating bean with name 'ibatisTemplate' defined in file
我知道是那错了!可是该怎么改,错哪了?
问题补充:liuyuantp 写道asm包冲突。去掉一个
大侠你帮我看下我的包
asm包冲突。去掉一个
Error creating bean with name 'ibatisTemplate' defined in file
已解决问题
未解决问题ibatis的调试相对困难,出错的时候主要依据是log4生成的log文件和出错提示,这方面要能比较熟练的看懂.
下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回hash表\动态sql
如果对下面这段配置能信手粘来的话,那开发速度将会大大的提升.
&statement id="XinxiTable_SelectAll" listClass="ArrayList"&&&&&&&&&&&&&&& resultMap="SimpleXinxi" parameterClass="Hashtable" cacheModel="xinxi-cache" &&&&&& SELECT&&&&&&& &dynamic prepend="top"&&&&&&&&&& &isNotEqual prepend="top" property="TopNum" compareValue = "0"&&&&&&&&&&&& $TopNum$&&&&&&&&& &/isNotEqual&&&&&&&& &/dynamic&&&&&& *&&&&& FROM&&&&& (select a.[iXinxiID],a.[sXinxiTitle],a.[iXinxiClassId],b.[sClassName],&&&&& a.[dXinxiDate],a.[dXinxiYxq],a.[iXinxiHits],a.[sXinxiUser],a.[sRedirectUrl],&&&&& ROW_NUMBER() OVER(&&&&& &dynamic prepend="order by"&&&&&& &isEqual prepend="order by" property="Sort" compareValue = "0"&&&&&&&& a.iXinxiID desc&&&&& &/isEqual&&&&&& &isEqual prepend="order by" property="Sort" compareValue = "1"&&&&&&&& a.iXinxiID asc&&&&& &/isEqual&&&&&& &isEqual prepend="order by" property="Sort" compareValue = "2"&&&&&&&& a.iXinxiHits desc&&&&& &/isEqual&&&&&& &isEqual prepend="order by" property="Sort" compareValue = "3"&&&&&&&& a.iXinxiHits asc&&&&& &/isEqual&&&& &/dynamic&&&&&& ) as row&&&&& FROM&&&&& [dbo].[XinxiTable] as a,[dbo].[XinxiClass] as b&&&&& &dynamic prepend="where"&&&&&&&& &isParameterPresent&&&&&&&&&& &isNotEmpty prepend="and" property="XinxiType" &&&&&&&&&&&& a.[iXinxiState]= $XinxiType$&&&&&&&&& &/isNotEmpty&&&&&&&&&& &isNotEqual prepend="and" property="XinxiClass" compareValue = "0"&&&&&&&&&&&& a.[iXinxiClassID]= $XinxiClass$&&&&&&&&& &/isNotEqual&&&&&&&&&& &isEqual prepend="and" property="SearchType" compareValue = "1"&&&&&&&&&&&& a.[sXinxiTitle] LIKE '%$Keyword$%'&&&&&&&&& &/isEqual&&&&&&&&&& &isEqual prepend="and" property="SearchType" compareValue = "2"&&&&&&&&&&&& (a.[sXinxiTitle] LIKE '%$Keyword$%' or a.[sXinxiContent] LIKE '%$Keyword$%')&&&&&&&&& &/isEqual&&&&&&&& &/isParameterPresent&&&&&& &/dynamic&&&&&& and a.iXinxiClassId=b.iClassId&&&&& )a&&&&& &dynamic prepend="where"&&&&&&&& &isParameterPresent&&&&&&&&&& &isEqual prepend="and" property="IsPage" compareValue = "1"&&&&&&&&&&&& row between $PageLower$ and $PageUpper$&&&&&&&&& &/isEqual&&&&&&&& &/isParameterPresent&&&&&& &/dynamic&&&& &/statement&
ibatis动态查询条件:
&select id="SelectEemployee" parameterClass="string" resultMap = "employee-result"&
&&&&&&&&&&& select * from employee
//动态SQL语句
&&&&&&&&&&& &&dynamic prepend="WHERE"&
&&&&&&&&&&&&&&& &&isParameterPresent&
&&&&&&&&&&&&&&&&&&& && emp_id = #value#
&&&&&&&&&&&&&&& &&/isParameterPresent&
&&&&&&&&&&& & &/dynamic&
&&&&&&& &/select&
&&& &/statements&
动态SQL的写法:
开始 &dynamic
条件成立时前面要加的字符串 prepend ="字符串"&
&属性关键字& (见下表)
prepend="字符串"
判断条件的对象属性名 property="字符串"
如果是属性关键字是比较条件时,字符串存放要比较的值compareValue="字符串"&
要显示的条件名
&/属性关键字&
结束&/dynamic&
动态SQL的参数有
属性关键字
如果参数相等于值则查询条件有效。
&isNotEqual&
如果参数不等于值则查询条件有效。
&isGreaterThan&
如果参数大于值则查询条件有效。
&isGreaterEqual&
如果参数等于值则查询条件有效。
&isLessEqual&
如果参数小于值则查询条件有效。如下所示:
&isLessEqual prepend = &AND& property = &age& compareValue = &18& &
ADOLESCENT = &TRUE&
&/isLessEqual&
&isPropertyAvailable&
如果参数有使用则查询条件有效。
&isNotPropertyAvailable&
如果参数没有使用则查询条件有效。
如果参数为NULL则查询条件有效。
&isNotNull&
如果参数不为NULL则查询条件有效。
如果参数为空则查询条件有效。
&isNotEmpty&
如果参数不为空则查询条件有效。参数的数据类型为Collection、String 时参数不为NULL或&&。如下所示:
&isNotEmpty prepend=&AND& property=&firstName& &
FIRST_NAME=#firstName#
&/isNotEmpty&
&isParameterPresent&
如果参数类不为NULL则查询条件有效。
&isNotParameterPresent&
Checks to see if the parameter object is not present (null). Example Usage:
&isNotParameterPresent prepend=&AND&&
EMPLOYEE_TYPE = &DEFAULT&
&/isNotParameterPresent&
ibatis如何出入动态传入指定表和指定列查询对应数据?
ibatis 的配置如下:
&select id="selectDataOfTable" resultClass="java.util.Hashtable" parameterClass="java.util.Map"&
&&& &![CDATA[
&&& SELECT $column$ FROM $tableName$
&&& &/select&
当传出:tableName: CC_RPT_DF01
column&& :
TO_CHAR(MONTH_CODE,'yyyy-MM-dd hh:mi:ss') MONTH_CODE,decode(BUSINESS_PLACE_CODE,NULL,'',BUSINESS_PLACE_CODE)BUSINESS_PLACE_CODE,decode(PRICE_ID,NULL,'',PRICE_ID)PRICE_ID,decode(TRADE_CODE,NULL,'',TRADE_CODE)TRADE_CODE,decode(INTERVAL,NULL,'',INTERVAL)INTERVAL,decode(TOTAL_POWER,NULL,0,TOTAL_POWER)TOTAL_POWER,decode(TOTAL_POWER_YG,NULL,0,TOTAL_POWER_YG)TOTAL_POWER_YG,decode(TOTAL_POWER_WG,NULL,0,TOTAL_POWER_WG)TOTAL_POWER_WG,decode(FAVOR_POWER,NULL,0,FAVOR_POWER)FAVOR_POWER,decode(ADD_POWER,NULL,0,ADD_POWER)ADD_POWER,decode(TOTAL_FEE,NULL,0,TOTAL_FEE)TOTAL_FEE,decode(CONTENT_FEE,NULL,0,CONTENT_FEE)CONTENT_FEE,decode(CAPA,NULL,0,CAPA)CAPA,decode(CAPA_FEE,NULL,0,CAPA_FEE)CAPA_FEE,decode(NEED,NULL,0,NEED)NEED,decode(NEED_FEE,NULL,0,NEED_FEE)NEED_FEE,decode(BASE_FEE,NULL,0,BASE_FEE)BASE_FEE,decode(COS_ADD_FEE,NULL,0,COS_ADD_FEE)COS_ADD_FEE,decode(COS_REDUCE_FEE,NULL,0,COS_REDUCE_FEE)COS_REDUCE_FEE,decode(FAVOR_FEE,NULL,0,FAVOR_FEE)FAVOR_FEE,decode(ADD_FEE,NULL,0,ADD_FEE)ADD_FEE,decode(SANXIA_FEE,NULL,0,SANXIA_FEE)SANXIA_FEE,decode(CHENGSHI_FEE,NULL,0,CHENGSHI_FEE)CHENGSHI_FEE,decode(PROVINCE_FEE,NULL,0,PROVINCE_FEE)PROVINCE_FEE,decode(STATE_FEE,NULL,0,STATE_FEE)STATE_FEE,decode(NONGWANG_FEE,NULL,0,NONGWANG_FEE)NONGWANG_FEE,decode(ENERGY_FEE,NULL,0,ENERGY_FEE)ENERGY_FEE,decode(OTHER_FEE,NULL,0,OTHER_FEE)OTHER_FEE,decode(USER_COUNT,NULL,0,USER_COUNT)USER_COUNT
能查出CC_RPT_DF01 表对应 列& 的数据 。
当第二次传入& tableName:CC_RPT_DF11
column&& :
TO_CHAR(MONTH_CODE,'yyyy-MM-dd hh:mi:ss') MONTH_CODE,decode(BUSINESS_PLACE_CODE,NULL,'',BUSINESS_PLACE_CODE)BUSINESS_PLACE_CODE,decode(VOLTAGE_LEVEL,NULL,'',VOLTAGE_LEVEL)VOLTAGE_LEVEL,decode(SALE_ID,NULL,'',SALE_ID)SALE_ID,decode(USER_NUM,NULL,0,USER_NUM)USER_NUM,decode(SUM_CAPA,NULL,0,SUM_CAPA)SUM_CAPA
Check the selectDataOfTable-AutoResultMap.&
--- Check the result mapping for the 'PRICE_ID' property.&
--- Cause: java.sql.SQLException: 列名无效; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:&&
--- The error occurred in com/szp/eai/dataobject/Common.xml.&
--- The error occurred while applying a result map.&
第二次传入的列名和数据库表中一致。
我感觉好像 SELECT $column$ FROM $tableName$ 这中语句,ibatis记住了第一次出入的列,第二次传入的新列没有用。
要实现这中功能,ibatis该如何做?
这个问题是因为你查询的sql的列是变化的,但是ibatis默认的会缓存RS中的meta信息,如果你第一次查询的列和第二次查询的列不一样的话,那么第二次ibatis还会以第一次查询的列为key从RS里面获取数据,但是你的列是变化的,所以第二次取数据的时候,RS里面已经没有了你第一次的那个列了,所以会出错。 幸好ibatis 可以设置来改变这种缓存引起的问题,就是这个remapResults=true
&select id="" parameterClass="" resultClass="" remapResults="true"&
iBATIS的select&标签&#于&$区别------模糊查询
&& 在IbatiS的select中有两个占位符 # 和 $
&& 我们先看一个 一个查询语句:
&&& select * from user where Name = #userName#;
&& 我们用#这个占位符可以查询到 我们想要的结果,可是当我们需要模糊查询的时候该怎么办呢?
&& select * from user where Name = &%#userName#%&(错误的写法);如果我们这样写,程序在编译的时候会报错,因为 # 这个占位符前面还有别的 符号,#这个占位符是不允许这样写的,这个时候我们就可以用 $ 这个占位符:
&& select * from user where Name = &%$userName$%&(正确的模糊查询写法),这样写编译器不会报错,也能得到我们想要的结果。
&&& 归根结底的原因就是 # 占位符会把我们的SQL 语句翻译成
&&& select * from user where Name = ? 这样的语句,然后在填充参数。
&&& $ 占位符会把我们的SQL语句 翻译成
&&& select * from user where Name = '想要查询的东西' 这个样标准的SQL语句
阅读(...) 评论()文章分类 - Linux
摘要: #自定义别名 echo &alias cls='clear'& && ~/.bashrc echo &alias yum='sudo yum'& && ~/.bashrc echo &alias yumi='yum install -y'& && ~/.bashrc echo &alias npm='sudo npm'& && ~/.bashrc echo &alias cnpm='su
水之原 阅读(37) |
摘要: #sudo apt update #sudo apt upgrade -y #自定义别名 echo &alias cls='clear'& && ~/.bashrc echo &alias apt='sudo apt'& && ~/.bashrc echo &alias apti='apt install -y'& && ~/.bashrc echo &alias npm='sudo npm'&...
水之原 阅读(54) |
摘要: sudo apt install fcitx table wubi fcitx table wbpy
水之原 阅读(53) |
摘要: sudo apt get install flashplugin installer
水之原 阅读(23) |
摘要: 1、安装setuptools pacman -S setuptools 上面不能安装时,用下面手动安装 wget &https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev& --no-check-cert
水之原 阅读(395) |
摘要: linux系统安装软件是有时会碰到“dpkg 被中断,您必须手工运行 sudo dpkg –configure -a解决此问题”,然而按照提示运行却并没能很好的解决问题。其实导致这个问题的主要原因是因为/var/lib/dpkg/updates文件下的文件有问题,可能是其他软件安装过程或是其他原因导
水之原 阅读(846) |
摘要: sudo -H pip install --trusted-host pypi.mirrors.ustc.edu.cn ipython
水之原 阅读(2129) |
摘要: 查看当前发行版可以使用的shell[jack@localhost ~]$ cat /etc/shells /bin/sh/bin/bash/sbin/nologin 查看当前使用的shell一、最常用的查看shell的命令,但不能实时反映当前shell[jack@localhost ~]$ echo
水之原 阅读(2965) |
摘要: 错误提示: E: 无法获得锁 /var/lib/apt/lists/lock – open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 这个问题在Ubuntu系统下非常常见,在添加源,然后在更新源时中途中断了更新,只要再安装软件或者再去更新的时候就会出
水之原 阅读(7336) |
摘要: 本文推荐了对于Linux系统管理员很有用的16个在线工具。1.ExplainShell.com命令解释对于Linux用户来说每天都会写各种命令和脚本,那么你可以使用这个网站工具来查看命令式如何工作的,这样可以避免不必要的错误出现;也是一个很好的学习命令的方式2.BashrcGenerator.com...
水之原 阅读(51) |
摘要: 在使用Linux服务器的过程中,有16个命令可以帮助你全面了解你的服务器的运行状况。如果你能够很熟练地掌握这些命令,就离成为一名专业的Linux系统管理员不远啦!在不同的Linux发行版中,会有不同的GUI程序可以显示各种系统信息,比如SUSE Linux发行版中,就有非常棒的图形化的配置和管理工具...
水之原 阅读(82) |
摘要: 后台进程:smon:处理数据库,undo,temp,表空间回收dbwr:主要处理数据库缓冲区的数据写到硬盘lgwr:把日志buffer的数据写到日志文件ckpt:触发dbwr写脏数据到数据文件pmon:清空用户连接上来的那些进程资源
水之原 阅读(33) |
摘要: #启动数据库su - oraclesqlplus /#关闭数据库su - oraclesqlplus / as sysd#启动监听lsnrctl start#关闭监听lsnrctl stop#查看数据库监听状态lsnrct...
水之原 阅读(64) |
摘要: 查看cpu的个数cat /proc/cpuinfo |grep &processor& |wc -l查看内存的大小cat /proc/meminfo查看内存free -m查看硬盘分区的大小df -h查看进程ps -ef |grep *** 查看系统统计信息(包括cpu,me...
水之原 阅读(23) |
摘要: 1. vi /usr/share/gdm/defaults.conf以下各项修改成如下值Port=177AllowRoot=trueAllowRemoteRoot=trueEnable=true:wq!保存2.使用图形界面做如下配置3.gdm-restart4.打开xBrowser5.双击图中的RH...
水之原 阅读(83) |
摘要: VNC的安装与使用本人的操作环境:被控端 Redhat9.0,主控端Windows 7。安装.rpm –Uvhvnc-4_1_3-x86_linux.rpm(如果是源代码请看包里的说明)在Linux上启动VNC Server执行VNCserver命令:[root@Linux root]# VNCse...
水之原 阅读(10878) |
摘要: 1.打开防火墙过滤的端口:编辑文件:vi/etc/sysconfig/iptables,在下面的红色字体内容前面加入蓝色字体内容:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]:RH-Firewall-1-INPUT - [0:0]-A INPUT -j RH-Fi...
水之原 阅读(75) |
摘要: 虽然经常忘记去弄VPS,但是看着挺有意思,时不时就用vnc连接上去,翻翻墙,不过今天登录不了,报错提示:问题可能在于:1、没有打开vnc的服务(检查一下);2、配置redhat的vncserver时,没有将默认的端口号5900+n添加到防火墙中。在使用vncviewer尝试连接vncserver时,...
水之原 阅读(216) |iBatis简单入门教程_Linux教程_Linux公社-Linux系统门户网站
你好,游客
iBatis简单入门教程
来源:Linux社区&
作者:Linux
iBatis 简介:
iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。
iBatisDemo下载:
免费下载地址在
用户名与密码都是www.linuxidc.com
具体下载目录在 /2014年资料/1月/4日/iBatis简单入门教程
下载方法见
官网为:http://www.mybatis.org/
Spring MVC 注释 + iBATIS 整合&
Student.xml里面的addStudent居然有个;结束啊,(自己注意)
搭建iBatis 开发环境:
1 、导入相关的jar 包,ibatis-2.3.0.677.jar 、mysql-connector-java-5.1.6-bin.jar
2 、编写配置文件:
Jdbc 连接的属性文件
总配置文件, SqlMapConfig.xml
关于每个实体的映射文件(Map 文件)
Student.java:
package com.iflytek.
import java.sql.D
/**&* @author xudongwang &* &*& & & & Email:&* &*/public class Student {&// 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题&&private S&private D&
&public int getId() {&&}
&public void setId(int id) {& this.id =&}
&public String getName() {&&}
&public void setName(String name) {& this.name =&}
&public Date getBirth() {&&}
&public void setBirth(Date birth) {& this.birth =&}
&public float getScore() {&&}
&public void setScore(float score) {& this.score =&}
&@Override&public String toString() {& return "id=" + id + "\tname=" + name + "\tmajor=" + birth + "\tscore="& & + score + "\n";&}
相关资讯 & & &
& (04/05/:22)
& (06/08/:15)
& (04/05/:51)
& (01/01/:49)
& (02/29/:06)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款  淘宝网,是一个在线商品数量突破一亿,日均成交额超过两亿元人民币,注册用户接近八千万的大型电子商务网站,是亚洲最大的购物网站。那么对于淘宝网这样大规模的一个网站,我猜想大家一定会非常关心整个网站都采用了什么样的技术、产品和架构,也会很想了解在淘宝网中是否采用了开源的软件或者是完全采用的商业软件。那么下面我就简单的介绍一下淘宝网中应用的开源软件。  对于规模稍大的网站来说,其IT必然是一个服务器集群来提供网站服务,数据库也必然要和应用服务分开,有单独的数据库服务器。对于像淘宝网这样规模的网站而言,就是应用也分成很多组。那么下面,我就从应用服务器操作系统、应用服务器软件、Web Server、数据库、开发框架等几个方面来介绍一下淘宝网中开源软件的应用。  操作系统  我们首先就从应用服务器的操作系统说起。一个应用服务器,从软件的角度来说他的最底层首先是操作系统。要先选择操作系统,然后才是操作系统基础上的应用软件。在淘宝网,我们的应用服务器上采用的是Linux操作系统。Linux操作系统从1991年第一次正式被公布到现在已经走过了十七个年头,在PC Server上有广泛的应用。硬件上我们选择PC Server而不是小型机,那么Server的操作系统供我们选择的一般也就是Linux,FreeBSD, Windows 2000 Server或者Windows Server 2003。如果不准备采用微软的一系列产品构建应用,并且有能力维护Linux或者FreeBSD,再加上成本的考虑,那么还是应该在Linux和 FreeBSD之间进行选择。可以说,现在Linux和FreeBSD这两个系统难分伯仲,很难说哪个一定比另外一个要优秀很多、能够全面的超越对手,应该是各有所长。那么在选择的时候有一个因素就是企业的技术人员对于哪种系统更加的熟悉,这个熟悉一方面是系统管理方面,另外一方面是对于内核的熟悉,对内核的熟悉对于性能调优和对操作系统进行定制剪裁会有很大的帮助。而应用全面的优化、提升性能也是从操作系统的优化开始的。  应用服务器  在确定了服务器的硬件、服务器的操作系统之后,下面我们来说说业务系统的构建。淘宝网有很多业务系统应用是基于JEE规范的系统。还有一些是C\C++构建的应用或者是Java构建的Standalone的应用。那么我们要选择一款实现了JEE规范的应用服务器。我们的选择是JBoss Applcation Server。JBoss AS是RedHat的一个开源的支持JEE规范的应用服务器。在几年前,如果采用Java技术构建互联网应用或者企业级应用,在开源软件中的选择一般也就是Apache组织的Tomcat、JBoss的 JBoss AS和Resin。严格意义上讲,Tomcat和Resin并不能算是一个应用服务器,他们是实现了部分J2EE规范的一个容器。而商业软件的选择就是IBM的WebSphere和BEA的WebLogic。到了现在,除了JBoss AS外,Apache的Geronimo,Sun的Glassfish也都是很优秀的JEE应用服务器。也给现在的开发人员提供了更多的选择。具体对于目前JEE应用服务器的比较。这边就不在赘述。  在应用服务器前端,我们采用了Web Server做了一次转发,我们选择的Web服务器是大名鼎鼎的Apache。几年前,Apache几乎是Linux系统上开源Web Server的唯一选择。那个时候虽然也有一些其他的开源的Web Server,但是从功能和稳定性上来说都无法和Apache相对。在今天来说,Lighty也会是一个非常好的选择。Lighty是一个非常轻量级、占用内存资源也比较少的Web Server。虽然功能上没有Apache强大,但是在不少场景下,性能是非常出色、强于Apache的。而微软的IIS,就只能工作在Windows的系统上了。并且使用IIS的话,基本上也就是选择了ISAPI、ASP或者ASP.NET进行Web应用的开发了。  数据库  说完了我们采用的操作系统、应用服务器、WebServer后,下面就来谈谈我们的数据库。在淘宝网的应用中,采用了两种关系型数据库管理系统。一个是 Oracle公司的Oracle 10g,另外一个是Sun MySQL的MySQL。Oracle是一款优秀的、广泛采用的商业数据库管理软件。有很强大的功能和安全性,可以处理相对海量的数据。而MySQL是一款非常优秀的开源数据库管理软件,非常适合用多台PC Server组成多点的存储节点阵列(这里我所指的不是MySQL自身提供的集群功能),每单位的数据存储成本也非常的低廉。用多台PC Server安装MySQL组成一个存储节点阵列,通过MySQL自身的Replication或者应用自身的处理,可以很好的保证容错(允许部分节点失效),保证应用的健壮性和可靠性。可以这么说,在关系数据库管理系统的选择上,可以考虑应用本身的情况来决定。  一个互联网应用,除了服务器的操作系统,Web Server软件,应用服务器软件,数据库软件外,我们还会涉及到一些其他的系统,比如一些中间件系统、文件存储系统、搜索、分布式框架、缓存系统等等。在淘宝网,这些系统都是自主开发的,没有采用目前商业的或者开源的产品。有些系统,会存在着一些开源的产品或者商业产品。但是,考虑到淘宝网自己的需求和大并发量的压力,这些系统都选择了自主开发框架。  前面谈的都是系统级的产品,下面我们说说开发框架的使用。可能有朋友想问,作为一个如此大规模的网站,淘宝网的Web展现层采用的是什么框架,是怎么实现的呢?曾经也有到淘宝的应聘者问过我这个问题,他问我说是不是用的struts。我告诉他说不是的。其实淘宝网的Web展现层的框架用的不是struts,不是webwork,不是spring mvc等等。淘宝网的Web展现层的框架用的是集团内部自主开发的一套Web框架。这个框架能够解决一些其他Web框架不能解决的、在淘宝的应用中又会出现并需要解决的问题。在淘宝的多个应用中,也采用了一些开源的框架,比如Spring、iBatis、jBPM、Hessian、Mina等等。这些开源软件的采用为我们构建应用系统提供了很大的帮助。  采用开源软件构建系统,我想有两个很大的好处:  一个是降低成本。假设你有1000台应用服务器,如果你每台服务器上采用的不是JBoss AS或者其他开源的软件,而是使用商业的Oracle BEA的Weblogic或者IBM的WebSphere,那么为这1000台机器的应用购买License的费用是非常高的。  另外一个好处(我觉得最大的好处)是你可以看到软件的源码,你可以研究了解软件内部的工作过程、原理。这对于应用设计、开发、查错、优化都是非常有帮助的。  淘宝网的开源观  对于开源软件的应用,有些人可能担心质量的问题,有些人可能担心软件本身发展更新的问题,等等。对于质量的问题,我想现在很多的开源软件尤其是一些很著名的开源软件都有很完善的组织,有完善的开发、测试、发布流程。在一个新版本完成前,会有多次的测试版本发布,最后才是正式版。这和商业软件是一样的。并且因为代码公开,反而更加的容易发现错误,提高质量。至于第二个问题,我想跟第一个问题一样,关键是组织和规划而不在是否开源,并且在很多著名的开源软件背后,会有厂商在进行支持。软件本身的发展应该是不会成为问题的,不太会出现软件突然停止发展的情况。  在今后的发展中,我们还是会一如既往的关注开源软件的发展,也还会根据需要采用不同的开源软件。在选择一个开源产品的时候,我会考虑以下几点:  1. 这个软件目前的功能和它的RoadMap。  2. 软件本身的架构。  3. 该软件开发的活跃度。  4. 该开源软件是否是遵守该领域内的国际规范的。  5. 在同类产品中,要挑选有比较优势的。并且要考虑可能存在的移植代价。这个移植指的是采用了这款开源软件后现有系统的移植,或者是从这个开源软件到其他软件的移植。  对于企业级系统、互联网应用来说,采用开源软件不仅可以降低成本,更重要的是能够真正了解软件的内部工作机制。还可以在现在的基础上进行增强和定制,也能够从开源软件中借鉴到很多好的设计和实现。希望国内能有更多的企业在使用开源软件的同时,也能开源自身的一些软件,或者能够成为一些开源软件的贡献者。而作为淘宝网,我们也会非常积极的参与到开源的活动中,也会努力为开源的发展做出我们应有的贡献。  作者简介:曾宪杰,现任淘宝网平台架构部架构师。2002年毕业于浙江大学计算机系,先后在中科院下属企业、先锋电子(中国)就职。有丰富的Windows平台、企业级系统设计经验。现主要研究领域包括消息中间件的设计开发、分布式系统、分布式存储。}

我要回帖

更多关于 linux系统移植 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信