<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Herbert Yang &#187; Architecture</title>
	<atom:link href="http://www.herbertyang.com/category/architecture/feed" rel="self" type="application/rss+xml" />
	<link>http://www.herbertyang.com</link>
	<description></description>
	<lastBuildDate>Wed, 13 Jul 2011 07:02:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>如何得到每天某时刻的时间戳</title>
		<link>http://www.herbertyang.com/2010/11/01/how-to-get-the-timestamp-of-a-certain-time-every-day.html</link>
		<comments>http://www.herbertyang.com/2010/11/01/how-to-get-the-timestamp-of-a-certain-time-every-day.html#comments</comments>
		<pubDate>Mon, 01 Nov 2010 02:28:57 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Calendar]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Time]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=668</guid>
		<description><![CDATA[public static long getDaybreakTime() { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTimeInMillis(); } 其实代码是比较简单的，相信这段代码还是有很多用处的。 可以使用到的场景有： 设置在某一时刻之前，必须更新缓存里的数据； 在Quartz中，统计和分析昨天的数据； 合并某一天内发生的动态； ……]]></description>
			<content:encoded><![CDATA[<pre class="brush: java; title: ;">
	public static long getDaybreakTime() {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.HOUR, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTimeInMillis();
	}
</pre>
<p>其实代码是比较简单的，相信这段代码还是有很多用处的。<br />
可以使用到的场景有：</p>
<ul>
<li>设置在某一时刻之前，必须更新缓存里的数据；</li>
<li>在Quartz中，统计和分析昨天的数据；</li>
<li>合并某一天内发生的动态；</li>
<li>……</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/11/01/how-to-get-the-timestamp-of-a-certain-time-every-day.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2010系统架构师大会</title>
		<link>http://www.herbertyang.com/2010/09/01/sacc2010.html</link>
		<comments>http://www.herbertyang.com/2010/09/01/sacc2010.html#comments</comments>
		<pubDate>Wed, 01 Sep 2010 09:52:01 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=618</guid>
		<description><![CDATA[2010年8月27、28日，由IT168、ChinaUnix、ITPUB、IXPUB共同主办的SACC2010系统架构师大会在北京永泰福朋·喜来登大酒店成功举行。两天的盛会以七个技术专场为平台，内容涵盖从系统架构、网络、安全、存储、数据库、移动互联、云计算等与架构师相关的方方面面。 相关地址： http://sacc.it168.com/ 部分PPT下载地址： 1、架构师大会－架构设计专场 http://linux.chinaunix.net/SACC2010/topic1.zip 2、架构师大会－架构设计与存储管理专场 http://linux.chinaunix.net/SACC2010/topic2.zip 3、架构师大会－应用系统优化与流量管理 http://linux.chinaunix.net/SACC2010/topic3.zip 4、架构师大会－可扩展数据库架构 http://linux.chinaunix.net/SACC2010/topic4.zip 5、架构师大会－移动互联网产品架构设计 http://linux.chinaunix.net/SACC2010/topic5.zip 6、架构师大会－系统安全与服务监控 http://linux.chinaunix.net/SACC2010/topic6.zip 7、架构师大会－云计算分布式应用实践 http://linux.chinaunix.net/SACC2010/topic7.zip]]></description>
			<content:encoded><![CDATA[<p>2010年8月27、28日，由IT168、ChinaUnix、ITPUB、IXPUB共同主办的SACC2010系统架构师大会在北京永泰福朋·喜来登大酒店成功举行。两天的盛会以七个技术专场为平台，内容涵盖从系统架构、网络、安全、存储、数据库、移动互联、云计算等与架构师相关的方方面面。<br />
相关地址：</p>
<p>http://sacc.it168.com/</p>
<p>部分PPT下载地址：<br />
1、架构师大会－架构设计专场</p>
<p>http://linux.chinaunix.net/SACC2010/topic1.zip</p>
<p>2、架构师大会－架构设计与存储管理专场</p>
<p>http://linux.chinaunix.net/SACC2010/topic2.zip</p>
<p>3、架构师大会－应用系统优化与流量管理</p>
<p>http://linux.chinaunix.net/SACC2010/topic3.zip</p>
<p>4、架构师大会－可扩展数据库架构</p>
<p>http://linux.chinaunix.net/SACC2010/topic4.zip</p>
<p>5、架构师大会－移动互联网产品架构设计</p>
<p>http://linux.chinaunix.net/SACC2010/topic5.zip</p>
<p>6、架构师大会－系统安全与服务监控</p>
<p>http://linux.chinaunix.net/SACC2010/topic6.zip</p>
<p>7、架构师大会－云计算分布式应用实践</p>
<p>http://linux.chinaunix.net/SACC2010/topic7.zip</p>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/09/01/sacc2010.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ThreadPoolExecutor策略</title>
		<link>http://www.herbertyang.com/2010/08/27/threadpoolexecutor-policy.html</link>
		<comments>http://www.herbertyang.com/2010/08/27/threadpoolexecutor-policy.html#comments</comments>
		<pubDate>Fri, 27 Aug 2010 02:51:39 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Thinking]]></category>
		<category><![CDATA[Policy]]></category>
		<category><![CDATA[Queue]]></category>
		<category><![CDATA[ThreadPoolExecutor]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=608</guid>
		<description><![CDATA[ThreadPoolExecutor的策略策略有四种 CallerRunsPolicy【重要的任务】 当异步线程池满了时，使用阻塞式，丢弃异步的方式执行，此策略比较保守，不丢弃，不放弃。 AbortPolicy【不太重要，但需要监控的任务】 中止任务，并抛出异常。 DiscardPolicy【满足最先请求的任务】 丢弃当前线程，也就是新来的任务丢弃掉。 DiscarOldestPolicy【满足最后请求的任务】 丢弃任务列队里最老的线程。 对于ThreadPoolExecutor来说，还有关注的地方是，他有3种列队。 SynchronousQueue LinkedBlockingQueue ArrayBlockingQueue]]></description>
			<content:encoded><![CDATA[<p><a href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html">ThreadPoolExecutor</a>的策略策略有四种</p>
<p><strong>CallerRunsPolicy【重要的任务】</strong></p>
<p>当异步线程池满了时，使用阻塞式，丢弃异步的方式执行，此策略比较保守，不丢弃，不放弃。</p>
<p><strong>AbortPolicy【不太重要，但需要监控的任务】</strong></p>
<p>中止任务，并抛出异常。</p>
<p><strong>DiscardPolicy【满足最先请求的任务】</strong></p>
<p>丢弃当前线程，也就是新来的任务丢弃掉。</p>
<p><strong>DiscarOldestPolicy【满足最后请求的任务】</strong></p>
<p>丢弃任务列队里最老的线程。</p>
<p>对于<a href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html">ThreadPoolExecutor</a>来说，还有关注的地方是，他有3种列队。</p>
<ul>
<li>SynchronousQueue</li>
<li> LinkedBlockingQueue</li>
<li> ArrayBlockingQueue</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/08/27/threadpoolexecutor-policy.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ANT自动化压缩合并JS/CSS和更改版本号</title>
		<link>http://www.herbertyang.com/2010/07/20/ant-automatic-compression-js-css-and-change-the-version-number-2.html</link>
		<comments>http://www.herbertyang.com/2010/07/20/ant-automatic-compression-js-css-and-change-the-version-number-2.html#comments</comments>
		<pubDate>Tue, 20 Jul 2010 13:19:40 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Ant]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=604</guid>
		<description><![CDATA[最近做到了前端优化的一些工作，涉及到了自动化部署的问题。前端优化无非是雅虎的优化法则，不过如果想把优化法则加到自动化部署中去的话，下面的几种方法可以帮助你。 1、JS/CSS压缩脚本 &#60;!-- 压缩JS，CSS --&#62; &#60;target name=&#34;compress&#34;&#62; &#60;apply executable=&#34;java&#34; parallel=&#34;false&#34; failonerror=&#34;true&#34;&#62; &#60;fileset dir=&#34;${html-js}&#34; includes=&#34;**/*.js&#34; /&#62; &#60;arg line=&#34;-jar&#34; /&#62; &#60;arg path=&#34;${yui-compressor}&#34; /&#62; &#60;arg line=&#34;--charset utf-8&#34; /&#62; &#60;srcfile /&#62; &#60;arg line=&#34;-o&#34; /&#62; &#60;mapper type=&#34;glob&#34; from=&#34;*.js&#34; to=&#34;${webhtml-js}/*-min.js&#34; /&#62; &#60;targetfile /&#62; &#60;/apply&#62; &#60;apply executable=&#34;java&#34; parallel=&#34;false&#34; failonerror=&#34;true&#34;&#62; &#60;fileset dir=&#34;${html-css}&#34; includes=&#34;**/*.css&#34; /&#62; &#60;arg line=&#34;-jar&#34; /&#62; &#60;arg path=&#34;${yui-compressor}&#34; /&#62; &#60;arg line=&#34;--charset utf-8&#34;]]></description>
			<content:encoded><![CDATA[<p>最近做到了前端优化的一些工作，涉及到了自动化部署的问题。前端优化无非是雅虎的优化法则，不过如果想把优化法则加到自动化部署中去的话，下面的几种方法可以帮助你。<br />
<strong>1、JS/CSS压缩脚本</strong></p>
<pre class="brush: xml; title: ;">
	&lt;!-- 压缩JS，CSS --&gt;
	&lt;target name=&quot;compress&quot;&gt;
		&lt;apply executable=&quot;java&quot; parallel=&quot;false&quot; failonerror=&quot;true&quot;&gt;
			&lt;fileset dir=&quot;${html-js}&quot; includes=&quot;**/*.js&quot; /&gt;
			&lt;arg line=&quot;-jar&quot; /&gt;
			&lt;arg path=&quot;${yui-compressor}&quot; /&gt;
			&lt;arg line=&quot;--charset utf-8&quot; /&gt;
			&lt;srcfile /&gt;
			&lt;arg line=&quot;-o&quot; /&gt;
			&lt;mapper type=&quot;glob&quot; from=&quot;*.js&quot; to=&quot;${webhtml-js}/*-min.js&quot; /&gt;
			&lt;targetfile /&gt;
		&lt;/apply&gt;
		&lt;apply executable=&quot;java&quot; parallel=&quot;false&quot; failonerror=&quot;true&quot;&gt;
			&lt;fileset dir=&quot;${html-css}&quot; includes=&quot;**/*.css&quot; /&gt;
			&lt;arg line=&quot;-jar&quot; /&gt;
			&lt;arg path=&quot;${yui-compressor}&quot; /&gt;
			&lt;arg line=&quot;--charset utf-8&quot; /&gt;
			&lt;srcfile /&gt;
			&lt;arg line=&quot;-o&quot; /&gt;
			&lt;mapper type=&quot;glob&quot; from=&quot;*.css&quot; to=&quot;${webhtml-css}/*-min.css&quot; /&gt;
			&lt;targetfile /&gt;
		&lt;/apply&gt;
	&lt;/target&gt;
</pre>
<p><strong>2、更新JSS/CSS版本号</strong></p>
<pre class="brush: xml; title: ;">
	&lt;!-- 更新静态文件的版本号 --&gt;
	&lt;target name=&quot;version&quot;&gt;
		&lt;tstamp&gt;
			&lt;format property=&quot;TIMESTAMP&quot; pattern=&quot;yyyyMMddHHmmss&quot; locale=&quot;en&quot; /&gt;
		&lt;/tstamp&gt;
		&lt;loadfile property=&quot;svn.version&quot; srcFile=&quot;./.svn/entries&quot;&gt;
			&lt;filterchain&gt;
				&lt;headfilter lines=&quot;1&quot; skip=&quot;3&quot; /&gt;
				&lt;deletecharacters chars=&quot;\n&quot; /&gt;
			&lt;/filterchain&gt;
		&lt;/loadfile&gt;
		&lt;delete file=&quot;${webinf-ftl}/config.ftl&quot;/&gt;
		&lt;copy file=&quot;${ftl-app}/config.ftl&quot; tofile=&quot;${webinf-ftl}/config.ftl&quot; /&gt;
		&lt;replace file=&quot;${webinf-ftl}/config.ftl&quot; token=&quot;$version$&quot; value=&quot;${svn.version}&quot; /&gt;
	&lt;/target&gt;
</pre>
<p>接下来就是合并JS/CSS文件</p>
<pre class="brush: xml; title: ;">
	&lt;!-- 合并静态文件 --&gt;
	&lt;target name=&quot;js-concat&quot;&gt;
		&lt;concat destfile=&quot;${webhtml-js}/jquery.js&quot; encoding=&quot;utf-8&quot; append=&quot;false&quot;&gt;
			&lt;path path=&quot;${webhtml-js}/jquery.core-min.js&quot; /&gt;
			&lt;path path=&quot;${webhtml-js}/jquery.cookie-min.js&quot; /&gt;
			&lt;path path=&quot;${webhtml-js}/jquery.timeago-min.js&quot; /&gt;
			&lt;path path=&quot;${webhtml-js}/jquery.utils-min.js&quot; /&gt;
			&lt;path path=&quot;${webhtml-js}/jquery.watermarkinput-min.js&quot; /&gt;
		&lt;/concat&gt;
	&lt;/target&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/07/20/ant-automatic-compression-js-css-and-change-the-version-number-2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用JAVA实现简单的Memcached功能</title>
		<link>http://www.herbertyang.com/2010/05/19/memcached-with-java-to-achieve-a-simple-function.html</link>
		<comments>http://www.herbertyang.com/2010/05/19/memcached-with-java-to-achieve-a-simple-function.html#comments</comments>
		<pubDate>Wed, 19 May 2010 10:50:58 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=582</guid>
		<description><![CDATA[慎用，一般不提倡占用应用服务器的内存。 MemcacheMapVO.java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; /** * MemcacheMap 保存的对象 * * @author Herbert * */ public class MemcacheMapVO implements Serializable { /** * */ private static final long serialVersionUID = 2719454259953108119L; /** * value */ private Object value; /** * 过期时间 */ private Long expires; public Object getValue() { return]]></description>
			<content:encoded><![CDATA[<p>慎用，一般不提倡占用应用服务器的内存。<br />
<span id="more-582"></span><br />
MemcacheMapVO.java</p>
<pre class="brush: java; title: ;">
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * MemcacheMap 保存的对象
 *
 * @author Herbert
 *
 */
public class MemcacheMapVO implements Serializable {
	/**
	 *
	 */
	private static final long serialVersionUID = 2719454259953108119L;

	/**
	 * value
	 */
	private Object value;

	/**
	 * 过期时间
	 */
	private Long expires;

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}

	public Long getExpires() {
		return expires;
	}

	public void setExpires(Long expires) {
		this.expires = expires;
	}

	public int size() {
		try {
			ByteArrayOutputStream buf = new ByteArrayOutputStream();
			ObjectOutputStream o = new ObjectOutputStream(buf);
			o.writeObject(this.value);
			byte[] bytes = buf.toByteArray();
			return bytes.length * 8;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return 0;
	}
}
</pre>
<p>MemcacheMapUtil.java</p>
<pre class="brush: java; title: ;">
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;

import com.netease.photo.share.meta.vo.MemcacheMapVO;

/**
 * 用JAVA实现简单的Memcached功能&lt;br&gt;
 *
 * @author Herbert
 *
 */
public final class MemcacheMapUtil {
	private MemcacheMapUtil() {

	}

	public static final int MINUTES = 60;

	/**
	 * MAP个数
	 */
	private static final long MAXSIZE = 3000;

	/**
	 * 安全个数
	 */
	private static final long SAFESIZE = 2800;

	/**
	 * 最大时间
	 */
	private static final int MAXTIME = 24 * 60 * 60 * 1000;

	/**
	 * 存储的值
	 */
	private static HashMap&lt;String, MemcacheMapVO&gt; memcacheMap = new HashMap&lt;String, MemcacheMapVO&gt;();

	/**
	 * 得到值
	 *
	 * @param key
	 *
	 * @return
	 */
	public static Object get(final String key) {
		MemcacheMapVO memcacheMapVO = memcacheMap.get(key);
		long now = new Date().getTime();
		// 判断是否有这个值存在
		if (memcacheMapVO == null) {
			return null;
			// 判断保存的值是否过期
		} else if (now &gt;= memcacheMapVO.getExpires()) {
			memcacheMap.remove(key);
			return null;
		} else {
			return memcacheMapVO.getValue();
		}
	}

	/**
	 * 删除值
	 *
	 * @param key
	 */
	public static void delete(final String key) {
		memcacheMap.remove(key);
	}

	/**
	 *
	 * @param key
	 *            对象的KEY
	 * @param value
	 *            对象的值
	 * @param seconds
	 *            对象的有效时间
	 */
	public static void set(final String key, final Object value, final int seconds) {
		// 清理工作
		int count = memcacheMap.size();
		if (count &lt;= MemcacheMapUtil.SAFESIZE) {
			// 小于安全个数，不需要清理
		} else if (count &gt; MemcacheMapUtil.SAFESIZE) {
			// 大于安全个数，按时间清理
			checkMemcacheMap();
			if (count &gt;= MemcacheMapUtil.MAXSIZE) {
				// 清理后无效，进行强制清理
				clearMemcacheMap();
			}
		}
		// 增加值的工作
		MemcacheMapVO memcacheMapVO = new MemcacheMapVO();
		memcacheMapVO.setValue(value);
		long now = new Date().getTime();

		long expires = seconds * 1000;
		if (expires &gt;= MAXTIME) {
			expires = MAXTIME;
		}
		expires += now;
		memcacheMapVO.setExpires(expires);
		memcacheMap.put(key, memcacheMapVO);
	}

	/**
	 * 默认保存时间为12小时
	 *
	 * @param key
	 * @param value
	 */
	public static void set(final String key, final Object value) {
		set(key, value, 12 * 60 * 60);
	}

	/**
	 * 产生一个KEY
	 *
	 * @param methodName
	 *            方法名
	 * @param parameters
	 *            参数列表
	 */
	public static String createKey(String methodName, Object... parameters) {
		String str = methodName;
		for (Object obj : parameters) {
			str += &quot;_&quot; + obj.toString();
		}
		return str;
	}

	/**
	 * 强制清理到安全值
	 */
	private static void clearMemcacheMap() {
		// 清除
		long clearCount = MemcacheMapUtil.MAXSIZE - MemcacheMapUtil.SAFESIZE;
		String[] keys = (String[]) memcacheMap.keySet().toArray();
		int keyCount = keys.length;
		Random random = new Random();
		for (int i = 0; i &lt; clearCount; i++) {
			int randomIndex = random.nextInt(keyCount);
			String key = keys[randomIndex];
			delete(key);
		}
	}

	/**
	 * 检查过期的对象
	 */
	private static void checkMemcacheMap() {
		// 这种迭代的方式节约了一次迭代
		Iterator&lt;Entry&lt;String, MemcacheMapVO&gt;&gt; iterator = memcacheMap.entrySet().iterator();
		long now = new Date().getTime();
		while (iterator.hasNext()) {
			Map.Entry&lt;String, MemcacheMapVO&gt; entry = (Map.Entry&lt;String, MemcacheMapVO&gt;) iterator.next();
			String key = (String) entry.getKey();
			MemcacheMapVO memcacheMapVO = entry.getValue();
			if (now &gt;= memcacheMapVO.getExpires()) {
				memcacheMap.remove(key);
			}
		}
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/05/19/memcached-with-java-to-achieve-a-simple-function.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>海量数据迁移</title>
		<link>http://www.herbertyang.com/2010/05/11/massive-data-migration.html</link>
		<comments>http://www.herbertyang.com/2010/05/11/massive-data-migration.html#comments</comments>
		<pubDate>Tue, 11 May 2010 13:17:29 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Migrate]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=574</guid>
		<description><![CDATA[#按照文件的行数拆分文件 split -l 5000 large_file.txt new_file_prefix #批量重命名文件夹里的文件 find -name 'x*' -printf %f\\n&#124;awk -F'.' '{print $1}'&#124;xargs -i{} mv {} {}.txt 这次迁移Exif信息，数据有4亿的数据，为了不影响另外一个系统，采用单节点数据文件迁移（具体还有很多因素）。 首先是拆分数据文件为小文件，即使程序错误或者其它中断，也只影响少量数据，重新迁移的话，只有少量数据是空转。 当然使用小文件还有个原因是考虑到要记录没有处理的数据，所以这些文件数据是要读到内存中去的。 还有就是可以做到多进程多线程迁移数据，只有你的数据库足够强大，抗得住压力。 此过程中可以以文件为单位，采用多线程操作，可以提高速度。 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(15, 100, 1, TimeUnit.SECONDS, new ArrayBlockingQueue&#60;Runnable&#62;(10), new ThreadPoolExecutor.DiscardOldestPolicy()); 这个线程池当处理不过来时，会丢弃任务，所以我是采用这样的方式解决这个问题的。 while (threadPool.getPoolSize() &#62; 80) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } 得到Java进程的PID String]]></description>
			<content:encoded><![CDATA[<pre class="brush: bash; title: ;">
#按照文件的行数拆分文件
split -l 5000 large_file.txt new_file_prefix
#批量重命名文件夹里的文件
find -name 'x*' -printf %f\\n|awk -F'.' '{print $1}'|xargs -i{} mv {} {}.txt
</pre>
<p>这次迁移Exif信息，数据有4亿的数据，为了不影响另外一个系统，采用单节点数据文件迁移（具体还有很多因素）。<br />
首先是拆分数据文件为小文件，即使程序错误或者其它中断，也只影响少量数据，重新迁移的话，只有少量数据是空转。<br />
当然使用小文件还有个原因是考虑到要记录没有处理的数据，所以这些文件数据是要读到内存中去的。<br />
还有就是可以做到多进程多线程迁移数据，只有你的数据库足够强大，抗得住压力。<br />
此过程中可以以文件为单位，采用多线程操作，可以提高速度。</p>
<pre class="brush: java; title: ;">
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(15, 100, 1, TimeUnit.SECONDS,
				new ArrayBlockingQueue&lt;Runnable&gt;(10), new ThreadPoolExecutor.DiscardOldestPolicy());
</pre>
<p>这个线程池当处理不过来时，会丢弃任务，所以我是采用这样的方式解决这个问题的。</p>
<pre class="brush: java; title: ;">
			while (threadPool.getPoolSize() &gt; 80) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
</pre>
<p>得到Java进程的PID</p>
<pre class="brush: java; title: ;">
String pid = ManagementFactory.getRuntimeMXBean().getName().split(&quot;@&quot;)[0];
</pre>
<p>迁移的效率还是比较高，导致数据库扛不住了，必须在白天放慢迁移速度。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/05/11/massive-data-migration.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>写在项目下线后</title>
		<link>http://www.herbertyang.com/2010/04/22/after-writing-the-project-off-the-assembly-line.html</link>
		<comments>http://www.herbertyang.com/2010/04/22/after-writing-the-project-off-the-assembly-line.html#comments</comments>
		<pubDate>Thu, 22 Apr 2010 15:09:05 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[MyLife]]></category>
		<category><![CDATA[Thinking]]></category>
		<category><![CDATA[Paipai]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=512</guid>
		<description><![CDATA[最近两年前开发的那个项目下线了，回想起两年来对这个项目做出的努力和从这个项目所获得的收获，感到无比的庆幸。 刚毕业后找了个小工作，自己摸爬滚打了好一整子，一顿瞎搞，虽然也有点小成，但总觉得想学到很多，想施展更多。 在这样的一个情况下，我加入了这个项目，虽然有件事情来得太突然，自己都没有预料到，但总归一切变好，自己始终没有放弃，一直低调的坚持下来，所以我很感谢当时在我身边的每一个人的关怀。 完整的经历了整个项目，虽然这个项目只有两年，但足以让我全盘把握，了解了并掌握了整个项目的开发，受益匪浅，估计还可以使用好几年：） 其实项目本身好无价值，贵在我们在项目上所花费的心血，所赋予的期望和所得到的回报，所以这是我人生的一个转折点，我踏进了项目开发的大门。 下面会分小块来讲解我的感悟： 团队建设 系统开发 系统运维]]></description>
			<content:encoded><![CDATA[<p>最近两年前开发的那个项目下线了，回想起两年来对这个项目做出的努力和从这个项目所获得的收获，感到无比的庆幸。<a href="http://www.herbertyang.com/wp-content/uploads/2010/04/IMG_0199-1.jpg"><img class="alignright size-medium wp-image-515" title="FB" src="http://www.herbertyang.com/wp-content/uploads/2010/04/IMG_0199-1-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>刚毕业后找了个小工作，自己摸爬滚打了好一整子，一顿瞎搞，虽然也有点小成，但总觉得想学到很多，想施展更多。</p>
<p>在这样的一个情况下，我加入了这个项目，虽然有件事情来得太突然，自己都没有预料到，但总归一切变好，自己始终没有放弃，一直低调的坚持下来，所以我很感谢当时在我身边的每一个人的关怀。</p>
<p>完整的经历了整个项目，虽然这个项目只有两年，但足以让我全盘把握，了解了并掌握了整个项目的开发，受益匪浅，估计还可以使用好几年：）</p>
<p>其实项目本身好无价值，贵在我们在项目上所花费的心血，所赋予的期望和所得到的回报，所以这是我人生的一个转折点，我踏进了项目开发的大门。</p>
<p>下面会分小块来讲解我的感悟：</p>
<ol>
<li><a href="http://www.herbertyang.com/2010/04/25/team-building.html" target="_blank">团队建设</a></li>
<li><a href="http://www.herbertyang.com/2010/04/27/system-development.html" target="_blank">系统开发</a></li>
<li><a href="http://www.herbertyang.com/2010/04/28/system-operation.html" target="_blank">系统运维</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2010/04/22/after-writing-the-project-off-the-assembly-line.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解读Nginx的Memcached Module</title>
		<link>http://www.herbertyang.com/2009/12/01/nginx-http-memcached-module.html</link>
		<comments>http://www.herbertyang.com/2009/12/01/nginx-http-memcached-module.html#comments</comments>
		<pubDate>Mon, 30 Nov 2009 16:57:49 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=469</guid>
		<description><![CDATA[发现SyntaxHighlighter这个代码高亮插件有点问题，所以还是发个文件地址吧。 ng_http_memcached_module.c]]></description>
			<content:encoded><![CDATA[<p>发现SyntaxHighlighter这个代码高亮插件有点问题，所以还是发个文件地址吧。<br />
<a href='http://www.herbertyang.com/wp-content/uploads/2009/12/ng_http_memcached_module.c.txt'>ng_http_memcached_module.c</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2009/12/01/nginx-http-memcached-module.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>当负载过高时重启Apache</title>
		<link>http://www.herbertyang.com/2009/11/23/when-the-load-is-too-high-to-restart-apache.html</link>
		<comments>http://www.herbertyang.com/2009/11/23/when-the-load-is-too-high-to-restart-apache.html#comments</comments>
		<pubDate>Mon, 23 Nov 2009 05:30:27 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Load]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=452</guid>
		<description><![CDATA[最近半年碰到了几次，由于“蜘蛛”导致机器挂掉了，所以想出了这个方法，等系统负载过高的情况下，直接重启Apache。这就是Twitter提倡的那样，等进程杀死你之前，你先杀死他（原话不记得了）。其实这种方法早就在业界使用了。 来吧，看看我写的脚本。 checkload.sh #!/bin/sh TOP_SYS_LOAD_NUM=5 SYS_LOAD_NUM=`uptime &#124; awk '{print $(NF-2)}' &#124; sed 's/,//'` echo $(date +&#34;%y-%m-%d&#34;) `uptime` if [ `echo &#34;$TOP_SYS_LOAD_NUM &#60; $SYS_LOAD_NUM&#34;&#124;bc` -eq 1 ] then echo &#34;##&#34; $(date +&#34;%y-%m-%d %H:%M:%S&#34;) &#34;pkill httpd&#34; `ps -ef &#124; grep httpd &#124; wc -l` pkill httpd sleep 10 for i in 1 2 3 do if []]></description>
			<content:encoded><![CDATA[<p>最近半年碰到了几次，由于“蜘蛛”导致机器挂掉了，所以想出了这个方法，等系统负载过高的情况下，直接重启Apache。这就是Twitter提倡的那样，等进程杀死你之前，你先杀死他<em>（原话不记得了）</em>。其实这种方法早就在业界使用了。<br />
来吧，看看我写的脚本。<br />
<strong>checkload.sh</strong></p>
<pre class="brush: bash; title: ;">
#!/bin/sh
TOP_SYS_LOAD_NUM=5
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`

echo $(date +&quot;%y-%m-%d&quot;) `uptime`
if [ `echo &quot;$TOP_SYS_LOAD_NUM &lt; $SYS_LOAD_NUM&quot;|bc` -eq 1 ]
then
    echo &quot;##&quot; $(date +&quot;%y-%m-%d %H:%M:%S&quot;) &quot;pkill httpd&quot; `ps -ef | grep httpd | wc -l`
    pkill httpd
	sleep 10
	for i in 1 2 3
    do
		if [ `pgrep httpd | wc -l` -le 0 ]
		then
			/home/app/httpd/bin/apachectl start
			sleep 30
			echo &quot;##&quot; $(date +&quot;%y-%m-%d %H:%M:%S&quot;) &quot;start httpd&quot; `ps -ef | grep httpd | wc -l`
		fi
	done
else
	if [ `pgrep httpd | wc -l` -le 0 ]
	then
		/home/app/httpd/bin/apachectl start
		sleep 30
		echo &quot;##&quot; $(date +&quot;%y-%m-%d %H:%M:%S&quot;) &quot;start httpd&quot; `ps -ef | grep httpd | wc -l`
	fi
fi
</pre>
<p>然后在crontab里增加定时执行的命令</p>
<pre class="brush: bash; title: ;">*/2 * * * * (/root/checkload.sh &gt;&gt;/root/checkload.log)</pre>
<p>每两分钟检查一次系统负载。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2009/11/23/when-the-load-is-too-high-to-restart-apache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>key/value数据库</title>
		<link>http://www.herbertyang.com/2009/11/12/key-value-database.html</link>
		<comments>http://www.herbertyang.com/2009/11/12/key-value-database.html#comments</comments>
		<pubDate>Thu, 12 Nov 2009 08:24:33 +0000</pubDate>
		<dc:creator>Herbert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[key-value]]></category>

		<guid isPermaLink="false">http://www.herbertyang.com/?p=416</guid>
		<description><![CDATA[QDBM： NDBM : New DBM written by BSD SDBM : Substitute DBM written by Ozan S. Yigit GDBM : GNU Database Manager written by Philip A. Nelson et al TDB : Trivial Database written by Andrew Tridgell et al TinyCDB : Constant Database written by Michael Tokarev Berkeley DB : Berkeley DB written by Sleepycat]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.vivtek.com/gdbm/" target="_blank">QDBM</a>：<br />
NDBM : New DBM written by BSD<br />
SDBM : Substitute DBM written by Ozan S. Yigit<br />
GDBM : GNU Database Manager written by Philip A. Nelson et al<br />
TDB : Trivial Database written by Andrew Tridgell et al<br />
TinyCDB : Constant Database written by Michael Tokarev<br />
Berkeley DB : Berkeley DB written by Sleepycat Software</p>
]]></content:encoded>
			<wfw:commentRss>http://www.herbertyang.com/2009/11/12/key-value-database.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

