??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品成人一区二区三区夜夜夜,99久久婷婷国产精品综合,亚洲欧美一区二区在线观看 http://www.aygfsteel.com/shanben/年强则中国?年q步则中国进? zh-cn Wed, 18 Jun 2025 15:21:37 GMT Wed, 18 Jun 2025 15:21:37 GMT 60 教你使用MySQL触发器自动更新Memcache http://www.aygfsteel.com/shanben/archive/2010/08/12/328679.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Thu, 12 Aug 2010 07:22:00 GMT http://www.aygfsteel.com/shanben/archive/2010/08/12/328679.html http://www.aygfsteel.com/shanben/comments/328679.html http://www.aygfsteel.com/shanben/archive/2010/08/12/328679.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/328679.html http://www.aygfsteel.com/shanben/services/trackbacks/328679.html mysql 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');
]]> java版的memcached client及用文?/title> http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Wed, 11 Aug 2010 15:21:00 GMT http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html http://www.aygfsteel.com/shanben/comments/328581.html http://www.aygfsteel.com/shanben/archive/2010/08/11/328581.html#Feedback 1 http://www.aygfsteel.com/shanben/comments/commentRss/328581.html http://www.aygfsteel.com/shanben/services/trackbacks/328581.html
下面E序说明怎么来创建客L.
import com.danga.MemCached.*;
public class MyClass {
// 创徏一?memcached 客户端对?br />
protected static MemCachedClient mcc = new MemCachedClient();
// 创徏 memcachedq接?br />
static
{ // 指定memcached服务地址 String[] servers =
{ "server1.mydomain.com:1121","server2.mydomain.com:1121",
"server3.mydomain.com:1121" };
// 指定memcached服务器负载量
Integer[] weights ={ 3, 3, 2 };
// 从连接池获取一个连接实?br />
SockIOPool pool = SockIOPool.getInstance();
// 讄服务器和服务器负载量
pool.setServers( servers );
pool.setWeights( weights );
// 讄一些基本的参数
//讄初始q接? 最连接数 5 最大连接数 250
//讄一个连接最大空闲时?时
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 讄ȝE睡眠时?br />
// 每隔30U醒?nbsp; 然后
// 开始维?q接数大?br />
pool.setMaintSleep( 30 );
// 讄tcp 相关的树?br />
// 关闭nagle法
// 讄 d 时3U钟 set the read timeout to 3 secs
// 不设|连接超?br />
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 开始初始化 q接?br />
pool.initialize();
// 讄压羃模式
//如果过64k压羃数据
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
public static void examples() {
mcc.set( "foo", "This is a test String" );
String bar = mcc.get( "foo" );
}
}
MemCachedClient c?常用的方法说?br />
创徏 client对象 讄参数:
MemCachedClient mc = new MemCachedClient();
//压羃模式
mc.setCompressEnable(true);
// 如果 cache数据 大于4 KB 启用压~?br />
mc.setCompressThreshold(4096);
// 基本cdtostringҎ(gu)
// 通常不需要设|?br />
mc.setPrimitiveAsString(true);
存储一个对?
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Object value = SomeClass.getObject();
mc.set(key, value);
用客Lhashcode 存储一个对?
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Object value = SomeClass.getObject();
Integer hash = new Integer(45);
mc.set(key, value, hash);
setҎ(gu)Q在cache中存储一个指定对?br />
add 和replace Ҏ(gu)功能差不?br />
add -- 如果不存?q个key的对象,会存储一个对象到cache?br />
replace --只有当存在指定key对象的时?会覆盖已有对?br />
删除一个对?
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
mc.delete(key);
l合hashcode 删除一个对?
MemCachedClient mc = new MemCachedClient();
String key = "cacheKey1";
Integer hash = new Integer(45);
mc.delete(key, hashCode);
怎么cache计数Q增 减计?
MemCachedClient mc = new MemCachedClient();
String key = "counterKey";
mc.storeCounter(key, new Integer(100));
System.out.println("counter after adding 1: " mc.incr(key));
System.out.println("counter after adding 5: " mc.incr(key, 5));
System.out.println("counter after subtracting 4: " mc.decr(key, 4));
System.out.println("counter after subtracting 1: " mc.decr(key));
利用客户端的hashcode存储计数 增减 计数:
MemCachedClient mc = new MemCachedClient();
String key = "counterKey";
Integer hash = new Integer(45);
mc.storeCounter(key, new Integer(100), hash);
System.out.println("counter after adding 1: " mc.incr(key, 1, hash));
System.out.println("counter after adding 5: " mc.incr(key, 5, hash));
System.out.println("counter after subtracting 4: " mc.decr(key, 4, hash));
System.out.println("counter after subtracting 1: " mc.decr(key, 1, hash));
获取一个对?
MemCachedClient mc = new MemCachedClient();
String key = "key";
Object value = mc.get(key);
用客Lhashcode获取一个对?
MemCachedClient mc = new MemCachedClient();
String key = "key";
Integer hash = new Integer(45);
Object value = mc.get(key, hash);
MemCachedClient mc = new MemCachedClient();
String key = "key";
Integer hash = new Integer(45);
Object value = mc.get(key, hash);
从cache 中获取多个对?br />
MemCachedClient mc = new MemCachedClient();
String[] keys ={ "key", "key1", "key2" };Mapvalues = mc.getMulti(keys);
用客Lhashcode 从cache中获取多个对?br />
MemCachedClient mc = new MemCachedClient();
String[] keys = { "key", "key1", "key2" };
Integer[] hashes =
{ new Integer(45), new Integer(32), new Integer(44) };
Mapvalues = mc.getMulti(keys, hashes);
清空所有的对象
MemCachedClient mc = new MemCachedClient();
mc.flushAll();
得到服务器memcached的状态信?br />
MemCachedClient mc = new MemCachedClient();
Map stats = mc.stats();
注意?br />
1QFailover/Failback
当一个memcached服务器失效的时候客L默认会failover另一个服务去.
如果失效的服务器 恢复q行Q客L会返回到原来q接的服务器.
如果你不想用q个功能 讄下面的参?br />
pool.setFailover( false );
pool.setFailback( false );
2Q序列化
Boolean
Byte
String
Character
StringBuffer
StringBuilder
Short
Long
Double
Float
Date
java默认的类型没有实现序列化 可以讄
mcc.setPrimitiveAsString( true )替代.
Meetup.com实践q程中得出的一个经?Q项目中model 对象implement Externalizable 实现序列化,
可以节省cache 对象的大。从而节省网l带宽和内存I间?
]]> 高负载、高q发|站架构知识汇?大流量网站架构的几点认识 http://www.aygfsteel.com/shanben/archive/2010/08/11/328534.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Wed, 11 Aug 2010 06:32:00 GMT http://www.aygfsteel.com/shanben/archive/2010/08/11/328534.html http://www.aygfsteel.com/shanben/comments/328534.html http://www.aygfsteel.com/shanben/archive/2010/08/11/328534.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/328534.html http://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崩溃事g http://www.aygfsteel.com/shanben/archive/2010/08/11/328532.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Wed, 11 Aug 2010 06:25:00 GMT http://www.aygfsteel.com/shanben/archive/2010/08/11/328532.html http://www.aygfsteel.com/shanben/comments/328532.html http://www.aygfsteel.com/shanben/archive/2010/08/11/328532.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/328532.html http://www.aygfsteel.com/shanben/services/trackbacks/328532.html TOMCAT崩溃事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指o Q也打开了?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 GMT http://www.aygfsteel.com/shanben/archive/2010/08/11/328531.html http://www.aygfsteel.com/shanben/comments/328531.html http://www.aygfsteel.com/shanben/archive/2010/08/11/328531.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/328531.html http://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>
一个简单的试例子
package com.mapbar.util.cache;
import java.util.Date;
import java.util.ResourceBundle;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class Cache {
protected static ResourceBundle rb=ResourceBundle.getBundle( "memcached" );;
public static MemCachedClient mcc = new MemCachedClient();
static {
init();
}
public static void init(){
synchronized (mcc) {
System.out.println( "init call" );
String[] servers =rb.getString( "cache.servers" ).split( "," );
String[] strWeights =rb.getString( "cache.weights" ).split( "," );
Integer[] weights = new Integer[strWeights.length];
for ( int i= 0 ;i<strWeights.length;i++){
weights[i]=Integer.parseInt(strWeights[i]);
}
SockIOPool pool = SockIOPool.getInstance();
pool.setServers( servers );
pool.setWeights( weights );
pool.setInitConn(Integer.parseInt(rb.getString( "cache.initConn" )));
pool.setMinConn(Integer.parseInt(rb.getString( "cache.minConn" )));
pool.setMaxConn(Integer.parseInt(rb.getString( "cache.maxConn" )));
pool.setMaxIdle(Long.parseLong(rb.getString( "cache.maxIdle" )));
pool.setMaintSleep( 30 );
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
pool.initialize();
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
}
protected static void bulidCache(){
mcc.set( "test" , "This is a test String" , new Date( 100000 ));
}
protected static void output() {
String value = (String) mcc.get( "test" );
System.out.println(value);
}
public static void main(String[] args){
bulidCache();
output();
}
}
其中在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.dll Q?误己查扑֯应的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> http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Wed, 11 Aug 2010 05:51:00 GMT http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html http://www.aygfsteel.com/shanben/comments/328527.html http://www.aygfsteel.com/shanben/archive/2010/08/11/328527.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/328527.html http://www.aygfsteel.com/shanben/services/trackbacks/328527.html
日志原文Q?a target="_blank">http://j2ee.blog.sohu.com/70343632.html
memcache for win 软g主页Qhttp://jehiah.cz/projects/memcached-win32/ http://labs.northscale.com/memcached-packages/
meecache for liunx 软g主页Qhttp://memcached.org/
最q一直在做一个项目的前期设计工作Q考虑到后期系l的扩展和性能问题也找了很多解x法,有一个就是用C数据库的~存工具memcachedQ当然该工具q不仅仅局限于数据库的~存Q。先单的介绍下什么是memcached?
Memcached是高性能的,分布式的内存对象~存pȝQ用于在动态应用中减少数据库负
载,提升讉K速度。Memcached由Danga
Interactive开发,用于提升LiveJournal.com讉K速度的。LJ每秒动态页面访问量几千ơ,用户700万。Memcached数
据库负蝲大幅度降低,更好的分配资源,更快速访问?/font>
上网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>
首先?a >http://danga.com/memcached/?
载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>
c:>memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start
W一行是安装memcached成ؓ服务Q这h能正常运行,否则q行p|Q第一行是启动memcached的,作ؓ试我们q单的只分?2M内存
了,然后监听本机端口和以守护q行q行。执行完毕后Q我们就可以在Q务管理器中见到memcached.exeq个q程了。好了,我们的服务器已经正常q?
行了Q?下面我们来写java的客Lq接E序?/p>
我们java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_1.6.jar文g复制到java目的lib目录下,然后我们来编写代码,比如我提供的一个应用类如下Q?/p>
package utils.cache;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
* 使用memcached的缓存实用类.
*
* @author 铁木子
*
*/
public class MemCached
{
// 创徏全局的唯一实例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCached memCached = new MemCached();
// 讄与缓存服务器的连接池
static {
// 服务器列表和其权?/span>
String[] servers = { " 127.0.0.1:11211 " };
Integer[] weights = { 3 };
// 获取sockeq接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 讄服务器信?/span>
pool.setServers( servers );
pool.setWeights( weights );
// 讄初始q接数、最和最大连接数以及最大处理时?/span>
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 讄ȝE的睡眠旉
pool.setMaintSleep( 30 );
// 讄TCP的参敎ͼq接时{?/span>
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 初始化连接池
pool.initialize();
// 压羃讄Q超q指定大(单位为KQ的数据都会被压~?/span>
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
/**
* 保护型构造方法,不允许实例化Q?br />
*
*/
protected MemCached()
{
}
/**
* 获取唯一实例.
* @return
*/
public static MemCached getInstance()
{
return memCached;
}
/**
* d一个指定的值到~存?
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value)
{
return mcc.add(key, value);
}
public boolean add(String key, Object value, Date expiry)
{
return mcc.add(key, value, expiry);
}
public boolean replace(String key, Object value)
{
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry)
{
return mcc.replace(key, value, expiry);
}
/**
* Ҏ(gu)指定的关键字获取对象.
* @param key
* @return
*/
public Object get(String key)
{
return mcc.get(key);
}
public static void main(String[] args)
{
MemCached cache = MemCached.getInstance();
cache.add( " hello " , 234 );
System.out.print(" get value : " + cache.get( " hello " ));
}
}
那么我们可以通过单的像mainҎ(gu)中操作的一样存入一个变量,然后再取行查看,我们可以看到先调用了addQ然后再q行getQ我们运行一?
后,234q个值已l被我们存入了memcached的缓存中的了Q我们将mainҎ(gu)中红色的那一行注释掉后,我们再运行还是可以看到get到的
value也是234Q即~存中我们已l存在了数据了?/p>
对基本的数据我们可以操作Q对于普通的POJO而言Q如果要q行存储的话Q那么比如让其实现java.io.Serializable接口Q因?
memcached是一个分布式的缓存服务器Q多台服务器间进行数据共享需要将对象序列化的Q所以必d现该接口Q否则会报错的。比如我们写一个简单的?
试Bean如下Q?/p>
class TBean implements java.io.Serializable
{
private static final long serialVersionUID = 1945562032261336919L ;
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this .name = name;
}
}
然后我们在mainҎ(gu)中加入如下几行代码:
TBean tb = new TBean();
tb.setName( " 铁木子 " );
cache.add( " bean " , tb);
TBean tb1 = (TBean)cache.get( " bean " );
System.out.print( " name= " + tb1.getName());
tb1.setName( " 铁木子_修改?/span>" );
tb1 = (TBean)cache.get( " bean " );
System.out.print( " name= " + tb1.getName());
我们首先把TBean的一个实例放入缓存中Q然后再取出来,q进行名U的修改Q然后我们再取这个对象,我们再看其名Uͼ发现修改的对象ƈ不是~存中的?
象,而是通过序列化过来的一个实例对象,q样我们无L心对原生cȝ无意修改D~存数据失效了,呵呵~~看来我也是多此一惛_。所以这表明从缓存中?
取的对象是存入对象的一个副本,对获取对象的修改q不能真正的修改~存中的数据Q而应该用其提供的replace{方法来q行修改?/span>
以上是我在windows下对memcached的一点小学习和实践,在以后的目开发过E中会更深入的学习和应用这一~存工具Q也希望和有兴趣的同行一赯论学习该工具的用~~
]]> Birt试牛刀 http://www.aygfsteel.com/shanben/archive/2009/02/02/252906.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Mon, 02 Feb 2009 01:31:00 GMT http://www.aygfsteel.com/shanben/archive/2009/02/02/252906.html http://www.aygfsteel.com/shanben/comments/252906.html http://www.aygfsteel.com/shanben/archive/2009/02/02/252906.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/252906.html http://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> http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Thu, 15 Jan 2009 15:23:00 GMT http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html http://www.aygfsteel.com/shanben/comments/251511.html http://www.aygfsteel.com/shanben/archive/2009/01/15/251511.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/251511.html http://www.aygfsteel.com/shanben/services/trackbacks/251511.html
我们公司为每一个新q来的员工指z了一个导师。这让我惌v了原来听q的微Y 培训Q现单的归纳了几条,放上来供大家讨论?/p>
Q、首先微软的导师选择不是领导行政上指定的Q而是学生选择导师?br />
在这里微软强调的是:牛h才能成ؓ导师。公司的人力资源pȝ有一模块会把导师的特长列出来Q以及原来被选择为导师的ơ数Q还有历界学生对其的评h(hun)?/p>
如果是新员工的话Q基的流E常识之cȝ有培训,具体到某一斚w?a onclick="javascript:tagshow(event, " href="javascript:;" target="_self" %BC%BC%CA%F5?);?>技?/strong> 的话Q可以由你的上指导你选择?br />
Q、不是新人才能选择导师Q当你换岗,换项目,反正Ҏ(gu)个领域是新的时候,都可以选择导师
Q、导师不会天天指gQ帮助你制定培训计划。因为导师的旉比你的时间宝늚?br />
Ҏ(gu)是:
Q)学习 、提高等{的计划׃自己来完成?/p>
Q)导师可以在邮件上花几分钟l你指导一下?/p>
Q)导师可以在某个有I地旉找你谈谈Q或你约导师Q,但多是你请导师吃饭的时候。这样饭也吃了,导师也当了?br />
Q、(注意是大点)导师指导你,对他是有好处?.....
Q)提高影响力(微Y最注意的一点)
Q)有了影响为,才有l效吧?/p>
Q)有了影响力,以后的新人才会选择你吧Q以后的Ch选择你的多Q多C的档期安排不q来Q这才更牛吧Q?br />
Q、这对企业文化也有好处?br />
Q)文化影响׃nQ比强制Q指z更有效些。
Q)Ҏ(gu)人、旧人都好,不会出现你有难,十方都会Q但都不支援你的情况
Q)不会出现研究成果Q只保存在某个h的头脑里的情c节省资?br />
特别说明Q这U考核对导师不考核。因为是他导的作用,不是师的作用。师的考核是看他被选择的次敎ͼ学生对他的评仗这更客观,真实?/p>
]]> Java中存储数据的方式 http://www.aygfsteel.com/shanben/archive/2008/11/16/240762.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Sat, 15 Nov 2008 16:57:00 GMT http://www.aygfsteel.com/shanben/archive/2008/11/16/240762.html http://www.aygfsteel.com/shanben/comments/240762.html http://www.aygfsteel.com/shanben/archive/2008/11/16/240762.html#Feedback 0 http://www.aygfsteel.com/shanben/comments/commentRss/240762.html http://www.aygfsteel.com/shanben/services/trackbacks/240762.html JAVA中,有六个不同的地方可以存储数据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实现webservice http://www.aygfsteel.com/shanben/archive/2008/11/13/240195.html存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? 存鹰之心于高q?取鹰之志而凌?习鹰之性以涉险,融鹰之神在山? Wed, 12 Nov 2008 16:35:00 GMT http://www.aygfsteel.com/shanben/archive/2008/11/13/240195.html http://www.aygfsteel.com/shanben/comments/240195.html http://www.aygfsteel.com/shanben/archive/2008/11/13/240195.html#Feedback 1 http://www.aygfsteel.com/shanben/comments/commentRss/240195.html http://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.3 Qjdk和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/console Q输入用户名和密码进入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
]]>
վ֩ģ壺
ï |
ɽ |
|
Ӫɽ |
|
Ѯ |
|
Ͻ |
Ӣ |
ɽ |
ʯ |
|
ɽ |
ũ |
Ϸ |
Ϫ |
|
ͨ |
|
¹ |
|
º |
|
|
|
ذ |
ɽ |
|
|
|
|
ٷ |
|
|
|
|
̩ |
|
|
|
|