??xml version="1.0" encoding="utf-8" standalone="yes"?>
׃ MySQL 本n的读写及锁定机制{方面的原因Q与一些其他数据库软g一P在特D情况下的极为频J读写时Q或在服务器掉电、死机等情况下,相关的数据文件可能会发生被损坏的情况Q通常可以采用以下的方式加以解冟?
一:repair.php 修复工具
Discuz! 自带了一个?PHP ~写的数据表修复工具 repair.phpQ虚拟主机用户也可用。该工具位于软g包的 ./utilities 目录中,使用旉要上传到服务器上论坛目录Q注意不要连 ./utilities 目录一起上传,否则无法q行Q,
upload.jpg
在浏览器q行后点M面的链接卛_
run.jpg
修复以后如果出现下面的画面表CZ复成?!!
result.jpg
q个工具能修复大多数常见的数据库错误Q尤其是错误号ؓ 126?27 的错误,?145 错误也可修复Q同时能Ҏ据表在修复之后进行优化。如果一ơ修复不成功Q可以尝试多ơ,或将数据库重启后再试?
?:myisamchk 修复工具
MySQL 自带了专门用h据表查和修复的工具——myisamchkQ当 repair.php 多次修复均无法成功时Q可以在服务器终端?myisamchk q行修复。在 MySQL 的程序文件目录(见《数据备份与恢复》中的说明)可以扑ֈq个工具?
常用的修复命令ؓ myisamchk -r 数据文g目录/数据表名.MYIQ如?-r 参数不能奏效Q可以先把数据文件备份(备䆾可用直接文件复制的方式Q详见《数据备份与恢复》中的说明)后?-o 参数,如果-oq不可以的话,׃?f参数,如果q是无法修复,只有使用你的备䆾文g来恢复数据了!什??你没有备份文?img title="点击囄可在新窗口打开" style="cursor: pointer" src="http://www.discuz.net/images/smilies/shocked.gif" align="absMiddle" border="0" alt="" />那你坐到那里哭?!开个玩W?但是|站及时的做备䆾实是很重要?其当有一定的规模以后,每天都做备䆾!!
下面说一下具体的步骤:
1.
cmd.jpg
2.更改当前目录到mysql/bin下面,一般情况下只有在这个下面才能运行myisamchk命o
myisamchk.jpg
3.修复的结?如果修复后的情况都如下图所C的?你就可以?成功?l箋开启你的网?q行?!
theresult.jpg
4.别忘了启动你的mysql,要不你的|站q是q行不v?
startmysql.jpg
ps:下面l的一个是linux下面的修复方?和上面的基本相同.只是linux下面关闭和启动mysql的方法和windows的不?一般情况下linux?br />
linux.jpg
另外 MySQL 官方文档中还提供了针对上面操作均无法奏效时的Ҏ办法Q如先清I重建数据表Q然后再用备份的数据文g覆盖{,q种特别复杂的情는户通常不会到Q因此这里不再做q于深入的研I?
?数据表经常性损坏的解决Ҏ
--------------------------------------------------------------------------------
首先L认在服务器硬件不存在问题Q如内存工作不稳定、散热条件不好等Q,且用中的操作系l版本也没有相关?BUG 报告或升U补丁。这U情况下Q如果数据库仍出现经常性的损坏Q请查是?MySQL 的编译方式或参数存在问题。通常情况下用官Ҏ供的~译好的版本是比较稳定的Q可以长期用。如果您钟爱自行~译相关E序Q请认您的语言~译器(?gccQ和配置的相兛_数没有导致不E_的因素。同Ӟ盘分区满也可能是导致数据表l常性损坏的原因。网上提供了一些问题的处理ҎQ英文)Q需要时可多参考,qҎ的具体服务器环境制定解决Ҏ?/font>
]]>
?/font>于断甉|非正常关导致MySQL数据库出现错误是非常常见的问题。有两种ҎQ一U方法用mysql的check table和repair table 的sql语句Q另一U方法是使用MySQL提供的多个myisamchk, isamchk数据恢复工兗前者用v来比较简ѝ推荐用?br />
1. check table ?nbsp;repair table
登陆mysql l端Q?br />
mysql -uxxxxx -p dbname
> check table tabTest;
如果出现的结果说Status是OKQ则不用修复Q如果有ErrorQ可以用Q?br />
> repair table tabTest;
q行修复Q修复之后可以在用check table命o来进行检查。在新版本的phpMyAdmin里面也可以用check/repair的功能?br />
2. myisamchk, isamchk
其中myisamchk适用于MYISAMcd的数据表Q而isamchk适用于ISAMcd的数据表。这两条命o的主要参数相同,一般新的系l都使用MYISAM作ؓ~省的数据表cdQ这里以myisamchkZ子进行说明。当发现某个数据表出现问题时可以使用Q?br />
myisamchk tablename.MYI
q行,如果需要修复的话,可以使用Q?br />
myisamchk -of tablename.MYI
关于myisamchk的详l参数说明,可以参见它的使用帮助。需要注意的时在q行修改时必ȝ保MySQL服务器没有访问这个数据表Q保险的情况下是最好在q行时把MySQL服务器Shutdown掉?br />
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />
另外可以把下面的命o攑֜你的rc.local里面启动MySQL服务器前Q?br />
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中?tmp/mysql.sock是MySQL监听的Sock文g位置Q对于用RPM安装的用户应该是/var/lib/mysql/mysql.sockQ对于用源码安装则?tmp/mysql.sock可以Ҏ自己的实际情况进行变_而pathtochk则是myisamchk所在的位置QDATA_DIR是你的MySQL数据库存攄位置?br />
需要注意的Ӟ如果你打把q条命o攑֜你的rc.local里面Q必ȝ认在执行q条指o时MySQL服务器必L有启动!
修复所有数据库(?
mysqlcheck -A -o -r -p
---------------------------------------------------------------------------------
CZ:
mysql> check table tabFTPAccountInstances;
</project>
http://www.onjava.com/pub/a/onjava/excerpt/javaian5_chap04/index.html
q个是JDK 1.5 的新Ҏ?br />
举个例子?nbsp;
一个列表中加入3个数字,然后从列表中取出作合计的操作?
JDK 1.4 的时?
List testList = new ArrayList();
testList.add(new Integer(100));
testList.add(new Integer(200));
testList.add(new Integer(300));
int result = 0;
for(int i = 0; i < testList.size(); i ++) {
// q里从列表中取数据时Q需要强制{换?
result += (Integer)testList.get(i).intValue();
}
System.out.println(result);
JDK 1.5 的时?
List <Integer> testList = new ArrayList <Integer> ();
// 注意QJDK1.5?nbsp; int ?nbsp; 100Q能够自动的转换?nbsp; Integer cd。不强制要求 new Integer(100)
testList.add(100);
testList.add(200);
testList.add(300);
int result = 0;
for(int i = 0; i < testList.size(); i ++) {
// q里从列表中取数据时Q不需要强制{换?
result += testList.get(i).intValue();
}
System.out.println(result);
cherami
JUnit是一个开发源代码的Java试框架Q用于编写和q行可重复的试。他是用于单元测试框架体pxUnit的一个实例(用于java语言Q。它包括以下Ҏ:
1、用于测试期望结果的断言QAssertionQ?br />
2、用于共享共同测试数据的试工具
3、用于方便的l织和运行测试的试套g
4、图形和文本的测试运行器
JUnit最初是由Erich GammaQGoF之一Q和Kent BeckQxp和refactor的先׃一Q编写的.
需要说明的是junit一般是用来q行单元试的,因此需要了解被试代码的内部结构(x谓的白盒试Q,另外junit是在xp~程和重构(refactorQ中被极力推荐用的工具Q因为在实现自动单元试的情况下可以大大的提高开发的效率Q但是实际上~写试代码也是需要耗费很多的时间和_֊的,那么使用q个东东好处到底在哪里呢Q笔者认为是q样的:
1、对于xp~程而言Q要求在~写代码之前先写试Q这样可以强制你在写代码之前好好的思考代码(ҎQ的功能和逻辑Q否则编写的代码很不E_Q那么你需要同时维护测试代码和实际代码Q这个工作量׃大大增加。因此在xp~程中,基本q程是这LQ构思-》编写测试代码-》编写代码-》测试,而且~写试和编写代码都是增量式的,写一Ҏ一点,在编写以后的代码中如果发现问题可以较块的q踪到问题的原因Q减回归错误的U错隑ֺ
2、对于重构而言Q其好处和xp~程中是cM的,因ؓ重构也是要求改一Ҏ一点,减少回归错误造成的时间消耗?br />
3、对于非以上两种情况Q我们在开发的时候用junit写一些适当的测试也是有必要的,因ؓ一般我们也是需要编写测试的代码的,可能原来不是使用的junitQ如果用junitQ而且针对接口Q方法)~写试代码会减以后的l护工作Q例如以后对Ҏ内部的修改(q个是相当于重构的工作了)。另外就是因为junit有断a功能Q如果测试结果不通过会告诉我们那个测试不通过Qؓ什么,而如果是想以前的一般做法是写一些测试代码看其输出结果,然后再由自己来判断结果用正,使用junit的好处就是这个结果是否正的判断是它来完成的Q我们只需要看看它告诉我们l果是否正确可以了Q在一般情况下会大大提高效率?/p>
JUnit入门
cherami 整理
安装JUnit
安装很简单,先到以下地址下蝲一个最新的zip包:
http://download.sourceforge.net/junit/
下蝲完以后解压羃C喜欢的目录下Q假设是JUNIT_HOMEQ然后将JUNIT_HOME下的junit.jar包加C的系l的CLASSPATH环境变量中,对于IDE环境Q对于需要用到的junit的项目增加到lib中,其设|不同的IDE有不同的讄Q这里不多讲?/p>
如何使用JUnit写测试?
最单的范例如下Q?br />
1、创Z个TestCase的子c?
package junitfaq;
import java.util.*;
import junit.framework.*;
public class SimpleTest extends TestCase {
public SimpleTest(String name) {
super(name);
}
2、写一个测试方法断a期望的结果:
public void testEmptyCollection() {
Collection collection = new ArrayList();
assertTrue(collection.isEmpty());
}
注意QJUnit推荐的做法是以test作ؓ待测试的Ҏ的开_q样q些Ҏ可以被自动找到ƈ被测试?/p>
3、写一个suite()ҎQ它会用反动态的创徏一个包含所有的testXxxxҎ的测试套Ӟ
public static Test suite() {
return new TestSuite(SimpleTest.class);
}
4、写一个main()Ҏ以文本运行器的方式方便的q行试Q?br />
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
}
5、运行测试:
以文本方式运行:
java junitfaq.SimpleTest
通过的测试结果是Q?/p>
.
Time: 0
OK (1 tests)
Time上的点表示试个数Q如果测试通过则显COK。否则在点的后Ҏ上FQ表C试p|?br /> 每次的测试结果都应该是OK的,q样才能说明试是成功的Q如果不成功p马上Ҏ提示信息q行修正了?br /> 如果JUnit报告了测试没有成功,它会区分p|QfailuresQ和错误QerrorsQ。失败是你的代码中的assertҎp|引v的;而错误则是代码异常引LQ例如ArrayIndexOutOfBoundsException?
以图形方式运行:
java junit.swingui.TestRunner junitfaq.SimpleTest
通过的测试结果在囑Ş界面的绿色条部分?/p>
以上是最单的试样例Q在实际的测试中我们试某个cȝ功能是常帔R要执行一些共同的操作Q完成以后需要销毁所占用的资源(例如|络q接、数据库q接Q关闭打开的文件等Q,TestCasecȝ我们提供了setUpҎ和tearDownҎQsetUpҎ的内容在试你编写的TestCase子类的每个testXxxxҎ之前都会q行Q而tearDownҎ的内容在每个testXxxxҎl束以后都会执行。这个既׃n了初始化代码Q又消除了各个测试代码之间可能生的怺影响?
JUnit最佛_?
Martin Fowler说过Q?#8220;当你试图打印输出一些信息或调试一个表辑ּӞ写一些测试代码来替代那些传统的方法?#8221;一开始,你会发现你L要创Z些新的FixtureQ而且试g使你的编E速度慢了下来。然而不久之后,你会发现你重复用相同的FixtureQ而且新的试通常只涉及添加一个新的测试方法?nbsp;
你可能会写许多测试代码,但你很快׃发现你设惛_的测试只有一部分是真正有用的。你所需要的试是那些会p|的测试,即那些你认ؓ不会p|的测试,或你认ؓ应该p|却成功的试?
我们前面提到q测试是一个不会中断的q程。一旦你有了一个测试,你就要一直确保其正常工作Q以验你所加入的新的工作代码。不要每隔几天或最后才q行试Q每天你都应该运行一下测试代码。这U投资很,但可以确保你得到可以信赖的工作代码。你的返工率降低了,你会有更多的旉~写工作代码?
不要认ؓ压力大,׃写测试代码。相反编写测试代码会使你的压力逐渐减轻Q应为通过~写试代码Q你对类的行为有了确切的认识。你会更快地~写出有效率地工作代码?/p>
下面是一些具体的~写试代码的技巧或较好的实跉|法:
1. 不要用TestCase的构造函数初始化FixtureQ而要用setUp()和tearDown()Ҏ?
2. 不要依赖或假定测试运行的序Q因为JUnit利用Vector保存试Ҏ。所以不同的q_会按不同的顺序从Vector中取出测试方法?
3. 避免~写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,׃要提交交易数据。简单的会滚可以了?
4. 当承一个测试类Ӟ记得调用父类的setUp()和tearDown()Ҏ?
5. 测试代码和工作代码攑֜一P一边同步编译和更新。(使用Ant中有支持junit的task.Q?
6. 试cd试Ҏ应该有一致的命名Ҏ。如在工作类名前加上test从而Ş成测试类名?
7. 保试与时间无养I不要依赖使用q期的数据进行测试。导致在随后的维护过E中很难重现试?
8. 如果你编写的软g面向国际市场Q编写测试时要考虑国际化的因素。不要仅用母语的Localeq行试?
9. 可能地利用JUnit提供地assert/failҎ以及异常处理的方法,可以使代码更为简z?br />
10.试要尽可能地小Q执行速度快?/p>
JUnit和antl合
cherami 转脓
ant 提供了两?target Q?junit ?junitreport
q行所?试用例 Qƈ生成 html 格式的报?
具体操作如下Q?
1.?junit.jar 攑֜ ANT_HOME\lib 目录?
2.修改 build.xml Q加入如?内容Q?
<property name="report" value="report" /> <target name="junitreport" depends="clean, compile"> <junit printsummary="on" fork="true" haltonfailure="false" failureproperty="tests.failed" showoutput="true"> <classpath refid="myclasspath"/> <formatter type="xml"/> <batchtest todir="${report}"> <fileset dir="${build}"> <include name="**/*Test.*"/> </fileset> </batchtest> </junit> <junitreport todir="${report}"> <fileset dir="${report}"> <include name="TEST-*.xml"/> </fileset> <report format="frames" todir="${report}"/> </junitreport> <fail if="tests.failed"> --------------------------------------------------------- One or more tests failed, check the report for detail... --------------------------------------------------------- </fail> </target>
q行 q个 target Qant 会运行每?TestCase
?report 目录下就有了 很多 TEST*.xml ?一些网?
打开 report 目录下的 index.html 可以看到很直观的测试运行报告,一目了然?
本文来自: 中国自学~程|?www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/rjgc/1414044315681.htm