??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品成人一区二区三区夜夜夜,99久久婷婷国产精品综合,亚洲欧美一区二区在线观看http://www.aygfsteel.com/shanben/年强则中国?年q步则中国进?zh-cnWed, 18 Jun 2025 15:21:37 GMTWed, 18 Jun 2025 15:21:37 GMT60教你使用MySQL触发器自动更新Memcachehttp://www.aygfsteel.com/shanben/archive/2010/08/12/328679.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Thu, 12 Aug 2010 07:22:00 GMThttp://www.aygfsteel.com/shanben/archive/2010/08/12/328679.htmlhttp://www.aygfsteel.com/shanben/comments/328679.htmlhttp://www.aygfsteel.com/shanben/archive/2010/08/12/328679.html#Feedback0http://www.aygfsteel.com/shanben/comments/commentRss/328679.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/328679.htmlmysql 5.1支持触发器以及自定义函数接口(UDF)的特性,如果配合libmemcache以及Memcached Functions for MySQLQ就能够实现memcache的自动更新。简单记录一下安装测试步骤?/h5>

  mysql 5.1支持触发器以及自定义函数接口(UDF)的特性,如果配合libmemcache以及Memcached Functions for MySQLQ就能够实现memcache的自动更新。简单记录一下安装测试步骤?/p>

  安装步骤

  安装memcached,q个步骤很简单,随处可见。安装mysql server 5.1RCQ安装办法也很大众,不废?了?/p>

  ~译libmemcachedQ解压后安装卛_./configure; make; make install

  ~译Memcached Functions for MySQLQ在http://download.tangent.org/找一个最新的版本下蝲?是,./configure --with-mysql=/usr/local/mysql/bin/mysql_config -- libdir=/usr/local/mysql/lib/mysql/

  make

  make install

  接下来有两个办法让Memcached Functions for MySQL在mysql中生效?/p>

  在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sqlQ这?把memcache function作ؓUDF加入mysql?/p>

  q行memcached_functions_mysql源码目录下的utils/install.plQ这是一个perl脚本Q作用同上一 条?/p>

  试memcache function?/p>

  以下试脚本摘自memcached_functions_mysql的源码目录,有兴可以试试?/p>

PLAIN TEXTCODE: drop table if exists urls;
create table urls (
id int(3) not null,
url varchar(64) not null default '',
primary key (id)
);
select memc_servers_set('localhost:11211');
select memc_set('urls:sequence', 0);
DELIMITER |
DROP TRIGGER IF EXISTS url_mem_insert;
CREATE TRIGGER url_mem_insert
BEFORE INSERT ON urls
FOR EACH ROW BEGIN
SET NEW.id= memc_increment('urls:sequence');
SET @mm= memc_set(concat('urls:',NEW.id), NEW.url);
END |
DELIMITER ;
insert into urls (url) values ('http://google.com');
insert into urls (url) values ('http://www.ooso.net/index.php');
insert into urls (url) values ('http://www.ooso.net/');
insert into urls (url) values ('http://slashdot.org');
insert into urls (url) values ('http://mysql.com');
select * from urls;
select memc_get('urls:1');
select memc_get('urls:2');
select memc_get('urls:3');
select memc_get('urls:4');
select memc_get('urls:5');



存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 2010-08-12 15:22 发表评论
]]>
java版的memcached client及用文?/title><link>http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html</link><dc:creator>存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</dc:creator><author>存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</author><pubDate>Wed, 11 Aug 2010 15:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html</guid><wfw:comment>http://www.aygfsteel.com/shanben/comments/328581.html</wfw:comment><comments>http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shanben/comments/commentRss/328581.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shanben/services/trackbacks/328581.html</trackback:ping><description><![CDATA[假设我们?台memcached 服务?server1 和server2 ?GB 的内存空?server3 ?GB 的内存空?<br /> 下面E序说明怎么来创建客L.<br /> import com.danga.MemCached.*;<br /> <br /> public class MyClass {<br /> <br /> // 创徏一?memcached 客户端对?br /> <br /> protected static MemCachedClient mcc = new MemCachedClient();<br /> <br /> // 创徏  memcachedq接?br /> <br /> static<br /> <br /> {  // 指定memcached服务地址 String[] servers =<br /> { "server1.mydomain.com:1121","server2.mydomain.com:1121",<br /> "server3.mydomain.com:1121" };<br /> // 指定memcached服务器负载量<br /> Integer[]  weights    ={ 3, 3, 2 };<br /> // 从连接池获取一个连接实?br /> <br /> SockIOPool pool = SockIOPool.getInstance();<br /> <br /> // 讄服务器和服务器负载量<br /> <br /> pool.setServers( servers );<br /> <br /> pool.setWeights( weights );<br /> <br /> // 讄一些基本的参数<br /> <br /> //讄初始q接?   最连接数 5   最大连接数 250<br /> <br /> //讄一个连接最大空闲时?时<br /> <br /> pool.setInitConn( 5 );<br /> <br /> pool.setMinConn( 5 );<br /> <br /> pool.setMaxConn( 250 );<br /> <br /> pool.setMaxIdle( 1000 * 60 * 60 * 6 );<br /> <br /> // 讄ȝE睡眠时?br /> <br /> // 每隔30U醒?nbsp; 然后<br /> <br /> // 开始维?q接数大?br /> <br /> pool.setMaintSleep( 30 );<br /> <br /> // 讄tcp 相关的树?br /> <br /> // 关闭nagle法<br /> <br /> // 讄 d 时3U钟  set the read timeout to 3 secs<br /> <br /> //  不设|连接超?br /> <br /> pool.setNagle( false );<br /> <br /> pool.setSocketTO( 3000 );<br /> <br /> pool.setSocketConnectTO( 0 );<br /> <br /> // 开始初始化 q接?br /> <br /> pool.initialize();<br /> <br /> // 讄压羃模式<br /> <br /> //如果过64k压羃数据<br /> <br /> mcc.setCompressEnable( true );<br /> <br /> mcc.setCompressThreshold( 64 * 1024 );<br /> <br /> }<br /> <br /> public static void examples() {<br /> <br /> mcc.set( "foo", "This is a test String" );<br /> <br /> String bar = mcc.get( "foo" );<br /> <br /> }<br /> <br /> }<br /> MemCachedClient c?常用的方法说?br /> <br /> 创徏 client对象 讄参数:<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> //压羃模式<br /> mc.setCompressEnable(true);<br /> // 如果 cache数据 大于4 KB  启用压~?br /> mc.setCompressThreshold(4096);<br /> // 基本cdtostringҎ(gu)<br /> // 通常不需要设|?br /> mc.setPrimitiveAsString(true);<br /> 存储一个对?<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "cacheKey1";<br /> <br /> Object value = SomeClass.getObject();<br /> <br /> mc.set(key, value);<br /> 用客Lhashcode 存储一个对?<br /> <br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "cacheKey1";<br /> <br /> Object value = SomeClass.getObject();<br /> <br /> Integer hash = new Integer(45);<br /> <br /> mc.set(key, value, hash);<br /> <br /> setҎ(gu)Q在cache中存储一个指定对?br /> <br />    add 和replace Ҏ(gu)功能差不?br /> <br />   add -- 如果不存?q个key的对象,会存储一个对象到cache?br />   replace --只有当存在指定key对象的时?会覆盖已有对?br /> 删除一个对?<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "cacheKey1";<br /> <br /> mc.delete(key);<br /> l合hashcode 删除一个对?<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "cacheKey1";<br /> <br /> Integer hash = new Integer(45);<br /> <br /> mc.delete(key, hashCode);<br /> 怎么cache计数Q增 减计?<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "counterKey";<br /> <br /> mc.storeCounter(key, new Integer(100));<br /> <br /> System.out.println("counter after adding      1: " mc.incr(key));<br /> <br /> System.out.println("counter after adding      5: " mc.incr(key, 5));<br /> <br /> System.out.println("counter after subtracting 4: " mc.decr(key, 4));<br /> <br /> System.out.println("counter after subtracting 1: " mc.decr(key));<br /> 利用客户端的hashcode存储计数 增减 计数:<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "counterKey";<br /> <br /> Integer hash = new Integer(45);<br /> <br /> mc.storeCounter(key, new Integer(100), hash);<br /> <br /> System.out.println("counter after adding      1: " mc.incr(key, 1, hash));<br /> <br /> System.out.println("counter after adding      5: " mc.incr(key, 5, hash));<br /> <br /> System.out.println("counter after subtracting 4: " mc.decr(key, 4, hash));<br /> <br /> System.out.println("counter after subtracting 1: " mc.decr(key, 1, hash));<br /> 获取一个对?<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "key";<br /> <br /> Object value = mc.get(key);<br /> 用客Lhashcode获取一个对?<br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "key";<br /> <br /> Integer hash = new Integer(45);<br /> <br /> Object value = mc.get(key, hash);<br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String key   = "key";<br /> <br /> Integer hash = new Integer(45);<br /> <br /> Object value = mc.get(key, hash);<br /> 从cache 中获取多个对?br /> <br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> String[] keys      ={ "key", "key1", "key2" };Mapvalues = mc.getMulti(keys);<br /> 用客Lhashcode 从cache中获取多个对?br /> MemCachedClient mc = new MemCachedClient();<br /> String[] keys      = { "key", "key1", "key2" };<br /> <br /> Integer[] hashes   =<br /> { new Integer(45), new Integer(32), new Integer(44) };<br /> Mapvalues = mc.getMulti(keys, hashes);<br /> 清空所有的对象<br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> mc.flushAll();<br /> 得到服务器memcached的状态信?br /> MemCachedClient mc = new MemCachedClient();<br /> <br /> Map stats = mc.stats();<br /> 注意?br /> 1QFailover/Failback<br /> 当一个memcached服务器失效的时候客L默认会failover另一个服务去.<br /> <br /> 如果失效的服务器 恢复q行Q客L会返回到原来q接的服务器.<br /> 如果你不想用q个功能 讄下面的参?br /> pool.setFailover( false );<br /> pool.setFailback( false ); <br /> <br /> 2Q序列化<br /> <br /> Boolean<br /> Byte<br /> String<br /> Character<br /> StringBuffer<br /> StringBuilder<br /> Short<br /> Long<br /> Double<br /> Float<br /> Date<br /> java默认的类型没有实现序列化 可以讄<br /> mcc.setPrimitiveAsString( true )替代. <br /> Meetup.com实践q程中得出的一个经?Q项目中model 对象implement Externalizable 实现序列化,<br /> 可以节省cache 对象的大。从而节省网l带宽和内存I间? <img src ="http://www.aygfsteel.com/shanben/aggbug/328581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shanben/" target="_blank">存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</a> 2010-08-11 23:21 <a href="http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高负载、高q发|站架构知识汇?大流量网站架构的几点认识http://www.aygfsteel.com/shanben/archive/2010/08/11/328534.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Wed, 11 Aug 2010 06:32:00 GMThttp://www.aygfsteel.com/shanben/archive/2010/08/11/328534.htmlhttp://www.aygfsteel.com/shanben/comments/328534.htmlhttp://www.aygfsteel.com/shanben/archive/2010/08/11/328534.html#Feedback0http://www.aygfsteel.com/shanben/comments/commentRss/328534.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/328534.html一Q硬架构

1 Q机房的选择Q?/span>

? 选择机房的时候,Ҏ(gu)|站用户的地域分布,可以选择|通或?sh)信机房Q但更多时候,可能双线机房才是合适的。越大的城市Q机房h(hun)D贵,从成本的角度看可? 在一些中城市托服务器Q比如说q州的公司可以考虑把服务器托管在东莞,?jng)山{地Q不是特别远Q但是h(hun)g便宜很多?/font>

2 Q带宽的大小Q?/span>

通常老板花钱h们架构网站的时候,会给我们提出一些目标,诸如|站每天要能承受100 万PV 的访问量{等。这时我们要预算一下大概需要多大的带宽Q计带宽大主要涉及两个指标(峰值流量和面大小Q,我们不妨在计前先做出必要的假设Q?/font>

W一Q假讑ֳ值流量是q_量? 倍?/font>
W二Q假设每ơ访问^均的面大小?00K 字节左右?/font>

如果100 万PV 的访问量在一天内q_分布的话Q折合到每秒大约12 ơ访问,如果按^均每ơ访问页面的大小?00K 字节左右计算的话Q这12 ơ访 问总计大约是1200K 字节Q字节的单位是Byte Q而带宽的单位是bit Q它们之间的关系?Byte = 8bit Q所?200K Byte 大致q当于9600K bit Q也是9Mbps 的样子,实际情况中,我们的网站必能在峰值流量时保持正常讉KQ所以按照假讄峰值流量算Q真实带宽的需求应该在45Mbps  左右?/font>

当然Q这个结论是建立在前面提到的两点假设的基上,如果你的实际情况和这两点假设有出入,那么l果也会有差别?/font>

3 Q服务器的划分:

先看我们都需要哪些服务器Q图片服务器Q页面服务器Q数据库服务器,应用服务器,日志服务器等{?/font>

对于讉K量大点的|站而言Q分d独的囄服务器和面服务器相当必要,我们可以用lighttpd 来跑囄服务器,用apache 来跑面服务 器,当然也可以选择别的Q甚臻I我们可以扩展成很多台囄服务器和很多台页面服务器Qƈ讄相关域名Q如img.domain.com ?nbsp;www.domain.com Q页面里的图片\径都使用l对路径Q如<img src="http://img.domain.com/abc.gif" /> Q然后设|DNS 轮@Q达到最初的负载均衡。当Ӟ服务器多了就不可避免的涉及一个同步的问题Q这个可以用rsync 软g来搞定?/font>

数据库服务器是重中之重,因ؓ|站的瓶颈问题十有八?ji)是出在数据库n上。现在一般的中小|站多用MySQL 数据库,不过它的集群功能gq没有达 到stable 的阶D,所以这里不做评仗一般而言Q用MySQL 数据库的时候,我们应该搞一个主从(一d从)l构Q主数据库服务器使用innodb  表结构,从数据服务器使用myisam 表结构,充分发挥它们各自的优势,而且q样的主从结构分Md操作Q降低了L作的压力Q甚x们还可以讑֮一个专门的从服务器做备份服务器Q方便备份。不然如果你只有一C服务器,在大数据量的情况下,mysqldump 基本没戏了Q直接拷贝数据文件的话,q得先停止数据库服务再拷贝,否则备䆾文g会出错。但对于很多|站而言Q即使数据库服务仅停止了一U也是不可接受的。如果你有了一C数据库服务器Q在备䆾?据的时候,可以先停止服务(slave stop Q再备䆾Q再启动服务Qslave start Q后从服务器会自动从L务器同步数据Q一切都没有影响。但是主从结构也是有致命~点的,那就是主从结构只是降低了L作的压力Q却不能降低写操作的压力。ؓ了适应更大的规模,可能只剩下最后这招了Q横? U向分割数据库。所谓横向分割数据库Q就是把不同的表保存C同的数据库服务器上,比如说用戯保存在A 数据库服务器上,文章表保存在B 数据库服务器上,当然q样的分割是有代LQ最基本的就是你没法q行LEFT JOIN 之类的操作了。所谓纵向分割数据库Q一般是指按照用h识(user_id Q等来划分数据存储的服务器,比如_我们? 台数据库服务器,那么 “user_id % 5 + 1” {于1 的就保存? h务器Q等? 的就保存? 好服务器Q以此类推,U向分隔的原则有很多U,可以视情况选择。不q和横向分割数据库一PU向分割 数据库也是有代h(hun)的,最基本的就是我们在q行如COUNT, SUM {汇L作的时候会ȝ很多。综上所qͼ数据库服务器的解x案一般视情况往往是一个؜合的Ҏ(gu)Q以其发挥各U方案的优势Q有时候还需要借助 memcached 之类的第三方软gQ以侉K应更大讉K量的要求?/font>

如果有专门的应用服务器来跑PHP 脚本是最合适不q的了,那样我们的页面服务器只保存静态页面就可以了,可以l应用服务器讄一些诸?nbsp;app.domain.com 之类的域名来和页面服务器加以区别。对于应用服务器Q我q是更們֐于用prefork 模式的apache Q配上必要的 xcache 之类的PHP ~存软gQ加载模块要少好Q除了mod_rewrite {必要的模块Q不必要的东西统l舍弃,量减少httpd q程的内存消耗,而那些图片服务器Q页面服务器{静态内容就可以使用lighttpd 或者tux 来搞Q充分发挥各U服务器的特炏V?/font>

如果条g允许Q独立的日志服务器也是必要的Q一般小|站的做法都是把面服务器和日志服务器合二ؓ一了,在凌晨访问量不大的时候cron q行前一?的日志计,不过如果你用awstats 之类的日志分析YӞ对于百万U访问量而言Q即使按天归档,也会消耗很多时间和服务器资源去计算Q所以分d独的日志服务器还是有好处的,q样不会影响正式服务器的工作状态?/font>

二:软架?/font>

1 Q框架的选择Q?/span>

现在的PHP 框架有很多选择Q比如:CakePHP QSymfony QZend Framework {等Q至于应该用哪一个ƈ没有唯一的答案,要根据Team 里团队成员对各个框架的了解程度而定。很多时候,即没有使用框架Q一栯写出好的E序来,比如Flickr 据说是用Pear+Smarty q样的类库写出来的,所以是否用框架Q用什么框Ӟ一般不是最重要Q重要的是我们的~程思想里要有框架的意识?/font>

现在?NET 框架有很多选择Q比如:cnForums Q?text Qcs, Castle, {等

2 Q逻辑的分层:

|站规模C一定的E度之后Q代码里各种逻辑U缠在一P会给l护和扩展带来巨大的障碍Q这时我们的解决方式其实很简单,那就是重构,逻辑q行分层。通常Q自上而下可以分ؓ表现层,应用层,领域层,持久层?/font>

所 谓表现层Qƈ不仅仅就指模板,它的范围要更q一些,所有和表现相关的逻辑都应该被U_表现层的范畴。比如说某处的字体要昄为红Ԍ某处的开头要IZ| q些都属于表现层。很多时候,我们Ҏ(gu)犯的错误是把本属于表现层的逻辑攑ֈ了其他层面去完成Q这里说一个很常见的例子:我们在列表页昄文章标题的时 候,都会讑֮一个最大字敎ͼ一旦标题长度超q了q个限制Q就截断Qƈ在后面显C?#8220;..” Q这是最典型的表现层逻辑Q但是实际情况,有很多程序员都是在非表现层代码里完成数据的获取和截断Q然后赋值给表现层模板,q样的代码最直接的缺点就是同样一D|据,在这个页面我可能xC前10 个字Q再另一?面我可能想昄?5 个字Q而一旦我们在E序里固化了q个字数Q也׃׃可移植性。正的做法是应该做一个视囑֊手之cȝE序来专门处理此c逻辑Q比如说QSmarty 里的truncate 属于这L视图助手Q不q它那个实现不适合中文Q?/font>

所谓应用层Q它的主要作用是定义用户可以做什么,q把操作l果反馈l表现层。至于如何做Q通常不是它的职责范围Q而是领域层的职责范围Q,它会通过委派把如何做的工作交l领域层d理。在使用MVC 架构的网站中Q我们可以看到类g面这LURL Qdomain.com/articles/view/123 Q其内部~码实现Q一般就是一个Articles 控制器类Q里面有一个view Ҏ(gu)Q这是一 个典型的应用层操作,因ؓ它定义了用户可以做一个查看的动作。在MVC 架构中,有一个准则是q么说的QRich Model Is Good 。言外之意,是Controller 要保?#8220; ?#8221; 一些比较好Q进而说明应用层要尽量简单,不要包括涉及领域内容的逻辑?/font>

所谓领域层Q最直接的解释就是包含领域逻辑的层。它是一个Y件的灵魂所在。先来看看什么叫领域逻辑Q简单的_h明确的领域概늚逻辑是领域逻辑Q比如我们在ATM Z取钱Q过E大致是q样的:插入银联卡,输入密码Q输入取N额,定Q拿钱,然后ATM 吐出一个交易凭条。在q个q程中,银联?在ATM 机器里完成钱从帐户上划拨的过E就是一个领域逻辑Q因为取钱在银行中是一个明的领域概念Q而ATM 机吐Z个交易凭条则不是领域逻辑Q而仅是一 个应用逻辑Q因为吐Z易凭条ƈ不是银行中一个明的领域概念Q只是一U技术手D,对应的,我们取钱后不吐交易凭条,而发送一条提醒短信也是可能的Q但q? 不是一定如此,如果在实际情况中Q我们要求取Ƒ֐必须吐出交易凭条Q也是说吐Z易凭条已l和取款紧密l合Q那么你也可以把吐出交易凭条看作是领域逻辑 的一部分Q一切都以问题的具体情况而定。在Eric 那本l典的领域驱动设计中Q把领域层分Z五种基本元素Q实体,值对象,服务Q工厂,仓储。具体可以参 阅书中的介绍。领域层最常犯的错误就是把本应属于领域层的逻辑泄露C其他层次Q比如说在一个CMS pȝQ对热门文章的定义是q样的:每天被浏览的ơ数??000 ơ,被评论的ơ数多于100 ơ,q样的文章就是热门文章。对于一个CMS 来说Q热门文章这个词无疑是一个重要的领域概念Q那么我们如何实现这个逻辑的设计的Q你可能会给出类g面的代码Q?#8220;SELECT ... FROM ... WHERE  览 > 1000 AND  评论 > 100” Q没错,q是最单的实现方式Q但是这里需要注意的?#8220; 每天被浏览的ơ数多于1000 ơ,被评论的ơ数多于100 ?#8221; q个重要的领域逻辑被隐藏到了SQL 语句中,SQL 语句昄不属于领域层的范_也就是说Q我们的领域逻辑泄露了?/font>

所谓持久层Q就是指把我们的领域模型保存到数据库中。因为我们的E序代码是面向对象风格的Q而数据库一般是关系型的数据库,所以我们需要把领域模型 ^Q才能保存到数据库中Q但是在 PHP 里,直到目前q没有非常好?/span> ORM 出现Q所以这斚w的解x案不是特别多Q参?/span> Martin 的企业应用架构模式一   书,大致可以使用的方法有行数据入口( Row Data Gateway Q或者表数据入口Q?/span> Table Data GatewayQ,或者把领域层和持久层合二ؓ一变成zd记录QActive RecordQ的方式?/span>



]]>
TOMCAT崩溃事ghttp://www.aygfsteel.com/shanben/archive/2010/08/11/328532.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Wed, 11 Aug 2010 06:25:00 GMThttp://www.aygfsteel.com/shanben/archive/2010/08/11/328532.htmlhttp://www.aygfsteel.com/shanben/comments/328532.htmlhttp://www.aygfsteel.com/shanben/archive/2010/08/11/328532.html#Feedback0http://www.aygfsteel.com/shanben/comments/commentRss/328532.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/328532.htmlTOMCAT崩溃事g

http://www.aygfsteel.com/tedeyang/archive/2008/06/04/205740.html

今天一大早产品一部项目经理就来找我,他们的一台服务器昨天晚上tomcat服务崩溃Q还不能重启服务Q最后将服务器重启才OK?br /> 我将事gq程和分析过E记录如下:

服务器:win 2000 sp4Qapache 2 + tomcat 5.0 采用mod_jkU联。内?GQ硬盘剩余空间充ICPU基本I闲?br /> 主要应用QJ2EE 1.4QJDBCQ连接另一台mysql服务器)
崩溃旉Q?2008-6-3 18Q?7Q?0

一.各种日志l合如下Q?/font>

   1.37?5U,操作pȝ事g中诺杀毒Y件报内存q低警报
   2.37?5U,web应用抛出JDBCq接异常Q?

2008-06-03 18:37:45 cn.*.db.DBManager.getConnection(DBManager.java:157) ERROR swim.db.DBManager   com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: java.net.SocketException: No buffer 
space available (maximum connections reached?): JVM_Bind


   3.37?0U,tomcat抛出session无法save异常Q?

2008-06-03 18:37:50 ERROR- IOException while saving persisted sessions: java.io.FileNotFoundException: "izzs"SESSIONS.ser (pȝ资源不Q无法完成请求的服务?
java.io.FileNotFoundException: "izzs"SESSIONS.ser (pȝ资源不Q无法完成请求的服务?
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.
<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.
<init>(FileOutputStream.java:70)
    at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:
511)
    at org.apache.catalina.session.StandardManager.unload(StandardManager.java:
485)
    at org.apache.catalina.session.StandardManager.stop(StandardManager.java:
687)
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:
4496)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:
3037)
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:
4658)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1619)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1628)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1628)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:
1608)
    at java.lang.Thread.run(Thread.java:
534)


 

?单分?/h3>

崩溃原因Q内存不_致资源不I引vTomcat的session崩溃?br />   q台服务器上q行着很多应用Q是什么原因引起内存不无法定?br /> 初步判断|魁R可能是apacheQ该q程q_占用500MB内存Q经怼飚到1G以上?br />
Apache2的配|文件中Q?strong>KeepAlive=OnQMaxKeepAliveRequests=100QKeepAliveTimeout=15Q分析aceess.log文g可以发现每个面触发的request数量?0个以下,点击率较低,可能使连接过多?br /> 我徏议将keepAlive设ؓoffQ增加CPU负蝲Q降低内存消耗?br />

?效果

 有待观察......

参考资料:
http://www.withend.com/post/78.html

?l局 
旉一天,晚上?ji)点再次崩溃Q黑暗事仉演?br /> q一ơ,我才得知原来该apacheq配|有其他域名Q于是调域名下的access.log。项目经理去了机房,在蘪轰地风扇C打电(sh)话给我,让我分析分析?br /> 仔细看访问日志,发现原来有N多Connect 443q接Q?43是什么?是SSL端口QHTTPSQ,Connect命o则显然是代理功能Q?br /> 而且q些connect的IP来自全球各地Q加拿大、美国、澳zӀ新西兰、北京、上英国、哪都有?br /> 看来q台服务器是被h当代理服务器用了?br /> 怪不得半夜会LQh家西半球那时正大白天撒欢儿呢?br />
问题出在apache的配|上Q由于应用众多,q且q台服务器还是其他几台web服务器的对外出口Q因此apache中配|了反向代理Q不q不心把正向代理(mod_proxy模块?a id="ProxyRequests" name="ProxyRequests">ProxyRequests指oQ也打开了?br /> 看看apache2.0的官Ҏ(gu)档中mod_proxy部分Q里面明明白白写着Q?br />

警告
在?zhn)没有?gu)务器采取安全措施之前Q请不要用ProxyRequests启用(zhn)的代理。一个开攄代理服务器不仅对(zhn)的|络有威胁,Ҏ(gu)个因特网来说也同样如此?br />
真的是很有威胁!大量代理h急剧消耗内存,最l造成LQ?br />
解决办法是把正向代理关掉:ProxyRequests Off


]]>
分布式缓存系lMemcached介与实践http://www.aygfsteel.com/shanben/archive/2010/08/11/328531.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Wed, 11 Aug 2010 06:22:00 GMThttp://www.aygfsteel.com/shanben/archive/2010/08/11/328531.htmlhttp://www.aygfsteel.com/shanben/comments/328531.htmlhttp://www.aygfsteel.com/shanben/archive/2010/08/11/328531.html#Feedback0http://www.aygfsteel.com/shanben/comments/commentRss/328531.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/328531.html分布式缓存系lMemcached介与实践

http://blog.csdn.net/hitman9099/archive/2008/09/04/2878417.aspx

 

~v: 在数据驱动的web开发中Q经常要重复从数据库中取出相同的数据Q这U重复极大的增加了数据库负蝲。缓存是解决q个问题的好办法。但是ASP.NET中的虽然已经可以实现寚w面局部进行缓存,但还是不够灵zR此时Memcached或许是你惌的?br />
Memcached是什?
Memcached是由Danga Interactive开发的Q高性能的,分布式的内存对象~存pȝQ用于在动态应用中减少数据库负载,提升讉K速度?br />
Memcached能缓存什么?
通过在内存里l护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括囑փ、视频、文件以及数据库索的l果{?br />
Memcached快么Q?br />
? 常快。Memcached使用了libeventQ如果可以的话,在linux下用epollQ来均衡M数量的打开链接Q用非d的网lI/OQ对 内部对象实现引用计数(因此Q针对多L客户端,对象可以处在多样的状?Q?使用自己的页块分配器和哈希表Q? 因此虚拟内存不会产生片q且虚拟内存分配的时间复杂度可以保证为O(1).?br />
Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这 些,是由一个由web服务器和数据库服务器l成的集完成的。Memcached几乎完全攑ּ了Q何数据都从数据库d的方式,同时Q它q羃短了用户查看 面的速度、更好的资源分配方式Q以及Memcache失效时对数据库的讉K速度?br />
Memcached的特?/strong>
Memcached的缓存是一U分布式的,可以让不同主Z的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出C用数据库做类g情的时候,盘开销和阻塞的发生?br />
Memcached的?span class="Apple-converted-space"> 
 
Memcached服务器端的安?Q此处将其作为系l服务安装)
下蝲文gQ?a title="memcached 1.2.1 for win32 binaries (dec 23, 2006)" style="color: #006bad; text-decoration: none;" target="_blank">memcached 1.2.1 for Win32 binaries (Dec 23, 2006)
    1 解压~文件到c:\memcached
   2 命o行输?'c:\memcached\memcached.exe -d install' 
    3 命o行输?'c:\memcached\memcached.exe -d start' Q该命o启动 Memcached Q默认监听端口ؓ 11211
通过 memcached.exe -h 可以查看其帮?/p>

 

一个简单的试例子

  1. package com.mapbar.util.cache;

  2. import java.util.Date;
  3. import java.util.ResourceBundle;

  4. import com.danga.MemCached.MemCachedClient;
  5. import com.danga.MemCached.SockIOPool;
  6. /**
  7.  * 使用配置文g方式的memcachelg
  8.  *
  9.  */
  10. public class Cache {

  11.  protected static ResourceBundle rb=ResourceBundle.getBundle("memcached");;
  12.  public static MemCachedClient mcc = new MemCachedClient(); 
  13.  static {
  14.   init();
  15.  }     
  16.  public static void init(){
  17.   synchronized (mcc) {  
  18.    System.out.println("init call");
  19.    String[] servers =rb.getString("cache.servers").split(",");       
  20.          
  21.          String[] strWeights =rb.getString("cache.weights").split(",");  
  22.          Integer[] weights = new Integer[strWeights.length];
  23.          for(int i=0;i<strWeights.length;i++){
  24.           weights[i]=Integer.parseInt(strWeights[i]);
  25.          }
  26.         
  27.          //创徏一个实例对象SockIOPool     
  28.          SockIOPool pool = SockIOPool.getInstance();       
  29.         
  30.          // set the servers and the weights    
  31.          //讄Memcached Server    
  32.          pool.setServers( servers );       
  33.          pool.setWeights( weights );       
  34.          pool.setInitConn(Integer.parseInt(rb.getString("cache.initConn")));       
  35.          pool.setMinConn(Integer.parseInt(rb.getString("cache.minConn")));       
  36.          pool.setMaxConn(Integer.parseInt(rb.getString("cache.maxConn")));       
  37.          pool.setMaxIdle(Long.parseLong(rb.getString("cache.maxIdle")));       
  38.         
  39.          // set the sleep for the maint thread       
  40.          // it will wake up every x seconds and       
  41.          // maintain the pool size       
  42.          pool.setMaintSleep( 30 );       
  43.         
  44. //         Tcp的规则就是在发送一个包之前Q本地机器会{待q程L    
  45. //         对上一ơ发送的包的认信息到来Q这个方法就可以关闭套接字的~存Q?nbsp;   
  46. //         以至q个包准备好了就发;    
  47.          pool.setNagle( false );       
  48.          //q接建立后对时的控?nbsp;   
  49.          pool.setSocketTO( 3000 );    
  50.          //q接建立时对时的控?nbsp;   
  51.          pool.setSocketConnectTO( 0 );       
  52.         
  53.          // initialize the connection pool       
  54.          //初始化一些值ƈ与MemcachedServerD徏立连?nbsp;   
  55.          pool.initialize();    

  56.          // lets set some compression on for the client       
  57.          // compress anything larger than 64k       
  58.          mcc.setCompressEnable( true );       
  59.          mcc.setCompressThreshold( 64 * 1024 );  
  60.   }
  61.  }
  62.  protected static void bulidCache(){  
  63.   
  64.         //set(key,value,Date) ,Date是一个过期时_如果惌q个q期旉生效的话Q这里传递的new Date(long date) 中参数dateQ需要是个大于或{于1000的倹{?nbsp;   
  65.         //因ؓjava client的实现源码里是这样实现的 expiry.getTime() / 1000 Q也是_如果 于1000的|除以1000以后都是0Q即怸q期    
  66.         mcc.set( "test""This is a test String" ,new Date(100000));   //十秒后过?nbsp;   
  67.               
  68.     }       
  69.       
  70.  protected static void output() {       
  71.         //从cache里取?nbsp;   
  72.         String value = (String) mcc.get( "test" );       
  73.         System.out.println(value);        
  74.     }       
  75.            
  76.  public static void main(String[] args){       
  77.         bulidCache();      
  78.         output();           
  79.     }        

  80. }


其中在classespath下有个memcached.properties文g

内容如下Q?/p>

##muti servers spilt by ,

#q里是你的memcached启动的地址
cache.servers=192.168.0.116:11211  
cache.weights=1
#memcached be used
cache.cluster=true

#set some basic pool settings       
#5 initial, 5 min, and 250 max conns       
#and set the max idle time for a conn       
#to 6 hours  6*60*60*1000
cache.initConn=5
cache.minConn=5
cache.maxConn=250
cache.maxIdle=21600000

 

 

 

 

在Windows下安装Memcached

http://www.oschina.net/docs/article/4

很多phper不知道如何在Windows下搭建Memcache的开发调试环境,最q个Z在研IMemcacheQ记录下自己安装搭徏的过E?br style="padding: 0px; margin: 0px;" /> 其实我开始研IMemcache的时候ƈ不知道居然还有memcached for Win32q个鸟东西,宛_我在CnetOS下折?天才搞定Q今天突然发现Windows下的Memcacheq行开发调试完全没有问题,所以写?Memcache的文档分享给大家?/p>

Windows下的Memcache安装Q?br style="padding: 0px; margin: 0px;" /> 1. 下蝲memcache?windowsE_版,解压放某个盘下面Q比如在c:\memcached
2. 在终端(也即cmd命o界面Q下输入 ‘c:\memcached\memcached.exe -d install’ 安装
3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached作为windows的一个服务每ơ开机时自动启动。这h务器端已l安装完毕了?br style="padding: 0px; margin: 0px;" /> 4.下蝲php_memcache.dllQ?误己查扑֯应的php版本的文?br style="padding: 0px; margin: 0px;" /> 5. 在C:\winnt\php.ini 加入一?‘extension=php_memcache.dll’
6.重新启动ApacheQ然后查看一下phpinfoQ如果有memcacheQ那么就说明安装成功Q?/p>

memcached的基本设|?/strong>Q?/p>

-p 监听的端?br style="padding: 0px; margin: 0px;" /> -l q接的IP地址, 默认是本?br style="padding: 0px; margin: 0px;" /> -d start 启动memcached服务
-d restart 重vmemcached服务
-d stop|shutdown 关闭正在q行的memcached服务
-d install 安装memcached服务
-d uninstall 卸蝲memcached服务
-u 以的w䆾q行 (仅在以rootq行的时候有?
-m 最大内存用,单位MB。默?4MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数Q默认是1024
-f 块大增长因子,默认?.25
-n 最分配空_key+value+flags默认?8
-h 昄帮助

Memcache环境试Q?br style="padding: 0px; margin: 0px;" /> q行下面的php文gQ如果有输出This is a test!Q就表示环境搭徏成功。开始领略Memcache的魅力把Q?br style="padding: 0px; margin: 0px;" /> < ?php
$mem = new Memcache;
$mem->connect(”127.0.0.1″, 11211);
$mem->set(’key’, ‘This is a test!’, 0, 60);
$val = $mem->get(’key’);
echo $val;
?>



]]>
Memcached学习W记——windows上初步?/title><link>http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html</link><dc:creator>存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</dc:creator><author>存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</author><pubDate>Wed, 11 Aug 2010 05:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html</guid><wfw:comment>http://www.aygfsteel.com/shanben/comments/328527.html</wfw:comment><comments>http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shanben/comments/commentRss/328527.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shanben/services/trackbacks/328527.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="entryFrom clearfix"> <div id="wmqeeuq" class="infoBox">日志原文Q?a target="_blank">http://j2ee.blog.sohu.com/70343632.html </a><span style="color: #000000;">   <br /> memcache for win 软g主页Qhttp://jehiah.cz/projects/memcached-win32/   </span>http://labs.northscale.com/memcached-packages/<br /> <span style="color: #000000;"> meecache for liunx 软g主页Qhttp://memcached.org/   <br />                                       <br /> </span> 最q一直在做一个项目的前期设计工作Q考虑到后期系l的扩展和性能问题也找了很多解x法,有一个就是用C数据库的~存工具memcachedQ当然该工具q不仅仅局限于数据库的~存Q。先单的介绍下什么是memcached? <p>    <font color="#993300">Memcached是高性能的,分布式的内存对象~存pȝQ用于在动态应用中减少数据库负 载,提升讉K速度。Memcached由Danga Interactive开发,用于提升LiveJournal.com讉K速度的。LJ每秒动态页面访问量几千ơ,用户700万。Memcached数 据库负蝲大幅度降低,更好的分配资源,更快速访问?/font></p> <p>    上网baidu了很多东西,几乎都差不多Q而且Zjava的说的很,所有只有在研究了各个其他语acȝ应用后再来尝试在java上进行简单的操作? 用。先从memcached上进行说明,memcached的最新版是采用c语言q行开发和设计的,据说旧版的是采用perl语言开发的Q而且它是一个应 用Y件来的,是作为缓存服务器的服务器端运行在服务器上的,需要用特定的语言~写客户端与其进行通信来进行数据的~存和获取。通常我们是把 memcached安装q行在web服务器上Q然后通过寚w要的数据q行~存Q据我目前所知,所有数据的~存讄和存取操作,以及数据的更新后替换操作? 部需要程序来q行Q而不是自动进行的Q自动不知道能不能成功,呵呵Q。下面从一个实际的例子来应用memcached?/p> <p>    首先?a >http://danga.com/memcached/</a>? 载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip? java_memcached-release_1.6.zipQ分别解压后卛_Q首先是安装q行memcached服务器,我们memcached- 1.2.1-win32.zip解压后,q入其目录,然后q行如下命oQ?/p> <p><font color="#999900">c:>memcached.exe -d install<br /> c:>memcached.exe -l 127.0.0.1 -m 32 -d start</font></p> <p>    W一行是安装memcached成ؓ服务Q这h能正常运行,否则q行p|Q第一行是启动memcached的,作ؓ试我们q单的只分?2M内存 了,然后监听本机端口和以守护q行q行。执行完毕后Q我们就可以在Q务管理器中见到memcached.exeq个q程了。好了,我们的服务器已经正常q? 行了Q?下面我们来写java的客Lq接E序?/p> <p>    我们java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_1.6.jar文g复制到java目的lib目录下,然后我们来编写代码,比如我提供的一个应用类如下Q?/p> <p><span style="color: #0000ff;">package</span><span style="color: #000000;"> utils.cache;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Date;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> com.danga.MemCached.MemCachedClient;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> com.danga.MemCached.SockIOPool;<br /> <br /> <br /> </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br /> * 使用memcached的缓存实用类.<br /> * <br /> * </span><span style="color: #808080;">@author</span><span style="color: #008000;"> 铁木子<br /> *<br /> </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MemCached<br /> {<br />     </span><span style="color: #008000;">//</span><span style="color: #008000;"> 创徏全局的唯一实例</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> MemCachedClient mcc </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MemCachedClient();<br />     <br />     </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> MemCached memCached </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MemCached();<br />     <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;"> 讄与缓存服务器的连接池</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> {<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 服务器列表和其权?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        String[] servers </span><span style="color: #000000;">=</span><span style="color: #000000;"> {</span><span style="color: #000000;">"</span><span style="color: #000000;">127.0.0.1:11211</span><span style="color: #000000;">"</span><span style="color: #000000;">};<br />         Integer[] weights </span><span style="color: #000000;">=</span><span style="color: #000000;"> {</span><span style="color: #000000;">3</span><span style="color: #000000;">};<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取sockeq接池的实例对象</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        SockIOPool pool </span><span style="color: #000000;">=</span><span style="color: #000000;"> SockIOPool.getInstance();<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 讄服务器信?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        pool.setServers( servers );<br />         pool.setWeights( weights );<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 讄初始q接数、最和最大连接数以及最大处理时?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        pool.setInitConn( </span><span style="color: #000000;">5</span><span style="color: #000000;"> );<br />         pool.setMinConn( </span><span style="color: #000000;">5</span><span style="color: #000000;"> );<br />         pool.setMaxConn( </span><span style="color: #000000;">250</span><span style="color: #000000;"> );<br />         pool.setMaxIdle( </span><span style="color: #000000;">1000</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">60</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">60</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">6</span><span style="color: #000000;"> );<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 讄ȝE的睡眠旉</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        pool.setMaintSleep( </span><span style="color: #000000;">30</span><span style="color: #000000;"> );<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 讄TCP的参敎ͼq接时{?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        pool.setNagle( </span><span style="color: #0000ff;">false</span><span style="color: #000000;"> );<br />         pool.setSocketTO( </span><span style="color: #000000;">3000</span><span style="color: #000000;"> );<br />         pool.setSocketConnectTO( </span><span style="color: #000000;">0</span><span style="color: #000000;"> );<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 初始化连接池</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        pool.initialize();<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 压羃讄Q超q指定大(单位为KQ的数据都会被压~?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        mcc.setCompressEnable( </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> );<br />         mcc.setCompressThreshold( </span><span style="color: #000000;">64</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;"> );<br />     }<br />     <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * 保护型构造方法,不允许实例化Q?br />      *<br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MemCached()<br />     {<br />         <br />     }<br />     <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * 获取唯一实例.<br />      * </span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> MemCached getInstance()<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> memCached;<br />     }<br />     <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * d一个指定的值到~存?<br />      * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> key<br />      * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> value<br />      * </span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> add(String key, Object value)<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.add(key, value);<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> add(String key, Object value, Date expiry)<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.add(key, value, expiry);<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> replace(String key, Object value)<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.replace(key, value);<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> replace(String key, Object value, Date expiry)<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.replace(key, value, expiry);<br />     }<br />     <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * Ҏ(gu)指定的关键字获取对象.<br />      * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> key<br />      * </span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Object get(String key)<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.get(key);<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args)<br />     {<br />         MemCached cache </span><span style="color: #000000;">=</span><span style="color: #000000;"> MemCached.getInstance();<br />         <font color="#ff0000">cache.add(</font></span><font color="#ff0000"><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">234</span></font><span style="color: #000000;"><font color="#ff0000">);<br /> </font>        System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">get value : </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> cache.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />     }<br /> }<br /> </span></p> <p>    那么我们可以通过单的像mainҎ(gu)中操作的一样存入一个变量,然后再取行查看,我们可以看到先调用了addQ然后再q行getQ我们运行一? 后,234q个值已l被我们存入了memcached的缓存中的了Q我们将mainҎ(gu)中红色的那一行注释掉后,我们再运行还是可以看到get到的 value也是234Q即~存中我们已l存在了数据了?/p> <p>    对基本的数据我们可以操作Q对于普通的POJO而言Q如果要q行存储的话Q那么比如让其实现java.io.Serializable接口Q因? memcached是一个分布式的缓存服务器Q多台服务器间进行数据共享需要将对象序列化的Q所以必d现该接口Q否则会报错的。比如我们写一个简单的? 试Bean如下Q?/p> <p><span style="color: #0000ff;">class</span><span style="color: #000000;"> TBean </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> java.io.Serializable<br /> {<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">final</span><span style="color: #000000;"> </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> serialVersionUID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1945562032261336919L</span><span style="color: #000000;">;<br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName()<br />     {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name)<br />     {<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name </span><span style="color: #000000;">=</span><span style="color: #000000;"> name;<br />     }<br /> }<br /> </span></p> <p>    然后我们在mainҎ(gu)中加入如下几行代码:</p> <p>TBean tb <span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> TBean();<br /> tb.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">铁木子</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> cache.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean</span><span style="color: #000000;">"</span><span style="color: #000000;">, tb);<br /> TBean tb1 </span><span style="color: #000000;">=</span><span style="color: #000000;"> (TBean)cache.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">name=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> tb1.getName());<br /> tb1.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">铁木子_修改?/span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> tb1 </span><span style="color: #000000;">=</span><span style="color: #000000;"> (TBean)cache.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">name=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> tb1.getName());</span></p> <p><span style="color: #000000;">    我们首先把TBean的一个实例放入缓存中Q然后再取出来,q进行名U的修改Q然后我们再取这个对象,我们再看其名Uͼ发现修改的对象ƈ不是~存中的? 象,而是通过序列化过来的一个实例对象,q样我们无L心对原生cȝ无意修改D~存数据失效了,呵呵~~看来我也是多此一惛_。所以这表明从缓存中? 取的对象是存入对象的一个副本,对获取对象的修改q不能真正的修改~存中的数据Q而应该用其提供的replace{方法来q行修改?/span></p> <p><span style="color: #000000;">    以上是我在windows下对memcached的一点小学习和实践,在以后的目开发过E中会更深入的学习和应用这一~存工具Q也希望和有兴趣的同行一赯论学习该工具的用~~ <img alt="微笑" src="http://img3.pp.sohu.com/ppp/blog/images/emotion/0.gif" border="0" /> <br /> </span></p> <br /> </div> </div> <img src ="http://www.aygfsteel.com/shanben/aggbug/328527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shanben/" target="_blank">存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</a> 2010-08-11 13:51 <a href="http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Birt试牛刀 http://www.aygfsteel.com/shanben/archive/2009/02/02/252906.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Mon, 02 Feb 2009 01:31:00 GMThttp://www.aygfsteel.com/shanben/archive/2009/02/02/252906.htmlhttp://www.aygfsteel.com/shanben/comments/252906.htmlhttp://www.aygfsteel.com/shanben/archive/2009/02/02/252906.html#Feedback0http://www.aygfsteel.com/shanben/comments/commentRss/252906.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/252906.html转蝲Q?a href="http://www.aygfsteel.com/cnfree/archive/2008/06/12/207343.html">http://www.aygfsteel.com/cnfree/archive/2008/06/12/207343.html

最q的目需要用报表,因ؓ是RCP应用Q所以选择了BirtQ用了一下,感觉q可以,是|上资料了点,不过以前也研I过一些Eclipse相关技术,q些都不重要了,找了SDK版本DebugQ啥研究不出来?

BIRT是一个Eclipse-based开放源代码报表pȝ。它主要是用在基于Java与J2EE的Web应用E序上。BIRT主要׃部分l成Q一个是ZEclipse的报表设计和一个可以加C应用服务的运行期lg。BIRT同时也提供一个图形报表制作引擎?

官方主页Q?a >http://www.eclipse.org/birt
官方BBS支持Q?a >http://www.actuatechina.com/forum2.html

基本上来说Birt功能q是很强大的Q支持时下比较流行的WebServiceQAjax技术,既可用于WebQ也可以用于桌面Q更C稳定,基本上遵循Eclipse的开发步骤,一个一个大版本Q同时支持脚本调用,debug开发等{。唯一不的就是中国的国情支持得还不够完善Q毕竟中国比较特D,我以前给公司做党务报表,要按照纸质报表画Q一分一毫都不能变差Q那个变态呀Q在?sh)脑上画报表q是拿尺子量?br />
刚刚开始用Q慢慢研IӞ看了下Birt自带的ExampleQ的是很强大,做得也很漂亮Q自p着创徏一个报表也很简单,希望能够比较快的上手吧?br />
在网上找了一些资源:
http://blogger.org.cn/blog/more.asp?name=sixsun&id=13933 BIRT 中文指南
http://www.springside.org.cn/docs/reference/Birt.htm BIRT报表
http://www-128.ibm.com/developerworks/cn/opensource/os-ecl-birt/ Birt的IBM DW的中文教E?br /> http://download.eclipse.org/birt/downloads/demos/FirstReport/MyFirstReport.html Birt Flash Demo.

]]>
关于新员工导师制Q-听微软培训心?/title><link>http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html</link><dc:creator>存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</dc:creator><author>存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</author><pubDate>Thu, 15 Jan 2009 15:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html</guid><wfw:comment>http://www.aygfsteel.com/shanben/comments/251511.html</wfw:comment><comments>http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shanben/comments/commentRss/251511.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shanben/services/trackbacks/251511.html</trackback:ping><description><![CDATA[<font face="宋体">  <p>我们公司为每一个新q来的员工指z了一个导师。这让我惌v了原来听q的<a onclick="javascript:tagshow(event, " href="javascript:;" target="_self" %CE%A2%C8%ED?);?><u><strong>微Y</strong></u></a>培训Q现单的归纳了几条,放上来供大家讨论?/p> <p>Q、首先微软的导师选择不是领导行政上指定的Q而是学生选择导师?br />     在这里微软强调的是:牛h才能成ؓ导师。公司的人力资源pȝ有一模块会把导师的特长列出来Q以及原来被选择为导师的ơ数Q还有历界学生对其的评h(hun)?/p> <p>    如果是新员工的话Q基的流E常识之cȝ有培训,具体到某一斚w?a onclick="javascript:tagshow(event, " href="javascript:;" target="_self" %BC%BC%CA%F5?);?><u><strong>技?/strong></u></a>的话Q可以由你的上指导你选择?br /> <br /> Q、不是新人才能选择导师Q当你换岗,换项目,反正Ҏ(gu)个领域是新的时候,都可以选择导师<br /> <br /> Q、导师不会天天指gQ帮助你制定培训计划。因为导师的旉比你的时间宝늚?br /> <br /> Ҏ(gu)是:</p> <p>   Q)<strong><font color="#0000ff">学习</font></strong>、提高等{的计划׃自己来完成?/p> <p>   Q)导师可以在邮件上花几分钟l你指导一下?/p> <p>   Q)导师可以在某个有I地旉找你谈谈Q或你约导师Q,但多是你请导师吃饭的时候。这样饭也吃了,导师也当了?br /> <br /> Q、(注意是大点)导师指导你,对他是有好处?.....<br /> <br />    Q)提高影响力(微Y最注意的一点) </p> <p>   Q)有了影响为,才有l效吧?/p> <p>   Q)有了影响力,以后的新人才会选择你吧Q以后的Ch选择你的多Q多C的档期安排不q来Q这才更牛吧Q?br /> <br />  <br /> <br /> Q、这对企业文化也有好处?br /> <br />   Q)文化影响׃nQ比强制Q指z更有效些。 </p> <p>  Q)Ҏ(gu)人、旧人都好,不会出现你有难,十方都会Q但都不支援你的情况<br /> <br />   Q)不会出现研究成果Q只保存在某个h的头脑里的情c节省资?br /> <br />     特别说明Q这U考核对导师不考核。因为是他导的作用,不是师的作用。师的考核是看他被选择的次敎ͼ学生对他的评仗这更客观,真实?/p> </font> <img src ="http://www.aygfsteel.com/shanben/aggbug/251511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shanben/" target="_blank">存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?</a> 2009-01-15 23:23 <a href="http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中存储数据的方式http://www.aygfsteel.com/shanben/archive/2008/11/16/240762.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Sat, 15 Nov 2008 16:57:00 GMThttp://www.aygfsteel.com/shanben/archive/2008/11/16/240762.htmlhttp://www.aygfsteel.com/shanben/comments/240762.htmlhttp://www.aygfsteel.com/shanben/archive/2008/11/16/240762.html#Feedback0http://www.aygfsteel.com/shanben/comments/commentRss/240762.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/240762.htmlJAVA中,有六个不同的地方可以存储数据Q?
1. 寄存器(registerQ。这是最快的存储区,因ؓ它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器q译器Ҏ(gu)需求进行分配。你不能直接控制Q也不能在程序中感觉到寄存器存在的Q何迹象?
2. 堆栈QstackQ。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下UdQ则分配新的内存Q若向上UdQ则释放那些内存。这是一U快速有效的分配存储Ҏ(gu)Q仅ơ于寄存器。创建程序时候,JAVA~译器必ȝ道存储在堆栈内所有数据的切大小和生命周期,因ؓ它必ȝ成相应的代码Q以便上下移动堆栈指针。这一U束限制了程序的灉|性,所以虽然某?span class="hilite1">JAVA数据存储在堆栈中——特别是对象引用Q但?span class="hilite1">JAVA对象不存储其中?
3. 堆(heapQ。一U通用性的内存池(也存在于RAM中)Q用于存放所以的JAVA? 象。堆不同于堆栈的好处是:~译器不需要知道要从堆里分配多存储区域,也不必知道存储的数据在堆里存?gu)zd长时间。因此,在堆里分配存储有很大的灵zL? 当你需要创Z个对象的时候,只需要new写一行简单的代码Q当执行q行代码Ӟ会自动在堆里q行存储分配。当ӞU灵zL必要付出相应的代码。用 堆进行存储分配比用堆栈进行存储存储需要更多的旉?
4. 静态存储(static storageQ。这里的“静?#8221;是指“在固定的位置”。静态存储里存放E序q行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的Q但JAVA对象本n从来不会存放在静态存储空间里?
5. 帔R存储Qconstant storageQ。常量值通常直接存放在程序代码内部,q样做是安全的,因ؓ它们永远不会被改变。有Ӟ在嵌入式pȝ中,帔R本n会和其他部分分割dQ所以在q种情况下,可以选择其攑֜ROM?
6. 非RAM存储。如果数据完全存?gu)zME序之外Q那么它可以不受E序的Q何控Ӟ在程序没有运行时也可以存在?
速度来说Q有如下关系Q?
    寄存?< 堆栈 < ?< 其他

『上面这D话摘取之《Thinking in Java》?

在这里,主要要说下堆与堆栈的关系Q?

      堆:堆是heapQ是所谓的动态内存,其中的内存在不需要时可以回收Q以分配l新的内存请求,其内存中的数据是无序的,卛_分配的和随后分配的内存ƈ没有 什么必然的位置关系Q释放时也可以没有先后顺序。一般由使用者自由分配,malloc分配的就是堆Q需要手动释放?

      堆栈:是STACK。实际上是只有一个出入口的队列,卛_q先出(First     In     Last     OutQ,先分配的内存必定后释放。一般由Q由pȝ自动分配Q存攑֭攑և数的参数|局部变量等Q自动清除?

q有Q堆是全局的,堆栈是每个函数进入的时候分一块Q函数返回的时候就释放了,静态和全局变量Qnew     得到的变量,都放在堆中,局部变量放在堆栈中Q所以函数返回,局部变量就全没了?

其实在实际应用中Q堆栈多用来存储Ҏ(gu)的调用。而对则用于对象的存储?

       JAVA中的基本cdQ其实需要特D对待。因为,?span class="hilite1">JAVA中,通过new创徏的对象存储在“?#8221;中,所以用new 创徏一个小的、简单的变量Q如基本cd{,往往不是很有效。因此,?span class="hilite1">JAVA中,对于q些cdQ采用了与C、C++相同的方法。也是_不用new 来创建,而是创徏一个ƈ非是“引用”?#8220;自动”变量。这个变量拥有它?#8220;?#8221;Qƈ|于堆栈中,因此更高效?

]]>
Weblogic+Axis实现webservicehttp://www.aygfsteel.com/shanben/archive/2008/11/13/240195.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山?Wed, 12 Nov 2008 16:35:00 GMThttp://www.aygfsteel.com/shanben/archive/2008/11/13/240195.htmlhttp://www.aygfsteel.com/shanben/comments/240195.htmlhttp://www.aygfsteel.com/shanben/archive/2008/11/13/240195.html#Feedback1http://www.aygfsteel.com/shanben/comments/commentRss/240195.htmlhttp://www.aygfsteel.com/shanben/services/trackbacks/240195.html前面讲了用tomcat+axis来实现webserviceQ而网上对于weblogic+axis实现webservice却不多,按照|上说的做却L报错Q不成功Q所以我l过不停的试验,l于配置成功了weblogic+axis

首先我们下蝲一?a title="weblogic8.1.3" target="_blank">weblogic8.1.3Qjdk和axis的下载参照Tomcat+axis那片文章里的下蝲安装和设|?/p>

下蝲好后我们安装weblogicQ一直按下一步即?/p>

安装完成后运行Configuration Wizard来新建域配置Q一直按下一步,直到输入UserNameQPassword and DescriptionQ我们这里都讄成weblogicQ,然后在按下一步直到完?/p>

然后我们下载的axis压羃包下的webapp目录下的axis目录拯到C:\bea\user_projects\domains\mydomain\applications下面

׃axis中的一些jar包和weblogic中的有冲H,所以要修改C:\bea\user_projects\domains\mydomain\startWebLogic.cmd文gQ优先用axis的jarQ将其中?br /> set CLASSPATH=%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%CLASSPATH%;%WL_HOME%\server\lib\webservices.jar
Ҏ(gu)
set CLASSPATH=%AXISCLASSPATH%;%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%WL_HOME%\server\lib\webservices.jar
?br /> set CLASSPATH=%CLASSPATH%;%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre \lib\rt.jar;%WL_HOME%\server\lib\webservices.jarQ这里必M证将AXISCLASSPATH加入? CLASSPATH环境变量中)
保存q行q个文g启动weblogic控制収ͼ如下?br /> 查看更多_ֽ囄

启动好之后打开ieQ在url中输?a href="http://localhost:7001/console">http://localhost:7001/consoleQ输入用户名和密码进入Weblogic Server Console
查看更多_ֽ囄

点击展开部v节点--点击WEB应用E序模块--然后点击旁边的部|新的新的应用程序模块,会出现选择web应用的窗口,如下?br /> 查看更多_ֽ囄

选择相应目录下的web应用E序Q我们选择axisQ如下图
查看更多_ֽ囄

点击目标模块按钮Q接着在出现的H口中点击部|即可(q里我发现如果不在环境变量CLASSPATH中设|?AXISCLASSPATH%Ӟ部v报错)完成后如下图
查看更多_ֽ囄

q是我们可以点击试选项中的链接Q也可以在ie中输?a href="http://localhost:7001/axis/">http://localhost:7001/axis/Q如果出C下界面,说明配置成功
查看更多_ֽ囄

q时我们可以按照tomcat+axis那篇文章所说的发布web服务?/p>

遇到的问?br /> weblogic+axis的最大问题是2者间jar包的冲突Q客L调用web服务时会? NullPointerException错误Q网上都说是axis的saaj.jar和weblogic的webservices.jar冲突Q须? saaj.jar加在webservices.jar前面Q我按网上这么加了也没用Q后来我把整个AXISCLASSPATH都加C最前面Q就如我上面 所说的那样Q嘿Q他好了,我晕俄,|上的h也不知道是怎么成功?/p>

q有一U说法就是在web-inf目录下加weblogic.xmlQ网上的Z没说要加到哪个web-inf下,我想惛_有我的axis目录下有web-inf吧,加他下面了Qweblogic.xml的内容如?br /> <!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
 <container-descriptor>
  <prefer-web-inf-classes>true</prefer-web-inf-classes>
 </container-descriptor>
</weblogic-web-app>
q? 样也可以解决客户端调用web服务时会报NullPointerException的错误,但是我发现这样做的后果是点击axis的service? wsdl时出现无法显C页面。所以经q我不断的调试,只有像我前面说的那样修改startWebLogic.cmd中的set CLASSPATH应该算是最完美的方法了Q配q个东西的时候网上查了好久,都是千篇一律,说得没头没尾Q所以说q是得自己去实践阿(实践是检验真理的 唯一标准?img src="http://blog.hexun.com//CuteSoft_Client/CuteEditor/images/emteeth.gif" onload="var image=new Image();image.src=this.src;if(image.width alt="" />0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" alt="" align="absmiddle" border="0">Q?/p>

注:在部|好的web应用E序的web-inf中加入weblogic.xml需要重新部|web应用E序
        修改了startWebLogic.cmd需重新执行startWebLogic.cmdQ以便修改v作用

我在一个干净的winxp sp2,JDK1.4.2.05,weblogic8.1.3的环境下部v了axis1.4Q和同事在家q程调用获得成功

相关E序安装目录
JDK        C:\j2sdk1.4.2_05
weblogic  C:\bea
axis1.4     C:\axis14Qlib下有一些jar需另外当,老实说我也不知道哪些起了作用Q只是把|上所说得涉及到的jar都找来了Q嘿嘿)

相关环境变量讄
AXIS_HOME=C:\axis14
AXIS_LIB=%AXIS_HOME%\lib
AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\activation.jar;%AXIS_LIB%\xmlrpc-2.0.jar

JAVA_HOME=C:\j2sdk1.4.2_05
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%AXISCLASSPATH%;

Path前加?JAVA_HOME%\bin



]]>
վ֩ģ壺 ï| ɽ| | Ӫɽ| | Ѯ| | Ͻ| Ӣ| ɽ| ʯ| | ɽ| ũ| Ϸ| Ϫ| | ͨ| | ¹| | º| | | | ذ| ɽ| | | | | ٷ| | | | | ̩| | | | |