发那科机器人培训教材home line 0 T1 aborted4怎怎么处理

Access denied |
used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website () has banned your access based on your browser's signature (3b0371efd03e1e77-ua98).To&install:
-&SDK&Patch&Applier&v4&(patcher;v4)
-&Google&Repository&(extras;m2repository)
Installing&SDK&Patch&Applier&v4
Downloading&/android/repository/3534162-studio.sdk-patcher.zip
Installing&SDK&Patch&Applier&v4&in&/Users/you/Library/Android/sdk/patcher/v4
Installation&of&SDK&Patch&Applier&v4&complete.
Installing&Google&Repository
Downloading&/android/repository/google_m2repository_gms_v8_rc42_wear_2b1_rc4.zip
Installing&Google&Repository&in&/Users/you/Library/Android/sdk/extras/google/m2repository
Installation&of&Google&Repository&complete.
/questions//add-google-maps-api-v2-in-a-fragment
/articles/google/android/application-development/android-os-add-googlemap-as-fragment.html
/question/http://blog.csdn.net/woshilisao/article/details/8647649
android fragment(android.support.v4.app.Fragment和android.app.Fragment区别)
/articles/YFBv6nJ Introduction to Google Maps API for Android
/lzyzsd/JsBridge &注意:使用lzyzsd/JsBridge &,覆盖WebViewClient时一定要继承BridgeWebViewClient,否则js和java互相调用不管用webview.setWebViewClient(new BridgeWebViewClient(webview) 另外还有一个WebViewJavascriptBridge:/gzsll/WebViewJavascriptBridge/wingyip/p/5426477.html JsBridge实现Javascript和Java的互相调用http://blog.csdn.net/sk/article/details/&&Android 利用WebViewJavascriptBridge 实现js和java的交互http://www.jb51.net/article/37208.htm Android在其他线程中更新UI线程的解决方法
向下一个Activity传递数据(使用Bundle和Intent.putExtras)Intent it = new Intent(Activity.Main.this, Activity2.class);Bundle bundle=new Bundle();bundle.putString("name", "This is from MainActivity!");it.putExtras(bundle); & & & // it.putExtra("name","abc");startActivity(it); & & & & & &// startActivityForResult(it,REQUEST_CODE);&对于数据的获取可以采用:Bundle bundle=getIntent().getExtras();String name=bundle.getString("name");参考:/feisky/archive//1649081.html/tornadomeet/archive//2613617.html 从一个activity跳转到另外一个activity
buildTypes {
minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}将minifyEnabled改为true。ProGuard是Android SDK附带的。如果需要顶尖的安全性,ProGuard就力不从心了,可以使用DexGuard。参考:读懂 Android 中的代码混淆 /blog//understanding-android-obfuscated-code-by-proguard/
requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);增加代码requestWindowFeature(Window.FEATURE_NO_TITLE)以去掉标题栏,并且代码放在setContentView之前,但还是报异常android.util.AndroidRuntimeException: requestFeature() must be called before adding content将AppCompatActivity改为Activity才得以解决。不知道AppCompatActivity和Activity有何区别。参考:/and_he/archive//2067106.html Android中全屏或者取消标题栏
&首先在“设置”-“关于手机”里多次点击【MIUI版本】进入开发者模式,但在Android Studio里运行时找不到设备,执行adb devices也看不到设备。在拨号界面按 &*#*#717717#*#* &, 出现 Diag USB port enable。 再次执行adb devices,看到设备了,但显示为unauthorized。最后发现,设置-其他高级设置-开发者选项,开启“开发者选项”,同时开启“USB调试”,再次执行adb devices,终于成功的显示设备了。&
1.public boolean shouldOverrideUrlLoading(WebView view, String url) {&
&&&&&& view.loadUrl(url);
重写shouldOverrideUrlLoading方法,返回true表示点击链接是在当前webview里打开,而不是调用浏览器打开
WebViewClient与WebChromeClient的区别 http://blog.csdn.net/jackyhuangch/article/details/8310033Android中WebView拦截替换网络请求数据/blog//block-web-resource-in-webview//a/anzhuokaifa/androidkaifa/69.html android WebView全面总结自定义可下拉刷新的WebView /blog/Moy01/article/p-4587219.htmlandroid webview远程调试/carlos-guo/p/3920915.html/item/13349.html &WebView处理网页位置请求/over140/archive//2947721.html 带进度条的webviewhttp://blog.csdn.net/u/article/details/ webview处理视频http://blog.csdn.net/jackyhuangch/article/details/8310033&关于android WebViewClient和WebChromeClienthttp://www.weblog-life.net/entry//080300 webview如何使用google地图,日本人写的/questions/5329662/android-webview-geolocation &/delight-im/Android-AdvancedWebView 这个支持地理定位
1. Android Studio2.2在mac下启动报错
找不到原因,改为使用Android Studio 2.1.3
下载地址:/download/studio/builds/2-1-3
2. 编译某项目报错Could not find property 'config' on SigningConfig container
在build.grade文件的android-&signingConfigs节点下增加config配置
& & signingConfigs {
& & & & config {
& & & & & & keyAlias '你的key别名'
& & & & & & keyPassword '你的key密码'
& & & & & & storeFile file('你的密钥存储路径')
& & & & & & storePassword '你的存储密码'
3. 编译报错failed to find target android-22
/Users/username/Library/Android/sdk/platforms下发现有android-24目录,故将编译级别都设为24。
修改build.grade文件的相关属性:
compileSdkVersion 24
buildToolsVersion "24.0.0"
targetSdkVersion 24
compile 'com.android.support:appcompat-v7:24.0.0'
4. 编译报错Gradle sync failed: Gradle DSL method not found: 'android()'
删除项目根目录下的build.gradle文件,因为app目录下已经有build.gradle了。
备份下根目录下build.gradle文件的内容:
buildscript {
& & repositories {
& & & & jcenter()
& & dependencies {
& & & & classpath 'com.android.tools.build:gradle:1.2.3'
& & & & // NOTE: Do not place your applicati they belong
& & & & // in the individual module build.gradle files
allprojects {
& & repositories {
& & & & jcenter()
& & compileSdkVersion 24
dependencies {
5. 编译报错Plugin with id 'com.android.application' not found
恢复项目根目录下的build.gradle文件,将内容修改为如下:
buildscript {
& & repositories {
& & & & mavenCentral()
& & dependencies {
& & & & classpath 'com.android.tools.build:gradle:1.2.3'
6. 编译报错:failed to find Build Tools revision 24.0.0
/Users/username/Library/Android/sdk/build-tools下查看自己的BuildTools版本,发现是24.0.3,然后将buildToolsVersion修改为该版本:
buildToolsVersion "24.0.3"
7. Android Studio编译执行以下任务时一直等待,执行了一个小时也没动静。
Executing tasks: [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:prepareDebugUnitTestDependencies, :app:mockableAndroidJar]
打开Preferences-&Build-Excecution-Deployment-&BuildTools-&Gra‌​dle,勾选Offline work
参见/questions//how-to-fix-android-studio-getting-stuck-executing-gradle-tasks
8. Exception in thread "png-cruncher_5" java.lang.RuntimeException: Timed out while waiting for slave aapt process
不知道原因,最终是通过修改SDK Build Tools为19.1.0、升级JDK由JDK7升至JDK8、增加环境变量SLAVE_AAPT_TIMEOUT=30等搞定的
9. 如何修改SDK和JDK的路径
在File-&Project Structure里修改
10. 修改Android Studio中java代码的编译级别
打开File --& Project Structure--&app,修改Source Compatibility和Target Compatibility
11.如何在使用gradle时增加--stacktrace参数
Preferences-&Build-Excecution-Deployment-&Compiler
增加--info或--debug,在解决报错时能看到更多的信息
12. 报错aapt ..finished with non- zero exit value 1
找不到原因,增加编译参数--info后发现有用的信息:invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn
13.invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn
不知道原因,将版本升级到21解决了。
14. 编译时报找不到AppCompatActivity类的错误
改为使用:compile 'com.android.support:appcompat-v7:22.2.1'
同时将版本由21升级到22
15. 生成apk时报错:Missing Gradle Project Information. Please check if the IDE successfully synchronized its state with the Gradle Project Model
在工具栏里点击“Sync Project with Gradle Files”按钮16.导入某项目时报错Error:Gradle version 2.14.1 is required. Current version is 2.4. If using the gradle wrapper, try editing the distributionUrl in...打开Android Studio的File-&Project Structure,点击Project,将Gradle version修改为2.14.1在/Applications/Android Studio.app/Contents/gradle下的确只有gradle-2.14.1
25.如何修改生成的apk的名字
Android Studio如何发布APK:/blog/1889160
26. 在gradle.properties中增加android.enableBuildCache=true,貌似能加快编译速度。
参考dubbo里的NetUtils类import java.net.InetAimport java.net.NetworkIimport java.util.Eimport java.util.regex.Ppublic class GetIP {public static void main(String[] args) {System.out.println(GetIP.getLocalAddress0().getHostAddress());}public static InetAddress getLocalAddress0() {
InetAddress localAddress =
localAddress = InetAddress.getLocalHost();
if (isValidAddress(localAddress)) {
return localA
} catch (Throwable e) {
System.out.println("Failed to retriving ip address, " + e.getMessage());
Enumeration&NetworkInterface& interfaces = NetworkInterface.getNetworkInterfaces();
if (interfaces != null) {
while (interfaces.hasMoreElements()) {
NetworkInterface network = interfaces.nextElement();
Enumeration&InetAddress& addresses = network.getInetAddresses();
if (addresses != null) {
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (isValidAddress(address)) {
} catch (Throwable e) {
System.out.println("Failed to retriving ip address, " + e.getMessage());
} catch (Throwable e) {
System.out.println("Failed to retriving ip address, " + e.getMessage());
} catch (Throwable e) {
System.out.println("Failed to retriving ip address, " + e.getMessage());
System.out.println("Could not get local host ip address, will use 127.0.0.1 instead.");
return localA
private static boolean isValidAddress(InetAddress address) {
if (address == null || address.isLoopbackAddress())
String name = address.getHostAddress();
return (name != null
&& ! ANYHOST.equals(name)
&& ! LOCALHOST.equals(name)
&& IP_PATTERN.matcher(name).matches());
public static final String LOCALHOST = "127.0.0.1";
public static final String ANYHOST = "0.0.0.0";
private static final Pattern IP_PATTERN = pile("\\d{1,3}(\\.\\d{1,3}){3,5}$");}
CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。
CyclicBarrier
: N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。CyclicBarrier 在释放等待线程后可以重用,所以称它为循环的 barrier。它 还支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。public class Test {
public static void main(String[] args) {
new Test().test1();
public void test1() {
CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
@Override
public void run() {
System.out.println("所有玩家进入第二关!");
for (int i = 0; i & 4; i++) {
new Thread(new Player(i, cyclicBarrier)).start();
class Player implements Runnable {
private CyclicBarrier cyclicB
public Player(int id, CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicB
@Override
public void run() {
System.out.println("玩家" + id + "正在玩第一关...");
cyclicBarrier.await();
System.out.println("玩家" + id + "进入第二关...");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
Runtime run = Runtime.getRuntime();String str[] = { "/bin/sh", "-c", "echo '1' && test.log" };try {
run.exec(str);} catch (IOException e) {}使用Jsch执行Shell脚本 [http://blog.csdn.net/basecn/article/details/6080741]纯Java通过SSH执行Linux命令的方法及代码 [http://ilexes./352]Java调用 Shell的ftp命令 [.cn/s/blog_59ca2c2a0100e9vn.html]
1. java.lang.OutOfMemoryError: GC overhead limit exceeded原因
&http://blog.csdn.net/taijianyu/article/details/6606792&
&/page/M0/S746/746195.html&
2. 用jhat分析·jmap -dump:format=b,file=mem.dat PID·命令导出来的文件时报错
java.io.IOException: Unrecognized magic number
&/forums/thread.jspa?threadID=1542284& 没找到原因
1. jmap jmap -dump:live,format=b,file=heap.dmp PID 把本机的java内存映像导出到heap.dmp中 jmap pid #打印内存使用的摘要信息
jmap –heap pid #java heap信息
jmap -histo:live pid #统计对象count ,live表示在使用
jmap -histo pid &mem.txt #打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件
jmap -dump:format=b,file=mem.dat PID #将内存使用的详细情况输出到mem.dat 文件
2. jhat 用来分析jmap导出的文件
用jhat命令可以参看 jhat -port 7000 mem.dat
然后使用:http://127.0.0.1:7000/ 查看类相关信息
jstat -gcutil
— Heap上的 Survivor space 0 区已使用空间的百分比
— Heap上的 Survivor space 1 区已使用空间的百分比
— Heap上的 Eden space 区已使用空间的百分比
— Heap上的 Old space 区已使用空间的百分比
— Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)###参考1. [JMAP、jstat命令详解](http://bbs.chinaunix.net/thread--1.html)2. [J2SE6中使用jhat来分析内存堆](/tister/item/cf433a176eb9)###jvm的内存回收过程是这样的对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到Permanent Generation。
JavaMelody 能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、Guice)的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。 jwebap 监控mons.dbcp.BasicDataSource时不知效果如何JAMonhyperic hq probe
http://www.lambdaprobe.org/downloads/1.7/probe.1.7b.zip 项目自动化之道—如何建构、部署、监控JAVA应用.pdfhttp://chain./blog/static//
java使用java.lang.management监视和管理Java虚拟机 String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();System.out.println(processName.split("@")[0]);//进程IDhttp://chain./blog/static/2/ java通过调用命令获取linux CPU、内存、磁盘信息
如果报Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll的错误,可把jdk下的jre\bin\server下的server文件夹复制到C:\Program Files\Java\jre6\bin目录即可解决。
根本原因可看[JVM的版本问题](/newskysoft/archive//1718720.html)
在notepad++里查看二进制有三种办法:“插件”菜单里有个Converter,TextFX插件也有Convert功能,甚至还有一个在新版本好像已经被废弃的Hex Editor插件,但这些都不好用。[HxD](http://mh-nexus.de/en/hxd/)是一个免费的二进制编辑软件,但中文支持不好。MadEdit是一款跨平台的编辑器,用其进行二进制编辑的体验相当好,不管是GBK还是UTF-8的中文都能正常显示,选中某个中文其对应的字节会高亮显示。不知道在mac下效果如何。
最近Web服务访问量过大,由于服务器配置比较差,数量也较少,导致服务响应过慢。为了优化服务和提高响应,下面总结出几条查询Resin问题的方法。1、查看服务器网络状态TIME_WAIT的数量。#netstat -antp|grep -i time_wait|wc -l查看TIME_WAIT数量,如果数量过多,并且Resin前端还有Nginx或者Apache,那么请把socket-timeout、keepalive-max和把keepalive-timeout调小
&socket-timeout&30s&/socket-timeout&
&keepalive-max&512&/keepalive-max&
&keepalive-timeout&60s&/keepalive-timeout&2、查看JVM中对象占用内存情况
jmap 能查看jvm内存中,对象占用内存的情况,还提供非常方便的命令将jvm的内存信息导出的文件。#jmap -dump:format=b,file=heap.bin &pid&
命令jhat 能够解析 java内存堆的文件,生成相关信息,并启动webServer提供查询。 也就说,我们可以通过浏览器来看这些内存信息。jhat还提供了一个类sql的查询语言---OQL来给我们使用。#jhat -J-Xmx512m heap.bin
就可以将我们刚刚使用jmap导出的内存信息交给jhat解析了。默认的情况下,它会监听7000端口。我在本机的地址就是,http://localhost:7000/。
访问http://localhost:7000/histo/,大致可以看到一下的画面,这里列出对象,对象实例数量、总占用内存大小。点击进去之后可以看到“谁引用了这个对象,这个对象又引用了哪个”这些信息。不过因为展示的信息非常多,并没有想象中那样清晰可见。3、dump获取java stack和native stack信息消息队列会突然堵塞,查看消费者日志,发现处理延时明显延长,而此时网络无丢包。最后多方排查,是java消费者运行出现死锁。
这种问题可以通过jstack来dump获取java stack和native stack信息查明问题。#jstatck &pid&
slideViewer:http://www.gcmingati.net/wordpress/wp-content/lab/jquery/imagestrip/imageslide-plugin.htmlslideViewerPro:Prohttp://www.gcmingati.net/wordpress/wp-content/lab/jquery/svwt/index.htmlslideViewerPro使用配置说明 http://www.oschina.net/p/slideviewerprotype="text/javascript"var theLinks;var nCount =0;var theTimerID;function init(){
$("div#mygalone").slideView();
theLinks = jQuery('#stripTransmitter0 a');
//for kill interval purposes
theTimerID = setInterval("autoSlide()",5000);}function autoSlide(){
jQuery.each(theLinks,function(i){
if(jQuery(this).hasClass('current')){
jQuery(theLinks[((i+1& theLinks.length)?(i+1):0)]).trigger("click");
returnfalse;
});}$(window).bind("load", init );The way I see it you basically have 3 options here:(1) - Use slideViewPro, but disable thumbnails using the thumbsVis:false option as shown below$("div#noui").slideViewerPro({
galBorderWidth:0,
autoslide:true,
thumbsVis:false,
shuffle:true });(2) - Switch to using the
instead(3) - Edit the source code of original slideViewer and add your own autoslide implementation by using timers and firing the click event on the navigation.
转自 朋友打来电话,他们公司新装了TOMCAT5,然后在编译JSP时,被INCLUDE的JSP都出现了问题.就是编译后被INCLUDE的地方多了两个"??"而其它正常,而如果手工把被INCLUDE的内容COPY上去测没有问题.
他们的工程师都不知道是什么问题,因为周一要发布出去,所以非常着急.
我不知道大家听到这种情况会如何,我知道大多数人比我聪明,你肯定想到了,所以你没有必要再看了.我下面的内容只是对没有想到的人而言.
其实他电话还没打完 ,我就知道问题99%是他的jsp在编辑的时候是存为UTF-8而不是ANSI格式,否则没有道理出现这种问题,事实正是如此,我让他用UE打开看看果然前面多了几个UTF字符.
重要的是TOMCAT这种容器竟然有这样的BUG,不能正确读取UTF-8格式的文件,你总不能强求用户编辑JSP文件时一定要存为什么格式吧?
费话少说,下载tomcat5的src,进入jakarta-tomcat-jasper\jasper2\src\share\org\apache\jasper\compiler,找到JspUtil.java,找到
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {
InputStream in =
if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
in = jarFile.getInputStream(jarEntry);
in = ctxt.getResourceAsStream(fname);
if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
在return in前加上判断,改成:
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {
InputStream in =
if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
in = jarFile.getInputStream(jarEntry);
in = ctxt.getResourceAsStream(fname);
if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
PushbackInputStream testin = new PushbackInputStream(in);
int ch = testin.read();
if (ch != 0xef) {
testin.unread(ch);
else if ((ch = testin.read()) != 0xbb) {
testin.unread(ch);
testin.unread(0xef);
else if ((ch = testin.read()) != 0xbf) {
throw new IOException("错误的UTF-8格式文件");
//fStream.setEncoding("UTF-8");
testin.read();
编译,重新打包,替换原来的包,运行TOMCAT,OK!
整个问题解决除了远程登录他的服务器传送文件的时间,总共只有4-5分钟.其实只要问题定位准确,就不难解决了.我一再强调的是经熟悉底层,你如果知道内
存中每个byte从哪儿来要到哪儿去,就可以非常容易地解决问题.在此之前我连TOMCAT5下载都没有下过,更别说试用了.但只要你对JDK有深入的了
解,就可以准确地定位问题的所在.
希望本文能给不是高手的朋友一点帮助和启发,对于高手的朋友你可以弃之一笑.
1,安装 yum install mysql-server,会同时安装mysql包。默认安装5.0版本。卸载:yum remove mysql-server2,配置默认配置文件在/f默认datadir=/var/lib/mysql默认socket=/var/lib/mysql/mysql.sockmysqladmin、mysqldump等命令在/usr/binmysqld在/etc/init.d/mysqld3,命令启动 service mysqld start停止 service mysqld stop开机自启是用"chkconfig --levels 235 mysqld on"还是"chkconfig mysqld on"如果启动报错,很可能是磁盘满了。如果开启了selinux,可能会导致mysql启动不成功。另外要记得设置iptables的3306端口
高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”。
如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部(指挥部就是数据库及分布式存储)。
如:能缓存在用户电脑本地的,就不要让他去访问CDN。 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了。能访问静态服务器的,就不要去访问动态服务器。以此类推:能不访问数据库和存储就一定不要去访问数据库和存储。
说起来很轻松,实际做起来却不容易,但只要稍加努力是可以做到的,Google的日独立IP过亿不也做到了么?我们这几千万的PV站比起Google不是
小屋见大屋了。我们还是先从我们的小屋搭起吧!哈哈!下面内容的介绍起点是千万级别的PV站,也可以支持亿级PV的网站架构。
高性能高并发高可扩展网站架构访问的几个层次:
有人会问,我们老是说把用户对业务的访问往前推,到底怎么推啊?推到哪呢?下面,老男孩就为大家一一道来。
第一层:首先在用户浏览器端,使用Apache的mod_deflate压缩传输,再比如:expires功能、deflate和expires功能利用的好,就会大大提升用户体验效果及减少网站带宽,减少后端服务器的压力。当然,方法还有很多,这里不一一细谈了。
提示:有关压缩传输及expires功能nginx/lighttpd等软件同样也有。
第二层:页面元素,如图片/js/css等或静态数据html,这个层面是网页缓存层,比如CDN(效果比公司自己部署squid/nginx要好,他们
更专业,价格低廉,比如快网/CC等(价格80元/M/月甚至更低)而且覆盖的城市节点更多),自己架设squid/nginx
cache来做小型CDN是次选(超大规模的公司可能会考虑风险问题实行自建加购买服务结合),除非是为前端的CDN提供数据源服务,以减轻后端我们的服
务器数据及存储压力,而不是直接提供cache服务给最终用户。taobao的CDN曾经因为一部分图片的次寸大而导致CDN压力大的情况,甚至对图片尺
寸大的来改小,以达到降低流量及带宽的作用。
提示:我们也可以自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache,以减轻第三层静态数据层的压力。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。
第三层:静态服务器层一般为图片服务器,视频服务器,静态HTML服务器。这一层是前面缓存层和后面动态服务器层的连接纽带,大公司发布新闻等内容直接由
发布人员分发到各cache节点(sina,163等都是如此),这和一般公司的业务可能不一样。所以,没法直接的参考模仿,比如人人的SNS。
我们可以使用Q队列方式实现异步的分发访问,同时把动态发布数据(数据库中的数据)静态化存储。即放到本层访问,或通过其他办法发布到各cache节点,
而不是直接让所有用户去访问数据库,不知道大家发现了没有,qq.com门户的新闻评论多的有几十万条,如果所有用户一看新闻就加载所有评论,那数据库不
挂才怪。他们的评论需要审核(美其名约,实际是异步的方式,而且,评论可能都是静态化的或类似的静态化或内存cache的方式),这点可能就是需要
这样站点学习的,你们打开51CTO的一篇博文,就会发现下面的评论一直都显示出来了,也可能是分页的。不过,应该都是直接读库的,一
旦访问量大,数据库压力大是必然。这里不是说51cto网站不好,所有的网站都是从类似的程序架构开始发展的。CU也可能是如此。
提示:我们可以在静态数据层的前端自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。
第四层:动态服务器层:php,java等,只有透过了前面3层后的访问请求才会到这个层,才可能会访问数据库及存储设备。经过前三层的访问过滤能到这层访问请求一般来说已非常少了,一般都是新发布的内容和新发布内容第一次浏览如;博文(包括微博等),BBS帖子。
特别提示:此层可以在程序上多做文章,比如向下访问cache层,memcache,memcachedb,tc,mysql,oracle,在程序级别
实现分布式访问,分布式读写分离,而程序级别分布式访问的每个db
cache节点,又可以是一组业务或者一组业务拆分开来的多台服务器的负载均衡。这样的架构会为后面的数据库和存储层大大的减少压力,那么这里呢,相当于
指挥部的外层了。
第五层:数据库cache层,比如:memcache,memcachedb,tc等等。
根据不同的业务需求,选择适合具体业务的数据库。对于memcache、memcachedb ttserver及相关nosql数据库,可以在第四层通过程序来实现对本层实现分布式访问,每个分布式访问的节点都可能是一组负载均衡(数十台机器)。
第六层:数据库层,一般的不是超大站点都会用mysql主从结构,如:163,sina,kaixin都是如此,程序层做分布式数据库读写分离,一主(或
双主)多从的方式,访问大了,可以做级连的主从及环状的多主多从,然后,实现多组负载均衡,供前端的分布式程序调用,如果访问量在大,就需要拆业务了,比
如:我再给某企业做兼职时,发现类似的51cto的一个站点,把www服务,blog服务,bbs服务都放一个服务器上,然后做主从。这种情况,当业务访
问量大了,可以简单的把www,blog,bbs服务分别各用一组服务器拆分开,这种方式运维都会的没啥难度。当然访问量在大了,可以继续针对某一个服务
拆分如:www库拆分,每个库做一组负载均衡,还可以对库里的表拆分。需要高可用可以通过drbd等工具做成高可用方式。对于写大的,可以做主主或多主的
MYSQL REP方式,对于ORACLE来说,来几组oracle DG(1master多salve方式)就够了,11G的DG可以象mysql
rep一样,支持读写分离了。当然可选的方案还有,mysql cluster 和oracle 的RAC,玩mysql cluster和oracle
RAC要需要更好更多的硬件及部署后的大量维护成本,因此,要综合考虑,到这里访问量还很大,那就恭喜了,起码是几千万以上甚至上亿的PV了。
象百度等巨型公司除了会采用常规的mysql及oracle数据库库外,会在性能要求更高的领域,大量的使用nosql数据库,然后前端在加DNS,负载均衡,分布式的读写分离,最后依然是拆业务,拆库,。。。逐步细化,然后每个点又可以是一组或多组机器。
特别提示:数据库层的硬件好坏也会决定访问量的多少,尤其是要考虑磁盘IO的问题,大公司往往在性价比上做文章,比如核心业务采用硬件
netapp/emc及san光纤架构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超大,可以采取热点分取分存的方法:如:最
常访问的10-20%使用ssd存储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。
第七层:千万级PV的站如果设计的合理一些,1,2个NFS
SERVER就足够了。我所维护(兼职)或经历过的上千万PV的用NFS及普通服务器做存储的还有大把,多一些磁盘,如SAS
15K*6的,或者用dell6850,搞几组 NFS存储,中小网站足够了。当然可以做成drbd+heartbeat+nfs+a/a的方式。
如果能达到本文设计要求的,中等规模网站,后端的数据库及存储压力会非常小了。 象门户网站级别,如sina等,
会采用硬件netapp/emc等等硬件存储设备或是san光纤同道,甚至在性价比上做文章,比如核心业务采用硬件netapp/emc及san光纤架
构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超到,可以采取热点分取分存的方法:如:最常访问的10-20%使用ssd存
储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。
象百度等巨型公司会采用hadoop等分布式的存储架构,前端在加上多层CACHE及多及的负载均衡,同样会根据业务进行拆分,比如爬虫层存储,索引层存储,服务层存储。。。可以更细更细。。。为了应付压力,什么手段都用上了。
特殊业务,如人人,开心网,包括门户网站的评论,微博,大多都是异步的写入方式,即无论读写,并发访问数据库都是非常少量的。
以上1-7层,如果都搭好了,这样漏网到第四层动态服务器层的访问,就不多了。一般的中等站点,绝对不会对数据库造成太大的压力。程序层的分布式访问是从千万及PV向亿级PV的发展,当然特殊的业务 还需要特殊架构,来合理利用数据库和存储。转自:http://bbs.chinaunix.net/thread--1.html
下载gparted的iso文件,修改CentOS虚拟机为从光盘启动,并且选中该iso文件。重新启动CentOS虚拟机,在启动时迅速点击虚拟机窗口,同时按ESC键,可看到Boot Menu,选择从光盘启动,重启后就可以使用gparted了。http://gparted.sourceforge.net/larry/generalities/gparted.htm
1,安装gccyum install gcc2,安装MySQL,并设置为开机自动启动。# yum install mysql mysql-devel mysql-server# chkconfig --levels 235 mysqld on# /etc/init.d/mysqld start3,安装ruby# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p352.tar.gz# tar zxf ruby-1.8.7-p352.tar.gz# cd ruby-1.8.7-p352# ./configure # make # make install# ruby -v目前ruby1.8.7最新的是p352,见ftp://ftp.ruby-lang.org/pub/ruby/1.8/默认会安装到/usr/local/lib/ruby/4,安装rubygems在安装rails
之前,要先安装rubygems这个比较挑剔,在redmine安装指导(http://www.redmine.org/projects/redmine/wiki/RedmineInstall)中提到有要求,要在1.3.7 ~ 1.7.0之间,这里选择了1.6.2版。同样是下载源码安装。# cd ~/rails_install# wget http://rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz# tar zxvf rubygems-1.6.2.tgz# cd rubygems-1.6.2# ruby setup.rb安装成功后,执行gem –v ,可看到版本信息。5,安装Rails及相关gemswget http://rubygems.org/downloads/rake-0.8.7.gemwget http://rubygems.org/downloads/rack-1.1.0.gemwget http://rubygems.org/downloads/rails-2.3.14.gemwget http://rubygems.org/downloads/activesupport-2.3.14.gemwget http://rubygems.org/downloads/activerecord-2.3.14.gemwget http://rubygems.org/downloads/actionpack-2.3.14.gemwget http://rubygems.org/downloads/actionmailer-2.3.14.gemwget http://rubygems.org/downloads/activeresource-2.3.14.gemwget http://rubygems.org/downloads/i18n-0.4.2.gemwget http://rubygems.org/downloads/mysql-2.8.1.gemwget http://rubygems.org/downloads/cgi_multipart_eof_fix-2.5.0.gemwget http://rubygems.org/downloads/coderay-1.0.0.gemgem
install --local rake-0.8.7.gemgem
install --local rack-1.1.0.gem gem
install --local rails-2.3.14.gemgem
install --local mysql-2.8.1.gemgem
install --local i18n-0.4.2.gemgem
install --local cgi_multipart_eof_fix-2.5.0.gemgem
install --local coderay-1.0.0.gem6,安装Redmine1.2.3使用svn下载Redmine 1.2源码到/www目录中svn co svn://rubyforge.org/var/svn/redmine/branches/1.2-stable redmine-1.2创建Redmine数据库和redmine用户CREATE DATABASE redmine CHARACTER SET utf8 COLLATE utf8_general_CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'redmine';GRANT ALL ON redmine.* TO 'redmine'@'localhost';到database.yml文件,修改production节点的帐号和密码为redmine,注意冒号后要有空格。到/www/redmine1.2目录下rake config/initializers/session_store.rbRAILS_ENV=production rake db:migrateRAILS_ENV=production rake redmine:load_default_dataruby script/server webrick -p 8000 -e production如果报错:rake aborted! no such file to load -- openssl先yum install
openssl-devel然后到下载的ruby源码的ext/openssl目录ruby extconf.rb
(生成Makefile)makemake install删除已安装的ruby参考:"./configure && make && make install"是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC(cc是gcc的连接,gcc是编译器)或GCC,它是个shell脚本make是用来编译的,它从Makefile中读取指令,然后编译。make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西
一:浏览器显示中文yum install fonts-chinese
yum install fonts-ISOdpi
修改 /etc/sysconfig/i18n ,内容如下:
LANG="en_US.UTF-8" SYSFONT="lat0-sun16"二:中文输入法安装yum -y install scim*
yum -y install Deployment_Guide-zh-* lv-* stardict*参见 安装jdk在/usr/java目录chmod 777 jdk-6u29-linux-i586-rpm.bin./jdk-6u29-linux-i586-rpm.bin 在安装新的虚拟机时,如果选择了ISO或者光盘立即安装,vmware会自动配置自动安装,但这样默认安装的CentOS系统,在显示中文的时候,会出现乱码。有人讲了解决办法:,但另外有人说还是有问题,要采用以下的办法:选择“我将操作系统以后安装(I will install the operating system
later)”,把裸机建出来后,先Virtual Machine Setting,点CDROM 然后在左边选择加载ISO文件(USe ISO image file),再启动安装就没问题了。由于VMware的智能自动安装,如果没有前面的两步,在安装系统时将不会出现语言选择、软件定制、分区等几乎所有设置选择,系统将会完全自动安装完毕。但这样安装的系统不能显示中文,没有中文输入法,连编译工具GCC也没有,什么意思啦,就是这样只安装了最核心最基本的一些东西。开始不知道,就没有前两步装的,结果装完后又要考虑汉化,然后又要装中文输入法,要用GCC 时,发现没有GCC,然后又得装GCC,后来找了半天,终于在/question /.html?fr=qrl&cid=89&index=5找到了答案,终于不用再为汉化而烦了,呵呵!这样VM安装 RHEL,就轻松解决问题了。补充:这样的安装方法相对简易安装(easyinstall)有些麻烦,那就是安装完后得手动安装vmtools,但别紧张,我教你个笨办法无忧解决,哪怕你没有linux基础:(1)点击vmvare上的安装vmtools按钮,系统会下载vmtools tar.gz 的cd(2)复制它到桌面,解压(3)双击解压后文件里面vmware-install.pl ,弹出对话框,选“在终端运行”(4)一路回车即可,最后要选择一下分辨率:12(5)安装后重启虚拟机 当出现"Please insert disc 2 to continue"时,点击vmware提供的"Change Disc"。问题:yum install mysql-server时报错“Insufficient space in download directory /var/cache/yum/base/packages”解决:rm -rf /var/cache/yum/*。也可修改/etc/yum.conf的cachedir=/var/cache/yum, 但根本原因可能是磁盘满了。
用某程序打开某文件(如果有空格,必须用引号):call "C:\Program Files\Notepad++\notepad++.exe"
E:\工作.txt执行这个bat时,会弹出一个对话框,如何隐藏运行呢?可以使用vba:CreateObject("WScript.Shell").Run "cmd /c E:\test.bat",0保存为test.vbs,双击它就可以隐藏运行了。
ResultSetHandler的实现类有很多种,涉及数组、map 、javabean等,都接受一个RowProcessor类型的参数来实现结果集向对象的转化。其中RowProcessor的默认实现类为BasicRowProcessor, 用户也可以自己实现RowProcessor。 BasicRowProcessor使用BeanProcessor来完成resultset中的值向javabean的映射,前提要求列名和bean属性名必须一致。ArrayHandler :将ResultSet中第一行的数据转化成对象数组ArrayListHandler : 将ResultSet中所有的数据转化成List,List中存放的是Object[]BeanHandler :将ResultSet中第一行的数据转化成类对象BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象MapHandler :将ResultSet中第一行的数据存成Map映射MapListHandler :将ResultSet中所有的数据存成List。List中存放的是MapColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象KeyedHandler :将ResultSet中所有数据存成Map,Map中key为某一列的值,value为Map,存放key对应的行的数据ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object查询的基本用法:
String url = "jdbc:mysql://localhost:3306/blog";
String jdbcDriver = "com.mysql.jdbc.Driver";
String user = "root";
String password = "root";
DbUtils.loadDriver(jdbcDriver);
Connection conn = null;
conn = DriverManager.getConnection(url, user, password);
QueryRunner qr = new QueryRunner();
results = (List)qr.query(conn, "select
from T_USER", new BeanListHandler(User.class) );
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}该query方法执行后会自己关闭rs和stmt,但没有关闭连接。如果传入dataSource, QueryRunner run = new QueryRunner( dataSource ),则执行不含conn参数的查询方法时,会自己关闭连接。public &T& T query(String sql, ResultSetHandler&T& rsh, Object params)
throws SQLException {
Connection conn = this.prepareConnection();
return this.query(conn, sql, rsh, params);
} finally {
close(conn);
1,SuppressWarnings的作用是抑制编译器产生警告信息。@SuppressWarnings("unused")@SuppressWarnings("unchecked")eclipse支持的SuppressWarning的值如下,其他开发工具略有差异。all to suppress all warningsboxing to suppress warnings relative to boxing/unboxing operationscast to suppress warnings relative to cast operationsdep-ann to suppress warnings relative to deprecated annotationdeprecation to suppress warnings relative to deprecationfallthrough to suppress warnings relative to missing breaks in switch statementsfinally to suppress warnings relative to finally block that don't returnhiding to suppress warnings relative to locals that hide variableincomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)nls to suppress warnings relative to non-nls string literalsnull to suppress warnings relative to null analysisrestriction to suppress warnings relative to usage of discouraged or forbidden referencesserial to suppress warnings relative to missing serialVersionUID field for a serializable classstatic-access to suppress warnings relative to incorrect static accesssynthetic-access to suppress warnings relative to unoptimized access from inner classesunchecked to suppress warnings relative to unchecked operationsunqualified-field-access to suppress warnings relative to field access unqualifiedunused to suppress warnings relative to unused code2,注解注解是加入到java源代码中的一些描述性的数据,本身不能执行。可利用反射(当RetentionPolicy=RUNTIME)或文本解析取得注解信息。@Target,@Retention为元注解。SuppressWarnings的源码如下:@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings {
String[] value();}package java.lang.public enum RetentionPolicy {
* Annotations are to be discarded by the compiler.
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time.
This is the default
* behavior.
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
* @see java.lang.reflect.AnnotatedElement
RUNTIME}package java.lang.public enum ElementType {
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE}3,泛型
public &T& T testT(List&T&
}4,自动装箱(AutoBoxing)关于row type/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it/http://www.blogjava.net/sevenguin/archive//348628.html/view/9deae009edf2.html
xp下使用mysql5.1,创建表空间时报错:Creating database "blog" failed: SQL Error (23): Out of resources when opening file '.\blog\db.opt' (Errcode: 24)解决办法:在my.ini中添加一行open_files_limit
= 1024顺便把max_connections调大了一些
并发与并行
发,英文单词是concurrent,是指逻辑上同时发生,有人做过比喻,要完成吃完三个馒头的任务,一个人可以这个馒头咬一口,那个馒头咬一口,这样交
替进行,最后吃完三个馒头,这就是并发,因为在三个馒头上同时发生了吃的行为,如果只是吃完一个接着吃另一个,这就不是并发了,是排队,三个馒头如果分给
三个人吃,这样的任务完成形式叫并行,英文单词是parallel。
回到计算机概念,并发应该是单CPU时代或者单核时代的说法,这个时候CPU要同时完成多任务,只能用时间片轮转,在逻辑上同时发生,但在物理上是串行的。现在大多数计算机都是多核或者多CPU,那么现在的多任务执行方式就是物理上并行的。
为了从物理上支持并发编程,CPU提供了相应的特殊指令,比如原子化的读改写,比较并交换。
报错:log4j:ERROR Document root element "log4j:configuration",
must match DOCTYPE root "null".解决:Try adding this to the second line (the line below &?xml ...?&)...&!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&Log4J的数据库写入方式就是一个鸡肋,没有使用连接池,也不支持addBatch。只是把用户输出的log现在一个ArrayList中保存,当其数量达到了BufferSize,才启动写日志。参看其源代码(JDBCAppender.java)可以考虑把org.apache.log4j.jdbc.JDBCAppender换掉。
http://wiki./display/SpringSide3/Log
1,subeclipse可使用relocate(重新定位)在资源库的view里,选中原来的地址,右键“重新定位”。2,修改hosts文件192.168.40.43
svnserver使用svnserver这个名字取代具体的ip。前提是端口不变。3,http://blog.csdn.net/jerryrt/article/details/4267860找到SVN的meta数据,发现都是明文,UNIX世界伟大的地方就在此,三分钟内处理完毕。#!/bin/bashfor SVN_META in `find . -type f -name "entries"`do
echo processing $SVN_META ...
cat $SVN_META | sed -e 's/3322/.org/homeunix/.net/g' &$SVN_META.tmp
mv -vf $SVN_META.tmp $SVN_METAdone
我使用的是SecureCRT5.5
SecureCR下的文件传输协议有ASCII、Xmodem、Zmodem
文件传输协议
文件传输是数据交换的主要形式。在进行文件传输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。常见的传输协议有以下几种:
ASCII:这是最快的传输协议,但只能传送文本文件。
Xmodem:这种古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的准确率可高达99.6%。
Ymodem:这是Xmodem的改良版,使用了1024位区段传送,速度比Xmodem要快。
Zmodem:Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。这是目前最流行的文件传输协议。
除以上几种外,还有Imodem、Jmodem、Bimodem、Kermit、Lynx等协议,由于没有多数厂商支持,这里就略去不讲。
SecureCRT可以使用linux下的zmodem协议来快速的传送文件.
你只要设置一下上传和下载的默认目录就行
options-&session options -&Terminal-&Xmodem/Zmodem 下
在右栏directory设置上传和下载的目录
使用Zmodem从客户端上传文件到linux服务器
1.在用SecureCRT登陆linux终端.
2.选中你要放置上传文件的路径,在目录下然后输入rz命令,SecureCRT会弹出文件选择对话框,在查找范围中找到你要上传的文件,按Add按钮。然后OK就可以把文件上传到linux上了。
或者在Transfer-&Zmodem Upoad list弹出文件选择对话框,选好文件后按Add按钮。然后OK窗口自动关闭。然后在linux下选中存放文件的目录,输入rz命令。liunx就把那个文件上传到这个目录下了。
使用Zmodem下载文件到客户端:sz filename
zmodem接收可以自行启动.下载的文件存放在你设定的默认下载目录下.
rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具windows端需要支持ZModem的telnet/ssh客
户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可)O
运行命令rz,即是接收文件,SecureCRT就会弹出文件选择对话框,选好文件之后关闭对话框,文件就会上传到当前目录 O 运行命令sz
file1 file2就是发文件到windows上(保存的目录是可以配置) 比ftp命令方便多了,而且服务器不用再开FTP服务了
StackOverflowError
当应用程序递归太深而发生堆栈溢出时抛出 Jamon(Java Application Monitor)是一款免费的、高性能的、线程安全的Java程序,它使得开发人员能够容易地完成对生产环境应用程序的监控。Java保证读和写32位数或者更小的值是原子操作,也就是说可以在一步完成,因而不可能被打断,因此这样的读和写不需要同步。以下的代码是线程安全(thread safe)的:public class Example{  private int
// More code here...  public void set (int x){   // NOTE: No synchronized keyword   this.value =  }
}不过,这个保证仅限于读和写,下面的代码不是线程安全的:public void increment (){  // This is
effectively two or three instructions:  // 1) Read current setting of ’value’.  // 2) Increment that setting.  // 3) Write the new setting back.  ++this.
}算法:统计最近一分钟的请求数量/problems/46542
含农药比较多的:黄瓜、草莓、油菜、豇豆、韭菜、洋葱、西红柿、圆白菜(洋白菜)、空心菜、小白菜、菠菜、西兰花、芹菜含农药比较少的:胡萝卜、土豆、蒿子秆、茼蒿、香菜、生菜、冬瓜、南瓜、辣椒、苋菜、红薯.cn/news/env//content_.htm/repaste/.html
1,下载Django-1.2.52,tar xzvf Django-1.2.5.tar.gz3,在Django-1.2.5目录下执行:sudo python setup.py install4,/usr/www下执行: django-admin.py startproject easydjango5,/usr/www/easydjango下执行: python
manage.py runserver
分库可以在model中加入
establish_connection :your_connection
self.abstract_class = true实现.分表应该也可以用类似的方法:set_table_name/questions/44145/database-sharding-and-rails/questions/5981724/multiple-database-tables-within-one-ar-model-in-rails-3/aglasgall/rails-sharding/blog/2009/a-quick-primer-on-sharding-for-ruby-on-rails//2010/04/its-boring-to-scale-with-ruby-on-rails/http://kovyrin.net//dbcharmer-rails-can-scale/https://www./categories/Active_Record_Shardinghttps://www./projects/octopushttps://www./projects/data_fabrichow RoR scales
I've said it before, but it bears repeating: There's nothing interesting about how Ruby on Rails scales.
We've gone the easy route and merely followed what makes Yahoo!,
LiveJournal, and other high-profile LAMP stacks scale high and mighty.Take
state out of the application servers and push it to
database/memcached/shared network drive (that's the whole Shared Nothing
thang). Use load balancers between your tiers, so you have load
balancers -& web servers -& load balancers -& app servers -&
load balancers -& database/memcached/shared network drive servers.
(Past the entry point, load balancers can just be software, like
haproxy).In a setup like that, you can add almost any number of web and app servers without changing a thing.Scaling
the database is the "hard part", but still a solved problem. Once you
get beyond what can be easily managed by a decent master-slave setup
(and that'll probably take millions and millions of pageviews per day),
you start doing partitioning.Users
1-100K on cluster A, 100K-200K on cluster B, and so on. But again, this
is nothing new. LiveJournal scales like that. I hear eBay too. And
probably everyone else that has to deal with huge numbers.So
the scaling part is solved. What's left is judging whether the
economics of it are sensible to you. And that's really a performance
issue, not a scalability one.If
your app server costs $500 per month (like our dual xeons does) and can
drive 30 requests/second on Rails and 60 requests/second on
Java/PHP/.NET/whatever (these are totally arbitrary numbers
pulled out of my...), then you're faced with the cost of $500 for 2.6
million requests/day on the Rails setup and $250 for the same on the
other one.Now.
How much is productivity worth to you? Let's just take a $60K/year
programmer. That's $5K/month. If you need to handle 5 million
requests/day, your programmer needs to be 10% more productive on Rails
to make it even. If he's 15% more productive, you're up $250. And this
is not even considering the joy and happiness programmers derive from
working with more productive tools (nor that people have claimed to be
many times more productive).Of course, the silly math above hinges on the assumption that the whateverstack
is twice as fast as Rails. That's a very big if. And totally dependent
on the application, the people, and so on. Some have found
than comparable "best-of-breed J2EE stacks".The
point is that the cost per request is plummeting, but the cost of
programming is not. Thus, we have to find ways to trade efficiency in
the runtime for efficiency in the "thought time" in order to make the
development of applications cheaper. I believed we've long since entered
an age where simplicity of development and maintenance is where the
real value lies.其实正如zhangc之前说,理论的问题都清楚,关键还是实践!
firebody 写道:java 代码
1. 以前用hibernate主要是做一些表的映射、关联,更深层的应用就没有了,所以也没什么经验,拿个具体的情况来分析一下吧。
3. 目前主要数据库是mysql,由于数据库存储限制:
4. 1、通常会把用户名和密码放一个库(负载相对较少,但也要依赖cache)。
5. 2、用户基本资料拆开多台DB按用户名或ID hash,用户扩展信息也拆开多台。
6. 3、用户积分因为太敏感,甚至使用了oracle来保证效率和稳定性(事实证明它比mysql慢。。它的C++绑定也更不稳定)。
7. 4、用户发帖是保存在文件的,数据库只保存文件链接发帖人等简单信息。
8. 5、用户之间的消息是放数据库的,当然也是按用户名hash到多台,这时候要查询我给别人的消息和别人给我的消息,就得从2个表里面查,因为你给别人的消息是按别人的用户名hash到某一台上,别人给你的是按你的用户名hash的,所以增加一条消息就得往2个库各写一条。
10. 以上列举了一部分应用,当然由于库拆得比较散,基本上每个库都会有冗余字段。
12. 上面这种情况下,能不能分析一下hibernate和ActiveRecord用得比较舒服的部分?
14. 我在用rails的时候,ActiveRecord对于多数据库支持并不好,即使是有这样的方案也是非方的技巧。分表情况下表之间的关联基本上没法做,如果没有关联,ActiveRecord的意义只是帮我们生成SQL?
16. 多级目录不是最大的问题,也不是阻碍性能的问题,俺只想找个最后的理由把RoR不适用这个项目说得更充分些。。。
谢谢你能够提供更多的信息来参与讨论, 针对你提到的2),这样的情况下,按照我的理解,现有的java的orm框架无法针对不同库的表作映射。 activeRecord应该也没有考虑到这种情况。不知道你们作出的分库的依据是什么,我觉得更合理的分库依据应该根据负载压力和模块独立性来分离,比如你提到的消息发送应该是统一的模块,按照用户名hash到不同的库的话,对于业务层开发带来一定的复杂度。分表的话,java的orm有些策略可以绕着解决,比如用继承策略来解决。但是也是比较别扭。 不过,我更想了解的是你们作出的分表的依据是什么?这样的情况下,模型的关联映射在现有的orm框架下确实太牵强了,即使用了,收到的效果也是很小的,模型也会随之退化到单实体+基本类型外键的维护上来,如果让我选择的话,基本上也是选择spring的jdbcTemplate了。如果觉得java orm是促进开发效率的一个基本前提的话,那么在系统架构选择上,特别是数据库架构设计上,可能还要更慎重一些,因为不同于数据库底层开发,orm对于数据库的要求会有一些苛刻。为了最大化获得模型映射的效果,有一些建议不知道是否合理:*
在考虑访问压力的情况下,尽量按照耦合紧密的原则分库,使得某一个库的表关联能够作充分的模型映射,而对于少数的外库关联仍然需要做手工的维护,不过已经简化到最小。*
因为数据量大而分表的话,可以采用多态映射关联来做和多表的关联。基本上分库主要原因都是和容量或性能有关,上亿用户,每个用户只保存一个用户名和密码,也有好几G的数据。为了登录部分效率考虑,用户名和密码拆到一个库中,因为这部分读取并不是特别频繁,所以目前用主备方式,备的目的是主挂掉至少不会让用户无法登录,顶多无法注册而已。用户的基本资料字段是固定的,但容量有些大,访问也比较频繁。之前用户没有中间层,所以拆库来提高效率。现在有中间层,拆库的意义也变了,领导不希望任何一台机器故障影响到所有用户,影响部分用户还是勉强可接受的。实际上随着用户的不断增加,即便是使用中间层也会有压力,毕竟中间层只是帮数据库挡了读取的压力,而读写比例通常情况下是10:1左右。用户扩展信息,这个是一对多的,一个用户可自定义不同的字段,通常是用户有修改时更新一下,读取压力并不大,同样是因为中间把把读取压力都挡掉了,但容量非常大。当然也考虑过如果有中间层,是不是数据库不用拆得这么细,目前也做过一些合并工作,不过意义并不大,因为所有数据库容量加起来以T计,不管是备份还是扩容甚至修复硬件故障都会影响用户很长时间,现在拆得这么细,通常一个点的故障只会影响一部分用户的一部分功能。目前硬件故障还是会经常有的,比如某国外品牌的服务器故障率非常高。扩容也是经常会有的,文件每天上传量就超过2T,每月都增加存储。数据库差不多每3月-6月都要重新拆分一次,因为容量。分库分表最佳实践大总结一、随着企业业务的增长,访问量和用户等数据的增加,传统的关系数据库已经不能满足需求
分表分库就成了节省成本、和良好扩展性的必然选择
网上也有很多开源的分表分库的软件,也公司自己开发实现
而终其原理和步骤都无外乎三步:
即首先sql解析路由,再根据路由确定分片,然后结果集合并
所遇到的分表分库的难点大都是对分布式事务的支持,分片后的分页
二、实现方式大都在两个层面:
即在应用层 代表有hibernate shards,ibatis shards,guzz 等
和 在jdbc之下 对应用层完全透明的 如amoeba 三、那么企业在分表分库的实践中该如何选择呢?
假如您是一开始就想全新的分表分库 公司没打算做自己的分表分库框架,那么推荐用guzz,
这个类似于hibernate 和 ibatis的框架,很多网站都在用,缺点是技术团队需要重新学习一套框架
跟旧的系统很难兼容;
假如您的系统很乱,分表分库规则很简单,并且数据库是mysql
推荐用amoeba ,虽然有oracle版本,但目前不是很成熟;
假如您的技术团队一直用hibernate ,或企业现在的很多项目现在都用hibernate做的
那么推荐用hibernate shards,这个类似hibernate,学习成本低,能跟
hibernate兼容
目前国内有在hibernate
shards上封装的成功案例,
缺点是list查询时遍历所有数据片,而不是根据sql规则确定的数据片。
这个bug及在hibernate shards上如何扩展问题我已解决,附件是解决的架构图,
需要源代码的或详细可以联系我;
ibatis shards跟hibernate shards类似,也可借鉴本人所设计的架构
思想 欢迎有志之士详聊
一、hibernate shards
1、实现跟其他成熟框架的集成如spring
2、能利用公司现有的hibernate的技术优势
3、目前国内有成功案例在hibernate
shards上封装
的商业软件
4、能够快速开发
1、暂不支持垂直分区
2、list查询遍历所有表分片
Cactus is a simple test framework for unit testing server-side java
code (Servlets, EJBs, Tag Libs, Filters, ...).JspTestServletRunnerhttp://home.so-net.net.tw/idealist/Test/cactus.html
#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
MySQL Debugger /
sqlyog有社区版,下载地址/p/sqlyog/downloads/listHeidiSQL 新版本HeidiSQL提供了触发器和作业的管理Navicat Lite有unbuntu版本XtraBackup 是一个用来备份 MySQL 的 InnoDB 数据库的开源工具。
备份一个库#mysqldump db_name &/path/db_name.sql -uroot -p 备份某个表#mysqldump db_name tab_name &/path/tab_name.sql -uroot -p导入:shell& mysqladmin create target_db_name
shell& mysql target_db_name & /path/db_name.sql -uroot -pmysqldump比直接拷贝数据库文件夹速度要慢但,直接复制文件夹会遇到不同mysql的版本兼容问题,也可能不能跨操作系统使用。如果你想恢复的数据库是包含授权表的mysql数据库,你需要用--skip-grant-table选项运行服务器。否则,它会抱怨不能找到授权表。在你已经恢复表后,执行mysqladmin flush-privileges告诉服务器装载授权标并使用它们 mysqldump
-uroot -proot -h192.168.0.1 -P3306 test T_USER --where="sex=1 and
type=2 limit order by id desc limit 100" & /www/T_USER.sql或mysql -uroot -proot -h192.168.0.1 -P3306 test -e "select jjj from ttt" & /www/test.txt恢复单个表较为复杂,如果你用一个由mysqldump生成的备份文件,并且它不包含你感兴趣的表
的数据,你需要从相关行中提取它们并将它们用作mysql的输入。这是容易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉
mysql_find_rows实用程序对此很有帮助,它从更新日志中提取多行查询 mysqldump
-uroot -proot -h192.168.0.1 -P3306 test T_USER --where="sex=1 and
type=2 limit order by id desc limit 100" & /www/T_USER.sql/u/27383/showart_542561.html
google code search
1,画序列图:新增一个Element - Collaboration,接着新建一张"Sequence Diagram",就可以画了。
The WAP 1.0 standard, released in April 1998, described a complete software stack for mobile internet access.
WAP1.1 came out in 1999.[4]. WAP 1.2, the final update of the 1.X series
was released in June 2000.The most important addition in version 1.2
was WAP push.
wap push 的意思是带连接的短信,它可以引导你进入wap的网站获取手机号码
Mobile_GPRS
request.getHeader("X-up-calling-line-id");
Mobile_CDMA
request.getHeader("x-up-subno");
Mobile_INFO
request.getHeader("x-network-info");
Mobile_DEVI
request.getHeader("deviceid"); 现在好像已经取不到了,但是像umpay和梦网这样和移动有协议的网站能够拿到。1、用wml还是xhtml取决于你的站点是wap 1.2还是2.0,如果是wap 1.2,那还是老老实实写wml。 2、wap上线最重要的是检查页面是否能正常被手机终端访问,因为wap语法要求非常严格,不像pc上的浏览器兼容性那么好,哪怕一点点小问题,比如某个字符乱码,就可能导致页面无法访问。通常通过以下三个步骤来检查: 1)使用opera 8.51版本检查页面,看看是否有不规范的语法; 2)访问一个3C标准的网站,在网站中输入你的wap页面地址,这个网站可以对页面进行检查,看看是否符合标准。(不好意思,网站名和地址忘了) 3)直接使用手机访问页面进行检查。,是因为9.0以后的版本兼容性有很大的问题,对很多正常的页面也会提示出错。注:opera8的最后一个版本是8.5.4,见/pub/opera/winopenwave模拟测试
目前低端手机的浏览器还有相当一部分只支持WML,xHTML MP的普及率在上升,但我们还是不能忽视WML only的那批客户群。美国的Sprint最近几款手机开始支持ESMP(ECMA Script Mobile Profile),也就是手机上的JavaScript。 另外,Sprint也加了自己一些技术,比如pre-cache multipart mimetype。就是用multipart的方式(我们email很常见的格式)下载一个package,里面包括相关的页面,图片,ESMP等等。目前package最大尺寸是512K,mobile上大概是10多个页面吧(包括图片)。一次性下载完后,浏览页面就是本地浏览方式了。好处是一个Http connection下载所有页面和资源。坏处是下载的速度会比较慢。但现在3G的开始普及,512K的数据几秒钟就下好了,利大于弊很多很多。在应用层上无论是wap 1.n时代的wml还是wap2.0的XHTML MP都将会和PC浏览器走向统一,XHTML MP已经是XHTML的一个子集。在传输层上如lz所说浏览器可以直接使用HTTP协议通讯,WAP传输层上的协议也会消亡。WAP作为一种技术肯定会消失。但手机浏览器作为继PC浏览器后的另一个用户终端其B/S模式不会消亡。WML1只支持 粗体 斜体 下划线
&small& &big&这几个字体样式,而且有的浏览器还不支持这个样式.(字能显示出来,但没该效果) Wap与PC不同之处在与Wap1.x不支持Session与Cookie,Wap2.0虽然支持但是只有协议支持还是不行,还要看手机终端支不支持?所以我们的解决方法就是完全不依赖Wap协议,完全不依赖手机终端,使用Url重写进行Session的维护,这个方法只与服务器端有关.&meta http-equiv="Content-Type" content="text/ charset=utf-8; X-Wap-Proxy-Cookie=none" /&WAP网关存在不少问题,其中之一如开发者最为头疼的问题便是cookie的处理。由于不少低端手机浏览器本身不支持cookie,于是WAP网关越俎代庖担当起此重任--通过网关软件使这些手机支持cookie,此僭越行为导致移动开发者无所适从,具体表现在:a. 手机上清除cookie后仍有cookieb. cookie会莫名其妙的丢失或者产生c. 重复的cookie存在导致生成非法请求Header应该还有很多很细小的问题让开发者头疼,在互联网上运行好好的机制移到WAP上就会有这样那样的问题,这些问题更多集中在用户登录、权限控制等方面,问题如何解决呢?解决办法是让WAP网关不保存cookie,加入上述代码即可解决问题。
SecureCRT1,SecureCRT全屏后,SecureCRT后如何显示菜单?Alt+Enter是转换全屏与否的快捷键,或者输入Alt+V弹出菜单,去掉full screen2,乱码问题将securecrt的字符编码也改成UTF-8修改方法:Options -& Session Options -&
Apperance -& Fonts -& Character3,使用SecureCRT时把Session改成VT100 Linux模式,有何区别putty1,乱码问题在窗口标题上点击右键,选择“Change Settings...”,在打开的配置窗口左边选择 Appearance,在右边点 Font settings 里面的 Change 按钮,选择好中文字体,比如:宋体、新宋体之类。字体选择好了,还要确定字符集。选择配置窗口左边的 Translation,在右边的 Received data assumed to be in which character set 下拉列表中选择UTF-82,退出全屏要退出的时候需要把鼠标移到左上角,然后单击鼠标左键,就会跳出选项。或者Windwo-&Behaviour-&勾选Full screen on Alt-Enter3,增加滚动的行数在配置窗口的左边选择 Window,修改右边的 Lines of scrollback,改大点。参考
  是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。 
 兼容 WMS 和 WFS 特性;支持 PostGIS 、 Shapefile 、 ArcSDE 、 Oracle 、 VPF 、 MySQL 、
MapInfo ;支持上百种投影;能够将网络地图输出为 jpeg 、 gif 、 png 、 SVG 、 KML 等格式;能够运行在任何基于
J2EE/Servlet 容器之上;嵌入 MapBuilder 支持 AJAX 的地图客户端OpenLayers;除此之外还包括许多其他的特性。TileCache 是一个地图瓦片缓存器,大大提高访问地图的响应速度,只有当请求的地图不在tiles之列时,才与wms等其他服务交互请求地图,消耗空间服务器资源。
空格和双引号的utf编码英文半角英文全角中文半角中文全角空格20e3808020e38080双引号""
22 22"" efbc82  efbc82“” e2809c e2809d“”e2809c e2809d买 宝 贝:我的宝贝:社
区::其实很简单,跟字符集或者编码没有太大的关系。在英文字体或者其他国家语言字体下空格($)在浏览器中显示为不同的宽度,可能是三个空格对应一个汉字,或者四个空格对应一个汉字。使用中文字体可以完美解决这个问题。TIP:css中font-family: "宋体", sans-
OpenVZ是开源软件,是基于Linux平台的操作系统级服务器虚拟化解决方案,类似的还有xen
/vps.asp易联主机//hosting.html/
1,在resin3.0中,deploy是默认的发布目录,在MyEclipse中直接发布到resin的deploy目录中,起动服务器就会运行发布的项目,而在resin-3.1.1中发布到deploy目录下的项目不会运行,需要修改conf目录下的resin.conf文件,里面有一行 &web-app-deploy path="webapps"/&是设置发布目录路径的,我们在后边加上一行 &web-app-deploy path="deploy"/&,这样在deploy目录下的项目就能正常运行了。
还有一个办法,我没试过:在&host id="" root-directory="."&标记中找到&/web-app&在这个标记后面手动添加一行配置 &web-app id="/项目名称" root-directory="deploy/项目名称"/& 2,resin2.1.17 官方下载地址官网上已经没有相关下载链接,但是文件还在,趁早下吧,用3以上版本就得付费买证书了
win:好像resin2的最后一个版本是2.1.183,resin2.x支持JSP 1.2/Servlet 2.33.X支持JSP 2.0/Servlet 2.43.03不需要许可证3.04开始需要许可证4,发现Resin2系列采用了资源定义的方式统一化的定义各种雷动的配置,而Resin3则把它省略成直接用res-ref-name作为限定标识的形式,这样的利弊很容易看出:利:调用配置方便程序可以更简洁的读取配置,同时使配置更为简洁。弊:这样的形式虽然使程序简洁,配置方便但同时带来了程序上管理更为复杂每个资源定义名的判断都需单独判断而不能在程序内统一判断 5,要想让resin能够动态加载class,要三个条件,1.高版本的resin
2.与之相匹配的jdk 3.以-Xdebug方式启动。6,resin.conf里面有一段内容如下所示:
- Ping to test if the web server is still up.
You can uncomment this
- and point it to pages on the webserver that exercise your main
- logic (like database access).
If the GET fails, it will restart
- the server.
This will catch deadlocks, but not JDK freezes.
- &ping sleep-time=’1m’ retry-count=’3’ retry-time=’1s’&
&url&http://localhost:8080/ping/ping.jsp&/url&
--& 这段内容默认情况下是被注释的。它的功能是让Resin每隔一分钟就测试一下能否访问/ping/ping.jsp文件,测试时间是1s,如果不成功,就重试三次。如果三次都不成功,Resin就自动重启。7,报错:sun.tools.javac.Main 已过时
把配置文件中的
&java compiler=”internal" compiler-args="" /&
&java compiler="javac" compiler-args="" /&8,resin2和resin3配置的部分区别1)使用datasource时,resin3好像需要把mysql驱动放到resin3\lib下,而resin2只需要放到web应用的lib下?2)resin2:&web-app id='/' app-dir='C:/resin2/webapps/blog'&resin3:&web-app id='/' document-directory='C:/resin3/deploy/blog'&3)数据源resin2:&resource-ref&&res-ref-name&jdbc/blog&/res-ref-name&&res-type&javax.sql.DataSource&/res-type&&init-param driver-name="com.mysql.jdbc.Driver"/&&init-param url="jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=UTF-8"/&&init-param user="blog"/&&init-param password="blog" /&&init-param max-connections="50"/&&init-param max-idle-time="50"/&&/resource-ref&resin3:
&database&&jndi-name&jdbc/blog&/jndi-name&&driver type="com.mysql.jdbc.Driver"&
&url&jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=UTF-8&/url&&user&blog&/user&&password&blog&/password&&/driver&&/database&9,myeclipse下使用resin调试jsp修改resin.conf:
&javac compiler="internal" args="-g -source 1.5"/&加上-g就行了。好像resin2不行18,
是一个开源的移动应用开发框架。PhoneGap将移动设备本身提供的复杂的API进行了抽象和简化,提供了一系列丰富的API供开发者调用,只要标准的web技术(html5+css3+js),就可以利用PhoneGap提供的API去调用各种功能,PhoneGap就能让你制作出在各种手机平台上运行的应用。它使开发者能够利用iPhone,Android,Palm,Symbian和Blackberry智能手机的核心功能——包括地理定位、重力感应、联系人、相机、文件系统等()。它需要特定平台提供的附加软件,例如iPhone的iPhone SDK,Android的Android SDK等。使用PhoneGap只比为每个平台分别建立应用程序好一点点,因为虽然基本代码是一样的,但是你仍然需要为每个平台分别编译应用程序。据说PhoneGap很适合和jquerymobile搭配使用。
content-type:text/ charset=utf-8
file_get_contents
file_put_contents
htmlspecialchars
&form method=post&&input name=s&&/form&
ab -n 10000 -c 10
127.0.0.1/-n总请求次数,-c并发数,-t时间(秒)注意:url后面一定要带斜杠url最好用引号引起来:ab -n 1000 -c 1000 'http://192.168.16.203/XGateway/XService.svc/GetData?dd=XXX&bb=XXXXXX&cc=ttttt'如果不加引号,则默认只传一个参数,curl也是如此
我的理解:可伸缩性是指系统通过增加或减少硬件水平从而提升或降低系统性能的难易程度。可伸缩性分为scale up和scale out。scale up是指提高单台服务器的硬件水平来提高系统的整体处理能力,可以调整的有CPU,存储,内存等;scale out是指通过增加系统的处理节点的方式来提高系统的整体处理能力。可扩展性是软件系统应对需求增加或需求变化的能力。参考:
北约28国有而欧盟没有的成员国:美国、加拿大、土耳其、挪威、克罗地亚、阿尔巴尼亚、冰岛欧盟27国有而北约没有的成员国:爱尔兰、奥地利、瑞典、芬兰、马耳他、塞浦路斯北约和欧盟都有的成员国:英国、法国、德国 、意大利、荷兰、西班牙 希腊、葡萄牙、比利时、丹麦、卢森堡、波兰、匈牙利、捷克、斯洛伐克、斯洛文尼亚、爱沙尼亚、拉脱维亚、立陶宛、罗马尼亚、保加利亚(截至)
//SqlMapClientBuilder的buildSqlMapClient(Reader reader)方法public static SqlMapClient buildSqlMapClient(Reader reader) {
return new SqlMapConfigParser().parse(reader);
//SqlMapConfigParser的parse(Reader reader)方法
public SqlMapClient parse(Reader reader) {
usingStreams =
parser.parse(reader);//此处的parser是NodeletParser
return state.getConfig().getClient();
} catch (Exception e) {
throw new RuntimeException("Error occurred.
Cause: " + e, e);
} 在new SqlMapConfigParser()时就预先对配置文件xml的各个节点上要执行哪些事件做了定义(就是一些回调方法),放在NodeletParser对象的一个HashMap属性里,真正调用这些方法是在nodeletParser.parse(reader)里完成的。执行上述操作后会把配置文件的详细属性存储到该SqlMapConfigParser对象的XmlParserState对象、XmlParserState对象持有的SqlMapConfiguration对象以及(SqlMapConfiguration持有的SqlMapClientImpl和SqlMapExecutorDelegate)。SqlMapExecutor接口定义了CRUD等方法,SqlMapTransactionManager接口定义了跟事务相关的方法,SqlMapClient接口和SqlMapSession接口都继承了SqlMapExecutor和SqlMapTransactionManager。只是SqlMapClient增加了opensession等方法,SqlMapSession接口只增加了一个方法close()。SqlMapSessionImpl对象和SqlMapClientImpl对象持有共同的委托对象SqlMapExecutorDelegate delegate.并且利用此委托对象实例化了一个sessionScope对象,然后对增删改查的调用均委托对象执行处理并传入这个跟线程绑定的sessionScope对象.可在SqlMapConfig.xml里设置settings属性,具体有哪些属性,分别表示什么含义还不清楚。这些属性在ibatis启动后估计都保存在SqlMapExecutorDelegate对象里。&settingscacheModelsEnabled="false"enhancementEnabled="false"lazyLoadingEnabled="false"/&问题:1,使用SqlMapClient的最佳实践,应该用单例,并发如何处理2,事务。单个操作不需要手动控制,如果是多个操作,先startTransaction,执行多个操作后commitTransaction,最后还要endTransaction参考:1,2,3,4,
spring第二大作用就是aop,其机理来自于代理模式,代理模式有三个角色分别是通用接口、代理、真实对象代理、真实对象实现的是同一接口,将真实对象作为代理的一个属性,向客户端公开的是代理,当客户端调用代理的方法时,代理找到真实对象,调用真实对象方法,在调用之前之后提供相关的服务,如事务、安全、日志。其名词分别是代理、真实对象、装备、关切点、连接点。动态代理:不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的返射得到真实对象的Method,调用装备的invoke方法,将动态代理、Method、方法参数传与装备的invoke方法,invoke方法在唤起method方法前或后做一些处理。1、产生动态代理的类:java.lang.refect.Proxy 2、装备必须实现InvocationHandler接口实现invoke方法
1,double d = 1 / 4;System.out.println(d);//输出为02,
public static void main(String[] args) {
StringBuffer a = new StringBuffer("a");
StringBuffer b = new StringBuffer("b");
append(a, b);
System.out.println(a.toString() + "," + b.toString());//输出为"ab,a"
public static void append(StringBuffer a, StringBuffer b) {
a.append(b);
解释:由于java方法传值是值传递,所以方法里面的a,b虽然和方法外的a,b指向的对象一样,但是这两个引用在栈中的位置不一样。
过程大概是首先在栈中复制引用a为a',b为b',并令a'指向a所指的在堆中的StringBuffer对象,b'指向b所指的在堆中的StringBuffer对象。
因此方法中的b=a只是起到了b'=a'的作用,并没有影响方法外b的指向。
其实public static void append(StringBuffer a, StringBuffer
b)中的变量a,b只是main方法中的变量a,b的引用地址副本,也就是说相当于append中的a与main中的a是指向同一个地址,append中
的b与main中的b是指向同一个地址,所以a.append(b)操作影响到了main方法中的a,但是append方法中的b=a;操作只是改变了
append方法的中b的指向,并没有改变main方法中b的指向。
java是按值传递,对象类型的话,分为栈上的引用和堆上的对象,栈上的引用被复制一份,如果操作堆上的对象则对象改变,但是如果操作引用则不改变
java方法的参数传递有两种规则:(1)按值传递(by value) ,八种基本数据类型和String
(2)按址传递(by address)
,除String以外的所有复合数据类型,包括数组、类和接口
3,}

我要回帖

更多关于 发那科机器人仿真软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信