﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-neverend的日志</title><link>http://www.blogjava.net/neverend/</link><description>不记录，终将被遗忘。
一万年太久，只争朝夕。
他们用数字构建了整个世界。</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 22:27:43 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 22:27:43 GMT</pubDate><ttl>60</ttl><item><title>MySQL的一致性非阻塞读</title><link>http://www.blogjava.net/neverend/archive/2012/04/05/373357.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Thu, 05 Apr 2012 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/04/05/373357.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/373357.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/04/05/373357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/373357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/373357.html</trackback:ping><description><![CDATA[在事务隔离级别设定为repeatable read的情况下，一般的select语句采取的是一致性非阻塞读的方式。<br />一致性是指在事务的范围内读取的数据是可重现的，不会出现不可重复读的情况。非阻塞是指这种读取数据的模式不会对数据上任何一种锁，其它操作全都不会被阻塞。<br />在这种模式下，事务执行读取语句后，相关的数据会有一套副本出现，并会为这个数据副本附加一个时间戳，其它事务在这个时间戳之后执行的写操作都不会反映到这个副本中，这种机制被称之为多版本并发控制。<br />如果用select &#8230;&#8230; lock in share mode，则不是一致性非阻塞读，该语句会等待其它事务的写语句提交或回滚之后再读取数据；如果事务隔离级别设置为read committed，也不是一致性非阻塞读，该语句会读取其它事务提交的数据。<br /><img src ="http://www.blogjava.net/neverend/aggbug/373357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-04-05 11:25 <a href="http://www.blogjava.net/neverend/archive/2012/04/05/373357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql的锁机制解读</title><link>http://www.blogjava.net/neverend/archive/2012/03/31/373127.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Sat, 31 Mar 2012 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/03/31/373127.html</guid><description><![CDATA[介绍下对于Mysql锁机制的理解<br />从基本概念开始：<br />共享锁<br />共享锁的代号是S，是Share的缩写，共享锁的锁粒度是行或者元组（多个行）。一个事务获取了共享锁之后，可以对锁定范围内的数据执行读操作。 <br /><br />排它锁<br />排它锁的代号是X，是eXclusive的缩写，排它锁的粒度与共享锁相同，也是行或者元组。一个事务获取了排它锁之后，可以对锁定范围内的数据执行写操作。<br /><br />假设有两个事务t1和t2<br />如果事务t1获取了一个元组的共享锁，事务t2还可以立即获取这个元组的共享锁，但不能立即获取这个元组的排它锁（必须等到t1释放共享锁之后）。<br />如果事务t1获取了一个元组的排它锁，事务t2不能立即获取这个元组的排共享锁，也不能立即获取这个元组的排它锁（必须等到t1释放排它锁之后）。<br />&nbsp;<br />意向锁<br />意向锁是一种表锁，锁定的粒度是整张表，分为意向共享锁(IS)和意向排它锁(IX)两类。意向共享锁表示一个事务有意对数据上共享锁或者排它锁。&#8220;有意&#8221;这两个字表达的意思比较微妙，说的明白点就是指事务想干这个事但还没真去干。举例说明下意向共享锁，比如一个事务t执行了这样一个语句：select * from table <span style="color: red;">lock in share model</span> ，如果这个语句执行成功，就对表table上了一个意向共享锁。lock in share model就是说事务t1在接下来要执行的语句中要获取S锁。如果t1的select * from table <span style="color: red;">lock in share model</span>执行成功，那么接下来t1应该可以畅通无阻的去执行只需要共享锁的语句了。意向排它锁的含义同理可知，上例中要获取意向排它锁，可以使用select * from table <span style="color: red;">for update</span> 。<br /><div><br /><span>lock in share model 和 for update这两个</span><span>东西</span><span>在数据率理论中还有个</span><span>学名叫</span><span>悲观锁，与悲观锁相对的当然还有乐观锁。大家可以看到各种锁都是成双成对出现的。关于悲观锁和乐观锁的问题暂且不表，下文再来详述。 <br /></span></div><br /><span>锁的互斥与兼容关系</span><br />锁和锁之间的关系，要么是相容的，要么是互斥的。<br />锁a和锁b相容是指：操作同样一组数据时，如果事务t1获取了锁a,另一个事务t2还可以获取锁b；<br />锁a和锁b互斥是指：操作同样一组数据时，如果事务t1获取了锁a，另一个事务t2在t1释放锁a之前无法获取锁b。<br /><br />上面提到的共享锁、排它锁、意向共享锁、意向排它锁相互之前都是有兼容/互斥关系的，可以用一个兼容性矩阵表示(y表示兼容，n表示不兼容):<br />&nbsp;&nbsp;&nbsp; X&nbsp;&nbsp;&nbsp; S&nbsp;&nbsp;&nbsp; IX&nbsp;&nbsp;&nbsp; IS<br />X&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; n<br />S&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; y&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; y<br />IX n&nbsp;&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp; y&nbsp;&nbsp;&nbsp;&nbsp; y<br />IS n&nbsp;&nbsp;&nbsp;&nbsp; y&nbsp;&nbsp;&nbsp; y &nbsp; &nbsp; y&nbsp; <br /><br />兼容性矩阵为什么是这个样子的？<br />X和S的相互关系在上文中解释过了，IX和IS的相互关系全部是兼容，这也很好理解，因为它们都只是&#8220;有意&#8221;，还处于YY阶段，没有真干，所以是可以兼容的；<br />剩下的就是X和IX，X和IS, S和IX， S和IS的关系了，我们可以由X和S的关系推导出这四组关系。<br />简单的说：X和IX的=X和X的关系。为什么呢？因为事务在获取IX锁后，接下来就有权利获取X锁。如果X和IX兼容的话，就会出现两个事务都获取了X锁的情况，这与我们已知的X与X互斥是矛盾的，所以X与IX只能是互斥关系。其余的三组关系同理，可用同样的方式推导出来。<br /><br />一致性非阻塞读<br /><br />select... lock in share mode和select ... for update的区别<br /><br />索引记录锁<br /><div>间隙锁<br /> </div>后码锁<br /><br />各种语句对应的锁类型<br />在有索引的情况下是以后码锁为基础的行级锁，在固定索引键查找的情况下是索引记录锁，在没有可用索引的情况下上升到表锁<br />有索引的情况：<br />select ... from 一致性非阻塞读，不上锁。在serializable隔离级别下例外，在这个隔离级别下上共享后码锁<br />select ... from ... lock in share mode&nbsp; 共享后码锁 <br />select ... from ... for update 排它后码锁<br />update .... where&nbsp; 排它后码锁<br />delete from .... where 排它后码锁<br />insert ... 排它索引记录锁，如果发生键值唯一性冲突则转成共享锁<br />insert ... on duplicate key update ，一直都是排它锁<br />replace ... 一直都是排它锁<br /><br /><br />死锁情境分析<br /><br />MVCC的理论与实现<img src ="http://www.blogjava.net/neverend/aggbug/373127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-03-31 14:53 <a href="http://www.blogjava.net/neverend/archive/2012/03/31/373127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL查询优化</title><link>http://www.blogjava.net/neverend/archive/2012/03/13/371770.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Mon, 12 Mar 2012 23:48:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/03/13/371770.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/371770.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/03/13/371770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/371770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/371770.html</trackback:ping><description><![CDATA[1. 优化更需要优化的SQL<br />高并发低消耗 &gt; 低并发高消耗<br /><br />2. 定位性能瓶颈<br />profiling<br /><br />3. 明确的优化目标<br /><br />4. 从explain入手<br />y<br />5. 小结果集驱动大结果集？？<br />Join操作<br /><br />6. 在索引中完成排序<br /><br />7. 只取出自己需要的columns<br />MySQL有两种排序算法，尽可能使用只访问一次数据的算法。<br /><br />8. 仅仅使用最有效的过滤条件<br />索引键长度？<br /><br />9. 避免复杂的join和子查询<br /><br />充分利用EXPLAIN和profiling<br />profiling的使用： <br />1.set profiling = 1;<br />2.执行SQL;<br />3.show profile;<br />4.show profile [cpu, block io] for query [id];<br /><br />mysqlslap 测试sql性能<br /><div>mysqlslap --concurrency=5 --iterations=500 --query="selec<br />t * from hbe_hotel" --create-schema=phoenix -uroot -p</div><br />合理设计并使用索引<br />Mysql支持的索引类型：<br />1. B-tree索引 除了Archive的存储引擎都支持<br />2. Hash索引&nbsp; memory和NDB支持<br />3. Full-text索引 MyISAM，分词后建立B-tree索引<br />4. R-tree索引 MyISAM ，GIS系统使用 <br /><br />索引的利弊<br />利：提高数据检索效率和排序、分组效率<br />弊：加大更新操作的资源消耗，增加存储空间的消耗<br /><br />如何判断是否需要使用索引<br />1. 使用较频繁的字段应该创建索引<br />2. 唯一性太差的字段不建索引 经验值：15%<br />3. 更新非常频繁的字段不建索引<br />4. where子句中不出现的字段不建索引<br /><br />单键索引还是组合索引？<br />多方考虑，平衡优劣<br /><br />技术人员如何证明一个需求是否合理？<br />1. 每次PD提出新需求的时候，要求给出该项目预期收益的量化指标。<br />2. 在项目进行中，详细记录所有资源投入，包括人力、硬件等。<br />3. 项目上线后收集数据统计实际收益值。<br />4. 相关部门尽可能设计出项目投入/产出比率的计算规则，将投入/产出比公布给参与项目的所有人员。<br />5. 比较实际的投入/产出比与预期值，以判定项目做的是否值得。<br /><br /><img src ="http://www.blogjava.net/neverend/aggbug/371770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-03-13 07:48 <a href="http://www.blogjava.net/neverend/archive/2012/03/13/371770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL执行计划</title><link>http://www.blogjava.net/neverend/archive/2012/02/04/369381.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Sat, 04 Feb 2012 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/02/04/369381.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/369381.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/02/04/369381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/369381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/369381.html</trackback:ping><description><![CDATA[MySQL执行计划&nbsp;<br /><br />调用方式：<br />explain select ...<br /><br />explain&nbsp;extended select ...<br />show warnings 得到MySQL优化器优化后的查询语句<br /><br />执行计划包含的信息：<br /><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/neverend/图片1.png" width="724" height="52" /><br /><br />说明：<br />id： select子句的优先级，id越大，优先级越高。<br />select_type: 查询类型<br />table: 查询的表名<br />type:&nbsp; MySQL找到所需行使用的方式，包括如下类型：<br /><br /><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/neverend/图片2.png" width="512" height="53" /><br />ALL: 扫描全表<br />index:&nbsp;扫描全部索引树<br />range:&nbsp;扫描部分索引<br />ref: 非唯一性索引扫描<br />eq_ref：唯一性索引扫描<br />const, system: <span style="font-family: 宋体; color: black; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: zh-CN">当</span><span style="font-family: Arial; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-bidi-font-family: Arial; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">MySQL</span><span style="font-family: 宋体; color: black; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: zh-CN">对查询某部分进行优化，并转换为一个常量时，使用这些类型访问</span><br />NULL: <span style="font-family: Arial; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-bidi-font-family: Arial; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">MySQL</span><span style="font-family: 宋体; color: black; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: zh-CN">在优化过程中分解语句，执行时甚至不用访问表或索引</span><br /><br />rows: 找到所需记录需要读取的行数<br />Extra: 额外信息<br /><br />执行计划可用来分析select语句的性能，排查性能瓶颈。<br /><br />参考资料：<br /><a href="http://wenku.baidu.com/view/d4416c27aaea998fcc220ea7.html">http://wenku.baidu.com/view/d4416c27aaea998fcc220ea7.html</a><br /><br /><a href="/Files/neverend/mysqlexplain-MySQL执行计划解读.ppt">/Files/neverend/mysqlexplain-MySQL执行计划解读.ppt</a> <img src ="http://www.blogjava.net/neverend/aggbug/369381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-02-04 18:33 <a href="http://www.blogjava.net/neverend/archive/2012/02/04/369381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN代码merge</title><link>http://www.blogjava.net/neverend/archive/2012/02/04/369380.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Sat, 04 Feb 2012 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/02/04/369380.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/369380.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/02/04/369380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/369380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/369380.html</trackback:ping><description><![CDATA[头疼的SVN代码merge问题<br /><br />如何merge代码?<br />建议用命令搞merge，客户端图形界面不是很给力。<br />SVN 1.5以上版本，可以使用SVN的自动合并：<br />将主干合并到分支：<br />进入分支目录，执行命令： svn merge http://server/dir/trunk <br /><br />将分支合并到主干：<br />进入主干目录，执行命令： svn merge http://server/dir/branch&nbsp; --reintegrate<br />注： 如果之前进行过主干合并到分支的操作，请加参数--reintegrate，否则可能会有很多代码冲突出现。<br /><br />如果是SVN1.5以下版本，只能使用手工合并：<br /><div><pre><pre>进入主干目录，执行命令：svn merge -r version1:version2 http://server/dir/branch<br />将branch上从version1到version2所做的改动合并到主干，vension1 &lt; version2<br /><br />进入主干目录，执行命令： svn merge -c version1 http://server/dir/branch <br />表示将version1次所做的改动合并到主干<br /><br /></pre></pre></div>代码冲突如何解决？<br /><br />conficted<br /><br />tree conficted<img src ="http://www.blogjava.net/neverend/aggbug/369380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-02-04 18:13 <a href="http://www.blogjava.net/neverend/archive/2012/02/04/369380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven依赖冲突</title><link>http://www.blogjava.net/neverend/archive/2012/02/03/369327.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Fri, 03 Feb 2012 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/02/03/369327.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/369327.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/02/03/369327.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/369327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/369327.html</trackback:ping><description><![CDATA[<div>项目开发过程中经常会碰到maven依赖冲突的问题，这篇post整理下maven依赖冲突产生的原因以及解决方案<br /><br />maven依赖冲突的产生是由maven传递性依赖造成的：<br /><br />什么是maven传递依赖？<br />&#8220;一个传递性依赖就是对于一个依赖的依赖。如果project-a依赖于project-b，而后<br />者接着依赖于project-c，那么project-c就被认为是project-a的传递性依赖。如<br />果project-c依赖于project-d，那么project-d就也被认为是project-a的传递性依<br />赖。Maven的部分吸引力是由于它能够管理传递性依赖，并且能够帮助开发者屏蔽掉跟<br />踪所有编译期和运行期依赖的细节。你可以只依赖于一些包如Spring Framework，而不<br />用担心Spring Framework的所有依赖，Maven帮你自动管理了，你不用自己去详细了解<br />配置。<br />Maven是怎样完成这件事情的呢？它建立一个依赖图，并且处理一些可能发生的冲突和<br />重叠。例如，如果Maven看到有两个项目依赖于同样的groupId和artifactId，它会自动<br />整理出使用哪个依赖，选择那个最新版本的依赖。虽然这听起来很方便，但在一些边界<br />情况中，传递性依赖会造成一些配置问题。在这种情况下，你可以使用依赖排除。&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;摘自《Maven权威指南》<br /><br />什么情况下会产生依赖冲突？<br />举例说明：项目中的pom.xml里声明了对project-a1.0与project-b2.0的依赖，而project-a1.0又传递依赖于project-b1.0的版本。<br />假设maven经过分析之后决定使用project-b1.0的依赖，也就是打包的时候把project-b1.0.jar打进了war包。<br />war包部署在java容器中启动之后，如果依赖project-b2.0.jar中新添的类或方法，就会发现引用的类或者方法不存在。<br />这种现象就是依赖冲突。<br /><br />如何分析依赖冲突？<br />mvn dependency:tree<br /><br />冲突解决方案：<br />使用maven提供的&lt;exclusion&gt;标签。<br />举例说明：<br />如果你正依赖于一个类库，该类库又依赖于Sun JTA API，你会想要替换这个传递性依赖。<br />Hibernate是一个例子。Hibernate依赖于Sun JTA API，而后者在中央Maven仓库中不可用，因为它是不<br />能免费分发的。幸运的是，Apache Gernoimo项目创建了一些可以免费分发的独立实现<br />类库。为了用另外的依赖来替换这个传递性依赖，你需要排除这个传递性以依赖，然后<br />在你的项目中再声明一个依赖。下面展示了这样一个替换的样例。 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">dependency</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.hibernate</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">hibernate</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3.2.5.ga</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">exclusions</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">exclusion</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javax.transaction</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jta</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">exclusion</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">exclusions</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dependency</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">dependency</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.geronimo.specs</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">geronimo-jta_1.1_spec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1.1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dependency</span><span style="color: #0000ff">&gt;</span></div><br /><br /></div> <img src ="http://www.blogjava.net/neverend/aggbug/369327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-02-03 15:51 <a href="http://www.blogjava.net/neverend/archive/2012/02/03/369327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL死锁</title><link>http://www.blogjava.net/neverend/archive/2012/02/01/369197.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Wed, 01 Feb 2012 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/02/01/369197.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/369197.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/02/01/369197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/369197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/369197.html</trackback:ping><description><![CDATA[讨论MySQL死锁问题 <br /><br />死锁分析<br /><img src ="http://www.blogjava.net/neverend/aggbug/369197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-02-01 22:37 <a href="http://www.blogjava.net/neverend/archive/2012/02/01/369197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>缓存技术</title><link>http://www.blogjava.net/neverend/archive/2012/02/01/369196.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Wed, 01 Feb 2012 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2012/02/01/369196.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/369196.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2012/02/01/369196.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/369196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/369196.html</trackback:ping><description><![CDATA[总结缓存技术<img src ="http://www.blogjava.net/neverend/aggbug/369196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2012-02-01 22:36 <a href="http://www.blogjava.net/neverend/archive/2012/02/01/369196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Tomcat启动关闭管理脚本</title><link>http://www.blogjava.net/neverend/archive/2011/08/19/356907.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Fri, 19 Aug 2011 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2011/08/19/356907.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/356907.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2011/08/19/356907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/356907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/356907.html</trackback:ping><description><![CDATA[<p>先配置好环境变量$TOMCAT_HOME<br /><br />在/etc/init.d/目录下新建文件tomcat，输入如下内容：<br />#! /bin/sh<br /># This shell script enables the automatic use of tomcat<br />#<br /># Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; liuxuanyu&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#101;&#118;&#101;&#114;&#101;&#110;&#100;&#48;&#54;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">neverend06@163.com</a>&gt;<br /># </p>
<p>RETVAL=0</p>
<p>start() {<br />&nbsp;&nbsp;&nbsp; echo -n "Tomcat Starting..."<br />&nbsp;echo <br />&nbsp;$TOMCAT_HOME/bin/startup.sh<br />}</p>
<p>stop() {<br />&nbsp;&nbsp;&nbsp; echo -n "Tomcat Stop..."<br />&nbsp;echo <br />&nbsp;$TOMCAT_HOME/bin/shutdown.sh<br />}</p>
<p>restart() {<br />&nbsp;echo -n "Tomcat restart..."<br />&nbsp;echo <br />&nbsp;stop<br />&nbsp;start<br />}</p>
<p>case "$1" in<br />&nbsp;start)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start;;<br />&nbsp;stop)<br />&nbsp;&nbsp; stop;;<br />&nbsp;restart)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; restart;;<br />&nbsp;*) <br />&nbsp;&nbsp;&nbsp; echo $"Usage: $0 {start|stop|restart}"<br />&nbsp;exit 1<br />esac</p>
<p>exit $RETVAL<br /><br />使用方法：<br />sudo /etc/init.d/tomcat start<br />sudo /etc/init.d/tomcat stop<br />sudo /etc/init.d/tomcat restart</p><img src ="http://www.blogjava.net/neverend/aggbug/356907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2011-08-19 23:00 <a href="http://www.blogjava.net/neverend/archive/2011/08/19/356907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubntu下SVN的配置与基本命令</title><link>http://www.blogjava.net/neverend/archive/2011/08/15/356596.html</link><dc:creator>neverend</dc:creator><author>neverend</author><pubDate>Mon, 15 Aug 2011 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/neverend/archive/2011/08/15/356596.html</guid><wfw:comment>http://www.blogjava.net/neverend/comments/356596.html</wfw:comment><comments>http://www.blogjava.net/neverend/archive/2011/08/15/356596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/neverend/comments/commentRss/356596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/neverend/services/trackbacks/356596.html</trackback:ping><description><![CDATA[<div>以root用户登录<br />1.下载并安装SVN服务<br />$&nbsp; sudo apt-get install subversion<br />$&nbsp; sudo apt-get install libapache2-svn<br /><br />2.设置SVN用户组<br />$ sudo addgroup subversion<br />$ sudo usermod -G subversion -a root<br />注销后重新登录<br /><br />3.创建SVN目录<br />$ sudo mkdir /home/svn<br />$ cd /home/svn<br />$ sudo mkdir labproject<br />$ sudo chown -R root:subversion labproject<br /><br />4.创建 SVN 文件仓库：<br />$ sudo svnadmin create /home/svn/labproject<br />$ sudo chmod -R g+rws labproject<br /><br />5. 通过自带协议访问 svnserve 服务器<br />&nbsp;修改 /home/svn/labproject/conf/svnserve.conf 来配置其访问控制<br />&nbsp;取消一下配置项的注释<br />&nbsp;# [general]<br />&nbsp;# password-db = passwd<br />&nbsp;<br />&nbsp;在password文件中编辑账号和密码，格式如下<br />&nbsp;username=password<br />&nbsp;注意，以上两步操作行前不要留任何空白字符<br /><br />&nbsp;运行svnserve服务<br />&nbsp;sudo svnserve -d -r /home/svn/labproject<br />&nbsp;配置完成。<br />&nbsp;如果需要将svnserve设置成开机自动启动服务<br />&nbsp;可在/etc/rc.loacl文件中添加：<br />&nbsp;sudo svnserve -d -r /home/svn/labproject<br />&nbsp;<br />&nbsp;基本命令<br />&nbsp;访问SVN仓库：<br />&nbsp;$ svn co svn://hostname labproject --username user_name<br />&nbsp;新增文件test.c<br />&nbsp;$ svn add test.c<br />&nbsp;将文件test.c提交到服务器<br />&nbsp;$ svn commit -m "comment."<br />&nbsp;更新文件仓库<br />&nbsp;$ svn up<br /><br /></div><img src ="http://www.blogjava.net/neverend/aggbug/356596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/neverend/" target="_blank">neverend</a> 2011-08-15 23:46 <a href="http://www.blogjava.net/neverend/archive/2011/08/15/356596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>