mocking a singleton class

mocking a singleton class http://stackoverflow.com/questions/2302179/mocking-a-singleton-class

2016-02-25 · 1 min · 5 words · -

Maven类包冲突终极三大解决技巧 mvn dependency,tree

Maven类包冲突终极三大解决技巧 mvn dependency,tree http://ian.wang/106.htm Maven对于新手来说是《步步惊心》,因为它包罗万象,博大精深,因为当你初来乍到时,你就像一个进入森林的陌生访客一样迷茫。 Maven对于老手来说是《真爱配方》,因为它无所不能,利如刀锋,使用Maven做开发,如饮美酒如悦美人。 Maven对于新手来说,最痛苦的一件事莫过于包之间的冲突,由于Maven的依赖传递性,当你引入一个依赖类时,其身后的依赖类也一起如过江之鲫纷至沓来了。 举例 A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包 (一般情况下了,Maven可通过等若干种方式控制传递依赖) 。 这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖于X的1.0还是2.0版本呢? 这就看Classloader的加载顺序了,假设Classloader先加载X_1.0,而它就不会再加载X_2.0了,如果A恰恰希望使用X_2.0呢,血案就这样不期而遇了。 三大技巧 第一板斧:找到传递依赖的鬼出在哪里? dependency:tree是把照妖照,pom.xml用它照照,所有传递性依赖都将无处遁形,并且会以层级树方式展现,非常直观。 以下就是执行dependency:tree后的一个输出: 引用 [INFO] - maven-dependency-plugin:2.1:tree (default-cli) @ euler-foundation - [INFO] com.hsit:euler-foundation:jar:0.9.0.1-SNAPSHOT [INFO] +- com.rop:rop:jar:1.0.1:compile [INFO] | +- org.slf4j:slf4j-api:jar:1.7.5:compile [INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile [INFO] | +- log4j:log4j:jar:1.2.16:compile [INFO] | +- commons-lang:commons-lang:jar:2.6:compile [INFO] | +- commons-codec:commons-codec:jar:1.6:compile [INFO] | +- javax.validation:validation-api:jar:1.0.0.GA:compile [INFO] | +- org.hibernate:hibernate-validator:jar:4.2.0.Final:compile [INFO] | +- org.codehaus.jackson:jackson-core-asl:jar:1.9.5:compile [INFO] | +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.5:compile [INFO] | +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.5:compile ...

2016-02-17 · 2 min · 341 words · -

disruptor

disruptor http://www.cnblogs.com/haiq/p/4112689.html 已经不记得最早接触到 Disruptor 是什么时候了,只记得发现它的时候它是以具有闪电般的速度被介绍的。于是在脑子里, Disruptor 和"闪电"一词关联了起来,然而却一直没有时间去探究一下。 最近正在进行一项对性能有很高要求的产品项目的研究,自然想起了闪电般的 Disruptor ,这必有它的用武之地,于是进行了一番探查,将成果和体会记录在案。 一、什么是 Disruptor 从功能上来看,Disruptor 是实现了"队列"的功能,而且是一个有界队列。那么它的应用场景自然就是"生产者-消费者"模型的应用场合了。 可以拿 JDK 的 BlockingQueue 做一个简单对比,以便更好地认识 Disruptor 是什么。 我们知道 BlockingQueue 是一个 FIFO 队列,生产者(Producer)往队列里发布(publish)一项事件(或称之为"消息"也可以)时,消费者(Consumer)能获得通知;如果没有事件时,消费者被堵塞,直到生产者发布了新的事件。 这些都是 Disruptor 能做到的,与之不同的是,Disruptor 能做更多: 同一个"事件"可以有多个消费者,消费者之间既可以并行处理,也可以相互依赖形成处理的先后次序(形成一个依赖图); 预分配用于存储事件内容的内存空间; 针对极高的性能目标而实现的极度优化和无锁的设计; 以上的描述虽然简单地指出了 Disruptor 是什么,但对于它"能做什么"还不是那么直截了当。一般性地来说,当你需要在两个独立的处理过程(两个线程)之间交换数据时,就可以使用 Disruptor 。当然使用队列 (如上面提到的 BlockingQueue) 也可以,只不过 Disruptor 做得更好。 拿队列来作比较的做法弱化了对 Disruptor 有多强大的认识,如果想要对此有更多的了解,可以仔细看看 Disruptor 在其东家 LMAX 交易平台(也是实现者) 是如何作为核心架构来使用的,这方面就不做详述了,问度娘或谷哥都能找到。 二、Disruptor 的核心概念 先从了解 Disruptor 的核心概念开始,来了解它是如何运作的。下面介绍的概念模型,既是领域对象,也是映射到代码实现上的核心对象。 Ring Buffer 如其名,环形的缓冲区。曾经 RingBuffer 是 Disruptor 中的最主要的对象,但从3.0版本开始, 其职责被简化为仅仅负责对通过 Disruptor 进行交换的数据 (事件) 进行存储和更新。在一些更高级的应用场景中,Ring Buffer 可以由用户的自定义实现来完全替代。 ...

2016-02-15 · 1 min · 145 words · -

伪共享 False Sharing

伪共享 False Sharing 原文地址: http://ifeve.com/false-sharing/ 作者: Martin Thompson 译者: 丁一 缓存系统中是以缓存行 (cache line) 为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。 为了让可伸缩性与线程数呈线性关系,就必须确保不会有两个线程往同一个变量或缓存行中写。两个线程写同一个变量可以在代码中发现。为了确定互相独立的变量是否共享了同一个缓存行,就需要了解内存布局,或找个工具告诉我们。Intel VTune就是这样一个分析工具。本文中我将解释Java对象的内存布局以及我们该如何填充缓存行以避免伪共享。 图 1. 图1说明了伪共享的问题。在核心1上运行的线程想更新变量X,同时核心2上的线程想要更新变量Y。不幸的是,这两个变量在同一个缓存行中。每个线程都要去竞争缓存行的所有权来更新变量。如果核心1获得了所有权,缓存子系统将会使核心2中对应的缓存行失效。当核心2获得了所有权然后执行更新操作,核心1就要使自己对应的缓存行失效。这会来来回回的经过L3缓存,大大影响了性能。如果互相竞争的核心位于不同的插槽,就要额外横跨插槽连接,问题可能更加严重。

2016-02-15 · 1 min · 19 words · -

LMAX Disruptor

LMAX Disruptor LMAX Disruptor 一个高性能、低延迟且简单的框架 原文地址: LMAX Disruptor – High Performance, Low Latency and Simple Too 翻译: 杨帆 校对: 丁一 Disruptor 是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列,并且它是让LMAX Exchange 跑的如此之快的一个关键创新。关于什么是Disruptor、为何它很重要以及它的工作原理方面的信息都呈爆炸性增长 —— 这些文章很适合开始学习Disruptor,还可跟着LMAX BLOG深入学习。这里还有一份更详细的白皮书。 虽然disruptor模式使用起来很简单,但是建立多个消费者以及它们之间的依赖关系需要的样板代码太多了。为了能快速又简单适用于99%的场景,我为Disruptor模式准备了一个简单的领域特定语言。例如,为建立一个消费者的"四边形模式": (从Trisha Gee’s excellent series explaining the disruptor pattern偷来的图片) 在这种情况下,只要生产者 (P1) 将元素放到ring buffer上,消费者C1和C2就可以并行处理这些元素。但是消费者C3必须一直等到C1和C2处理完之后,才可以处理。在现实世界中的对应的案例就像: 在处理实际的业务逻辑 (C3) 之前,需要校验数据 (C1) ,以及将数据写入磁盘 (C2) 。 用原生的Disruptor语法来创建这些消费者的话代码如下: Executor executor = Executors.newCachedThreadPool(); BatchHandler handler1 = new MyBatchHandler1(); BatchHandler handler2 = new MyBatchHandler2(); BatchHandler handler3 = new MyBatchHandler3() RingBuffer ringBuffer = new RingBuffer(ENTRY_FACTORY, RING_BUFFER_SIZE); ...

2016-02-15 · 1 min · 156 words · -

MySQL日期函数

MySQL日期函数 MySQL日期函数,时间函数使用的总结,以及时间加减运算(转) 博客分类: MySQL MySQL数据库 select timediff(‘23:40:00’, ’ 18:30:00’); - 两时间相减 SELECT substring( timediff(‘23:40:00’, ’ 18:30:00’),1,5) –“05: 10"相减返回小时: 分钟 select datediff(‘2008-08-08’, ‘2008-08-01’); - 7 –两日期相减 select TO_DAYS(‘2008-09-08’)-TO_DAYS(‘2008-08-08’) –两日期相减 SELECT substring( ‘2009-06-17 10:00:00’, 1, 10 ) –从datetime中提取"日期” (********* 时间戳是从1970年1月1日开始到目标时间所经过的秒数. 可以进行两个datetime时间间隔的运算**********) 一、MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间 (date + time) 函数: now() MySQL> select now(); +——-+ | now() | +——-+ | 2008-08-08 22:20:46 | +——-+ 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() ,current_timestamp ,localtime() ,localtime ,localtimestamp - (v4.0.6) ...

2016-02-14 · 7 min · 1376 words · -

nordfx server

nordfx server 全部服务器均提供新版IP地址,如果您的连接仍有问题,不妨在MT4登录窗口服务器一栏输入以下地址重新尝试登录: Real1 78.140.165.83:443 78.140.166.245:443 78.140.132.78:443 Real2 78.140.166.246:443 88.85.85.27:443 Real3 78.140.166.244:443 Real4 78.140.165.89:443 78.140.166.243:443 Real5服务器的IP (任选一组) - 78.140.172.90:443 或 78.140.172.91:443 NordGroupInv-Demo Demo 1 78.140.130.82:443 Demo 2 98.158.109.150:443 Demo 3 117.18.73.62:443 尝试一下在登录MT4时,服务器地址的位置输入 https://nordfx-chinese.com/faq_trade_platforms.html

2016-02-02 · 1 min · 33 words · -

archlinux kvm windows

archlinux kvm windows 创建虚拟磁盘 安装windows虚拟机 配置网络 check if cpu suport kvm egrep --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo zgrep CONFIG_KVM /proc/config.gz zgrep VIRTIO /proc/config.gz lsmod | grep kvm lsmod | grep virtio install qemu sudo pacman -Sy sudo pacman -S qemu libvirt # 可选项 sudo pacman -S samba ### 安装virtio yay -S virtio-win 创建磁盘文件 qemu-img create -f raw win10.raw 30G # 如果磁盘文件所在分区为 btrfs 文件系统, 在创建磁盘文件之前先在外层目录禁用 COW。 chattr +C /path/to/qemu-img/ 安装 win10 qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 2048 \ -boot d \ -drive file=/home/wiloon/vm/win10.raw,format=raw,if=virtio,index=1 \ -drive file=/home/wiloon/vm/Win10_1511_English_x64.iso,format=raw,index=2,media=cdrom \ -fda /usr/share/virtio/virtio-win_x86_64.vfd 如果遇到 -fda read-only 的问题, 去修改一下权限 qemu-system-x86_64: Initialization of device isa-fdc failed: Could not reopen file: Permission denied qemu-system-x86_64: Initialization of device isa-fdc failed: Block node is read-only ...

2016-02-01 · 2 min · 244 words · -

MySQL 聚集函数

MySQL 聚集函数 聚集函数 聚集函数是运行在行组上,计算和返回单个值的函数。 SQL聚集函数 函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某个列之和 (1) 、AVG()函数 可以返回所有列的平均值,也可以返回特定列的平均值。 sql print? SELECT AVG(prd_price) AS avg_price FROM products Where vend_id=1003; 将过滤出vend_id=1003的产品,avg是这些产品的平均值. (2) 、COUNT()函数 COUNT(*)对表中行的数目进行计数,不管表列中包含的是空 (NULL) 还是非空值; COUNT(column)对特定列中有值的行进行计算,忽略NULL值。 (3) 、MAX()函数 MAX()返回指定列的最大值,要求指定列名,忽略NULL值。 在MySQL中,MAX()函数可以对非数据列使用,在用于文本数据时,如果数据按相应的列排序,MAX()返回最后一行。 (4) 、MIN()函数 MIN()返回指定列的最小值,要求指定列名,忽略NULL值。 在MySQL中,MIN()函数可以对非数据列使用,在用于文本数据时,如果数据按相应的列排序,MIN()返回最前面的一行。 (5) 、SUM()函数 用来返回指定列的和 (总计) ,忽略NULL值的行。 sql print? SELECT SUM(num) AS prod_sum-返回指定订单号中的商品数量 FROM products Where order_id=123456; SUM()也可以合计计算值。 sql print? SELECT SUM(item_price*num) AS totol_price FROM order_items-返回订单中所有商品价格和。 Where order_id=123456; ...

2016-01-28 · 1 min · 104 words · -

BeforeClass、AfterClass、Before与After示例

BeforeClass、AfterClass、Before与After示例 http://www.cnblogs.com/xhzi/archive/2011/05/29/2061825.html 【测试目的】 测试加载顺序 【代码片段】 public class TestIt { private TestJUnit tju = null; @BeforeClass public static void enter() { System.out.println(“进来了!”); } @Before public void init() { System.out.println(“正在初始化。。”); tju = new TestJUnit(); System.out.println(“初始化完毕!”); } @Test public void testit() { tju.run(); } @After public void destroy() { System.out.println(“销毁对象。。。”); tju = null; System.out.println(“销毁完毕!”); } @AfterClass public static void leave() { System.out.println(“离开了!”); } } 【运行结果】 进来了! 正在初始化。。 初始化完毕! Hello,JUnit 销毁对象。。。 销毁完毕! 离开了! 【小小总结】 注意加载和执行顺序

2016-01-27 · 1 min · 71 words · -

JUnit中按照顺序执行测试

JUnit中按照顺序执行测试 @FixMethodOrder(MethodSorters.NAME_ASCENDING) MethodSorters.NAME_ASCENDING (推荐) 按方法名称的进行排序,由于是按字符的字典顺序,所以以这种方式指定执行顺序会始终保持一致; 不过这种方式需要对测试方法有一定的命名规则,如 测试方法均以testNNN开头 (NNN表示测试方法序列号 001-999) JUnit中按照顺序执行测试方式 很多情况下,写了一堆的test case,希望某一些test case必须在某个test case之后执行。比如,测试某一个Dao代码,希望添加的case在最前面,然后是修改或者查询,最后才是删除,以前的做法把所有的方法都集中到某一个方法去执行,一个个罗列好,比较麻烦。比较幸福的事情就是JUnit4.11之后提供了MethodSorters,可以有三种方式对test执行顺序进行指定,如下: /** Sorts the test methods by the method name, in lexicographic order, with {@link Method#toString()} used as a tiebreaker */ NAME_ASCENDING(MethodSorter.NAME_ASCENDING), /** Leaves the test methods in the order returned by the JVM. Note that the order from the JVM may vary from run to run */ JVM(null), /** Sorts the test methods in a deterministic, but not predictable, order */ ...

2016-01-27 · 2 min · 242 words · -

MySQL select binary

MySQL select binary BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写 如下: MySQL> select binary ‘ABCD’=‘abcd’ COM1, ‘ABCD’=‘abcd’ COM2; +—+—-+ | COM1 | COM2 | +—+—-+ | 0 | 1 | +—+—-+ 1 row in set (0.00 sec) (仅仅有些而已!4.*以前) 因为有的MySQL特别是4.*以前的对于中文检索会有不准确的问题,可以在检索的时候加上binary。 建表: create TABLE usertest ( id int(9) unsigned NOT NULL auto_increment, username varchar(30) NOT NULL default “, primary key (id) ) 插入数据: insert into usertest (username) VALUES(‘美文’); insert into usertest (username) VALUES(‘美国项目’); insert into usertest (username) VALUES(‘李文’); insert into usertest (username) VALUES(‘老唐’); ...

2016-01-27 · 1 min · 158 words · -

MySQLslap

MySQLslap MySQLslap -uuser0 -ppassword0 -concurrency=1 -iterations=1 -engine=innodb -number-of-queries=20000 -debug-info -query=“INSERT INTO xxxxxx” MySQL数据库基准压力测试工具之MySQLSlap使用实例 2013-05-20 19:04:09 分类: MySQL/postgreSQL http://www.2cto.com/database/201303/195303.html MySQL数据库基准压力测试工具之MySQLSlap使用实例 一、MySQLslap介绍 MySQLslap是MySQL5.1之后自带的benchmark基准测试工具,类似Apache Bench负载产生工具,生成schema,装载数据,执行benckmark和查询数据,语法简单,灵活,容易使用。该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。MySQLslap为MySQL性能优化前后提供了直观的验证依据,笔者建议系统运维人员应该掌握一些常见的压力测试工具,这样才能较为准确的掌握线上系统能够支撑的用户流量上限及其抗压性等问题。 <www.2cto.com> 二、使用方法介绍 可以使用MySQLslap -help来显示使用方法: -concurrency代表并发数量,多个可以用逗号隔开,例如: concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。 -engines代表要测试的引擎,可以有多个,用分隔符隔开。 -iterations代表要运行这些测试多少次。 -auto-generate-sql 代表用系统自己生成的SQL脚本来测试。 -auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的 (read,write,update,mixed) -number-of-queries 代表总共要运行多少次查询。每个客户端运行的查询数量可以用查询总数/并发数来计算。 -debug-info 代表要额外输出CPU以及内存的相关信息。 -number-int-cols : 创建测试表的 int 型字段数量 -auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始 -number-char-cols 创建测试表的 char 型字段数量。 -create-schema 测试的schema,MySQL中schema也就是database。 -query 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。 -only-print 如果只想打印看看SQL语句是什么,可以用这个选项。 三、Demo实例 下面我们使用几个demo实例来进行测试 Demo1: [root@localhost ~]# MySQLslap -uroot -p123abc -concurrency=100 -iterations=1 -auto-generate-sql -auto-generate-sql-load-type=mixed -auto-generate-sql-add-autoincrement -engine=myisam -number-of-queries=10 -debug-info ...

2016-01-21 · 3 min · 511 words · -

gradle 多项目

gradle 多项目 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test tree . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle 2 directories, 6 files 然后,创建多个模块,这里以 core 和 web 模块为例,先创建两个目录: mkdir core && mkdir web cd core && gradle init -type java-library cd web && gradle init -type java-library 修改配置 接下来修改根目录下的 settings.gradle 文件,引入子模块: include ‘core’,‘web’ ...

2016-01-20 · 3 min · 574 words · -

linux kvm nat nftables

linux kvm nat nftables nft command https://blog.wiloon.com/nft ip forward https://blog.wiloon.com/?p=13701 配置 TAP http://blog.wiloon.com/?p=13281 # nftables nat sudo nft add table ip nat sudo nft add chain ip nat post \{ type nat hook postrouting priority 0 \; \} sudo nft add chain ip nat pre \{ type nat hook prerouting priority 0 \; \} # 注意修改网段, 网卡 sudo nft add rule nat post ip saddr 192.168.60.0/24 oif wlp3s0 masquerade # 注意修改网段, 网卡 sudo nft add rule nat pre iif wlp3s0 tcp dport \{ 3389,9999 \} dnat 192.168.60.2 #sudo nft add rule nat post ip saddr 192.168.3.0/24 oif wlp3s0 snat 192.168.x.xxx save your ruleset to /etc/nftables.conf which is loaded by nftables.service sudo -s nft list ruleset > /etc/nftables.conf http://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT ...

2016-01-19 · 3 min · 537 words · -

gradle application plugin 打可执行jar, gradle executable/runnable jar

gradle application plugin 打可执行jar, gradle executable/runnable jar https://docs.gradle.org/current/userguide/application_plugin.html edit build.gradle apply plugin: ‘application’ application { applicationDefaultJvmArgs = ["-Xms512m", “-Xmx1600m”] } mainClassName = “org.gradle.sample.Main” gradle distZip applicationDefaultJvmArgs 用于配置jvm 参数 gradle executable jar, application plugin apply plugin: ‘application’ gradle installApp

2016-01-18 · 1 min · 38 words · -

JDBC 优化

JDBC 优化 http://www.infoq.com/cn/news/2017/03/Analysis-errors-MySQL-JDBC?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage 这部分与jdbc无关,是对于MySQL优化的普通技巧 利用查询缓存。不要把函数直接写在sql语句里; 当只需要一条记录时查询加上LIMIT 1; 尽量避免SELECT *这样写; 用连接池; 建索引; 更多关于MySQL的优化 MySQL性能优化的最佳20+条经验 完全优化MySQL数据库性能的八大巧方法 jdbc的优化: 尽量少用元数据方法; 尽量避免null。MySQL中对值为null情况花费更多的空间和处理而加重负担,应该指定专门的值来表示空值,在方法调用时传参也要避免null; 善用哑查询。在仅想得到表信息等而不需要返回记录的情况下,使用"select * from tableName where 1=0"这样的哑查询就能免于遍历; 善用预处理 (PreparedStatement,PreparedCall) 。PreparedStatement不但具有一次编译重复使用的优势,而且因为jdbc默认将参数以字符串形式传给数据库,而用PreparedStatement设参数则可以显式地指定数据类型,避免参数传递和来回转换的负担; Java代码 pstmt=conn.preparedStatement("insert into test_table(……) values(….?)"; [code language=""][/code] pstmt.setString(1,"aaa"; pstmt.addBatch(); pstmt.setString(1,"bbb"); pstmt.addBatch(); ….. pstmt.executeBatch(); 合理选择excute方法,杀鸡就用鸡刀。execute(String sql)方法返回一个boolean值,它执行任意复杂的sql语句,可以产生多个结果集。如果有结果产生返回 true,如果没有结果集产生或仅是一个更新记数则返回 false。它产生的结果集可以通过getResultSet()和getMoreResults()获得,更新记数可通过getUpdateCount()获得。显然execute(String sql)方法的使用要复杂一些,因此如果只是简单的查询或更新操作请使用executeQuery(String sql)和executeUpdate(String sql)方法。executeUpdate(String sql)能执行INSERT,UPDATE,DELETE语句,及DDL和DML命令 (此时返回值为0) ; 批执行更高效。stmt.addBatch(String sql); stmt.executeBatch(); 最好手动提交。不但可以可以保证数据原子性,而且对新能提高留下余地 Java代码 try{ boolean commitStat = connection.getAutoCommit(); connection.setAutoCommit(false); // TODO: 用PreparedStatement 性能比Statementh好. connection.commit(); connection.setAutoCommit(commitStat); } catch(SQLException e){ } finally{ ...

2016-01-15 · 1 min · 118 words · -

cygwin 默认英文环境

cygwin 默认英文环境 搜索结果里充斥着大量让cygwin显示中文的文章以及各种版本转载,我不知道转载这些文章的同学到底自己亲自试验过没有,显示出来的中文往往只显示一半,这样也能算能显示中文了?这么多坑爹的结果,却没有一个告诉大家怎么使用英文界面的方法? 目前的cygwin的shell界面往往是由windows的localization设定决定的,所以如果你将local设定为中国,那么界面默 认都是已经能显示中文的了。但cygwin的中文显示,不但老是出问题,而且也不好看。所以将其界面直接改变成英文,倒也是一个不错的选择之一,只不过这 里提醒大家,你的目录或者文件有很多中文名的,那么最好还是显示中文的比较好,虽然可以让英文shell显示中文,但是显示还是不好看。 让cygwin shell使用英文界面只用在~/.bashrc这个文件里面加上一句话: export LANG=‘en_US’ 如果想使用其他界面,把en_US改成其他语言对应的地区代码就行了,比如说zh_CN。其实LANG的"完全体"是"地区.编码"这样的结构。所以如果要想自己设置编码,还需要在zh_CN的后面加上编码——这里用GBK来说明——使其变成zh_CN.GBK。在这里我们要让界面是英文同时能让中文也能显示,所以将LANG设置成en_US.GBK。 到此界面语言修改完成,简单吧?事情没那么简单,在cygwin下面,只做这样的设置,会让vi等软件出现匪夷所思的现象,难道是……打开方式不 对?No,其实语言的设置还没完。执行locale命令,会返回给你目前所有语言设置,可以说有关语言设置的项目还是挺丰富的嘛,LC下还有许多要设置 的,不过LC下面有一个LC_ALL,看样子设置他就行了,.bashrc加上一句: export LC_ALL=‘en_US.GBK’ Bingo!重启cygwin之后,vi恢复正常行为。 转载自 http://hi.baidu.com/chrisyue/blog/item/41225fe79cedb33db838207a .html

2016-01-14 · 1 min · 20 words · -

MySQL Fabric

MySQL Fabric http://www.2cto.com/database/201408/327941.html Oracle在今年5月推出了一套为各方寄予厚望的MySQL产品 - MySQL Fabric,从字面上不太能看出它是啥,但是从名称上还是有迹可循的。fabric是"织物"的意思,这意味着它是用来"织"起一片MySQL数据库。MySQL Fabric是一套数据库服务器场(Database Server Farm)的架构管理系统。 MySQL Fabric是什么? MySQL Fabric能"组织"多个MySQL数据库,是应用系统将大于几TB的表分散到多个数据库,即数据分片(Data Shard)。在同一个分片内又可以含有多个数据库,并且由Fabric自动挑选一个适合的作为主数据库,其他的数据库配置成从数据库,来做主从复制。在主数据库挂掉时,从各个从数据库中挑选一个提升为主数据库。之后,其他的从数据库转向新的主数据库复制新的数据。注意: 这里说的"自动"是指由MySQL Fabric在后台完成,而不需要用户手动更改配置。最重要的是,MySQL Fabric是GPL的开源软件,也就是在符合GPL的规范下,你可以自由的使用和修改这个软件。MySQL Fabric要解决的问题 为什么做数据分片?当你的应用需要处理的表大于1TB的数据时,Data Shard常常是必须的。这么大的表,无论在查询、更新的效率上,或者是备份、更改结构所需要的时间上,都会造成很大的问题。然而当你将这么大的表分散到多个数据库服务器上,又会使每一台数据库服务器都有可能是单个故障点。只要有一台挂掉就会使整个系统的操作发生问题。另一方面,应用端的程序也会因为每个查询都要依其查询条件(where子句的内容)分别指向不同的数据库而变得更加复杂。再者,当数据分片的结构改变时(例如增加一个数据库),会使应用端的所有程序都必须修改,从而导致维护变得极为复杂。为了解决应用程序复杂度增加的问题,有人在应用程序和数据库服务器之间增加一个代理(proxy)或者成为switch,应用程序所有对数据库的指令先送到proxy,再由proxy判断要转到哪个数据库。下图就是这个方案的示意图。这也许可以解决应用程序难以维护的问题,但是当应用端的数量增加,数据库分片增加,或者系统压力增加时,这个switch会成为容量及性能的瓶颈和单点故障(当它宕掉时,应用端找不到数据库),而且所有的数据库指令均需要传两次(先到switch再到数据库)。每个查询都会造成额外的负荷。 MySQL Fabric的架构 MySQL Fabric采用不用的做法,其架构如下图所示。主要的特点是把switch合并到各应用端的connector中,以解决单一switch的单点故障和性能瓶颈。 MySQL Fabric由三个部分构成: 1.MySQL Fabric管理节点: 是一个python脚本,是整个架构的核心。MySQL Fabric管理节点主要的功能是管理整个数据库服务器场(Database Server Farm),它启动时会找/etc/MySQL/fabric.cnf这个配置文件,由它指定fabric背后当成存放Server Farm架构和配置之repository的MySQL数据库位置、端口和连接账号等信息。Fabric在初始化时(执行MySQLfabric manage setup命令),会在MySQL数据库上开一个schema(通常是名称为fabric的database),存放Server Farm的配置相关信息,如哪些服务器组由哪些数据库构成,各服务器组中的主从服务器分别是哪些,等等。MySQL Fabric节点在设置配置时,会对Server Farm中各数据库下达建立主从复制的命令(上图的红色线条)。在正常运行时定期ping各组的主服务器 ,当发现主数据库没有正常运行时,它会启动故障转移程序,在该server farm的从数据库中找一个合适的提升为主服务器。其他的从数据库则转向新的主数据库继续复制数据。 数据库服务器场(database server farm) 这是整个架构中的工作引擎,在传统的数据库应用中这是单一的MySQL数据库,MySQL Fabric则是以多个数据库支持大数据量表(TB级以上)和高可用性数据库的需求。这些数据库分成几个高可用组(HA Group),每个组包含一个以上的数据库服务器,上图中最下面的几个灰色和浅蓝色的方块代表高可用组。如果高可用组中有多个数据库,MySQL Fabric会挑选(使用命令MySQLfabric group promote命令)一个提升为主数据库(Master),其他数据库则成为从数据库(Slave),从数据库复制主数据库的变化,完成设定同一高可用组内的主从复制。以后,Fabric会定期件事这个主数据库。当主数据宕掉之后,Fabric会从高可用组内挑选一个提升为主数据库,其他的数据库会转向这个新的主数据库继续复制。另一方面,MySQL Fabric也会只是应用端的conector对这些主从数据库做读写分离,当应用程序对数据库做读写兼有的操作时,connector会将该指令提交给主数据库。如果应用程序只会对数据库进行读操作,且连线的read_only参数设置为"ON",则所有的查询均轮流传送到这几个数据库。借助读写分离,应用系统的资料处理能力得以增加。此外,如前面所述,MySQL Fabric还能处理需要拆分到多个数据库服务器的表(sharding tables),每一个高可用组都可能存放shard table的部分数据。应用端的connector会将对shard table的指令依MySQL Fabric的管理节点的设定送到不同的高可用组,这样可使数据库的容量随着高可用组的数量增加而增长。同时,对非拆分的表所下的指令和所有的DDL会由connector送到全局高可用组(global group),全局高可用组的主数据库被MySQL Fabric设置为其他高可用组的主数据库。所有存拆分表的高可用组的主数据库复制global group的变化,这么一来其他高可用组都有一份非拆分表的资料。从而使得SQL中拆分表对非拆分表的JOIN操作变得更简单。3. Connector 应用系统在运行时,每个SQL指令都会经由connector发送到数据库。MySQL Fabric所搭配的connector和一般使用单机的MySQL数据库一样,只是在较新版的connector是fabric aware connector多了一些能处理数据库服务器场(database server farm)的功能。使他们能在建立数据库连接时,以XML-RPC协议检查MySQL Fabric的管理节点中server farm的配置,然后通过该连接下的查询可依fabric的指示送到适合的数据库。如此一来,常见的database shard方案中可能造成性能瓶颈的proxy放到connector中,从而解决了这个问题。目前MySQL Fabric支持的技术有java、python、PHP,即Connector/J、Connector/Python和Connector/PHP都是Fabric-aware。以java为例,JDBC driver必须是Connector/J 5.1.30以后的版本,Fabric的Java程序和一般对单机MySQL的查询的Java程序差不多,只是在建立database connection object时database connection URL不是指向数据库,改为指向MySQL Fabric管理节点(服务器的IP和端口通常是32274)。当查询的表时全局表(不做table shard)或DDL(例如建表或改表结构)时,建立connection object的要加上"fabricServerGroup=“参数,之后通过这个connection object所下的SQL指令会送到Global Group的主数据库,再由数据库复制到其他的高可用组(shard)中。如果SQL命令所要操作的表时分区表(shard table),则建立connection object时要在参数加上"fabricShardTable=“参数,之后通过这个connection object所下的SQL命令会根据MySQL Fabric所设定的分表(shard)原则送到各分区(shard)的高可用组。这样一来,应用程序对这些shard table下的SQL指令时,不需要在SQL中判断要送到哪个数据库,完全由connector在建立数据库连接时向MySQL Fabric所查到的server farm的配置信息(哪个数据库属于哪个shard group,各shard table的拆分原则等)所决定。而且这个配置在建立主连接后就缓存在Connector所在的应用端。这样,在每次下SQL指令时就不需要重复查询MySQL Fabric管理节点,而依存于应用端的分表配置直接送到正确的数据库。而应用程序的效率不会因为做了表的拆分而有任何降低。结语 ...

2016-01-12 · 1 min · 96 words · -

MySQL默认排序

MySQL默认排序 SELECT * FROM tbl – this will do a “table scan”. If the table has never had any DELETEs/REPLACEs/UPDATEs, the records will happen to be in the insertion order, hence what you observed. 大致意思为,一个myisam引擎表在没有任何的删除,修改操作下,执行 select 不带order by,那么会按照插入顺序进行排序。 If you had done the same statement with an InnoDB table, they would have been delivered in PRIMARY KEY order, not INSERT order. Again, this is an artifact of the underlying implementation, not something to depend on. 对于innodb引擎表来说,在相同的情况下,select 不带order by,会根据主键来排序,从小到大

2016-01-12 · 1 min · 78 words · -