- 浏览: 1277669 次
- 性别:
- 来自: 北京
最新评论
-
最后的攻城狮:
这也太乱了
mybatis与spring事物处理日志 -
leo_soul:
现在不能跨1级域名了吧?比如www.aaa.com,www.b ...
Cookie跨域操作 -
zy976133:
怎么解决的
jaxws不支持SOAPBinding.Use.ENCODED -
cuiyaoqiang:
你好 开发一个http接口给fs调用 ,这个http接口是自己 ...
freeswitch 动态加载号码 -
Jackromer:
请问楼主知道如何通过主控方来删除与其有关的中间表记录? 谢谢, ...
hibernate 多对多只删除中间表数据
文章列表
系统架构中数据库的设计
- 博客分类:
- web开发
架构师往往是有前瞻性的
这个前瞻性是在很多项目经验的基础上总结的
数据库设计中有三个范式,我们在设计时要不要遵守呢?
我认为你只要知道有这么个概念就行了
实际项目中按范式搞会害死人的
-----------------------------------
回到正题
有一个项目访问量不大,业务很复杂,问数据库设计应该怎么做?
一定要业务优先,怎么样设计能够让你的业务处理起来更方便就怎么设计
不需要考虑性能 范式这些东西
同样是这个项目,如果访问量巨大,那么数据库的设计可能就完全不一样了
可能需要考虑动态数据静态数据分离,垂直切分, 水平切分等
------------------------- ...
两个C++类之间要互引用可不想java那么方便
我们来看一下吧
A.h
class A
{
B* b;
};
B.h
class B
{
A* a;
}
在java 中这样应该就可以了
可是该死的C++不行
需要用到一个叫‘预定义’的玩意
就是在用class B之前先说明一下
如下:
A.h
class B; //预定义
class A
{
B* b;
};
B.h
class A; //预定义
class B
{
A* a;
}
这下就行了
聪明的人,容易不务实 这是杜书伍说的
这里讲的聪明人是指智商方面的
========================
聪明人的逻辑推理能力比较强,你说个开头他能给你说出结尾,并且往往是正确的
聪明人反应比较快,因此在跟同事合作时会觉得他们反应很慢,自觉不自觉的会表露出轻蔑、不耐烦的情绪
但是逻辑推理这种事情是‘静态的’,跟程序一样 输入A 就会输出B 输入C就会输出D
而真正务实的事情都会收到环境和人的影响,而这两个因素是‘动态的’,推理在这儿不管用
尤其是人的因素更是不可捉摸,那么动态的务实我们如何掌握呢?有没有捷径呢?
很遗憾的告诉大伙,没有捷径!
举例说明吧
我们要对某手机开发一 ...
typedef常用格式为:
typedef int INT;
但用在定义函数指针时就不是这样了
typedef char (* PFUN)(int);
这样就定义了一个函数指针类型PFUN
char test(int a){return 'a';}
char sddd(int a){return '5';}
这些函数都满足PFUN类型
用法:
PFUN pFun;
pFun = test;
pFun(3);
最近研究C++
先从最基本的概念理解
编译:
编译就是把源文件编译成目标文件,其主要工作是检查语法、函数与变量声明正确
编译只需要头文件即可,不需要函数的实现
编译的产出是一系列的.obj文件或者叫中间目标文件
链接:
链接是把这些中间目标链接成一个可执行的文件(.exe),其主要的工作是寻找函数的入口
如函数A中引用了函数B,那么链接程序需要定位函数B的位置并告知函数A
lib文件
搞过java的都知道jar包,lib文件类似jar包,但同时必须配合.h文件一起使用
lib实际上是对.obj文件打了包 仅此而已
把知道的java内存结构简单缕一缕
主要有这个几个
方法区
堆(分代的)
这两个算是比较清晰的
还有一个不大清晰的 JVM方法栈
方法区就是存放Class信息的 如类的继承层次,类的静态变量 有哪些字段 哪些方法等等
这块内存通过permSize maxPermSize来指定其大小
堆是保存对象的内存空间,你创建的每个对象都保存在堆中
堆的大小通过-Xms -Xmx来控制大小 通常设置
-Xms == -Xmx
堆是分代管理的,有新生代和旧生代
新创建的对象放在新生代,经过几轮GC仍然存活的会转到旧生代
大对象也可能直接分配到旧生代,至于多大要用-XX:PretenureSizeThres ...
很讨厌webservice框架配置的繁琐
尤其是axis系列
一怒之下直接用servlet开发了
其实也很简单,关键是要获取到请求soap和响应soap,可借助soapUI来生成
soapUI的使用这里不做介绍
生成请求soap和响应soap后关键就是解析soap了
直接用的java提供的API来解析
解析请求Soap
代码如下:
public class SyncNotifySPReqDecoder {
private static Logger logger = LoggerFactory.getLogger(SyncNotifySPReqDecoder.class);
pu ...
想看一下List序列化后占用多少个 字节,测试程序如下:
public static void main(String[] args) throws IOException{
int n = 2000;
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < n; i++) {
list.add(i);
}
System.out.println("元素数:" + list.size());
ByteArrayOut ...
telnet localhost 11211
流量统计
stats
内存统计
stats slabs
item统计(Items Statistics)
stats items
源:http://articles.itecsoftware.com/web-development/testing-memcached-using-telnet-commands
linux上下文切换是指在进程的时间片用完 进程睡眠 进程阻塞 进程被抢占等事件发生导致当前进程不能继续占用cpu,而是切换另一个进程继续执行的过程
上下文切换时要保存当前进程的状态,装载另一进程的状态,这个会占用cpu
如果上下文切换过于频繁会浪费大量cpu时间,从而导致程序性能低下
同步IO与异步IO的区别
首先要明确一点:不同IO模型之间的差别本质上是CPU的参与方式
这里重点说一下各自的应用场景
如何选择同步还是异步呢?
主要有这么几个指标供参考
1. 并发数量
2. 接收字节数
3. 处理请求所需CPU时间
我们一个一个来考察
并发数
并发低的时候同步IO与异步IO差别不大
并发高时差别会比较明显,这要表现在
1. 开启线程数:如并发1000时,同步IO要开启1000个线程,1000个线程要占用很多内存,这是其一,其二1000个线程间切换的时间也是很可观的;异步IO则可避免这个问题
接收字节数
接收字节越少被阻塞的概率越低,同步IO与异步IO的差别就越小
...
java 中的synchronized关键字是悲观锁 也叫独占锁
所谓悲观锁就是某一线程独占资源,其他线程只能干等着,这种锁在高并发中性能很差
还有一种实现锁的方式是乐观锁
乐观锁实际上并不加锁,当计算遇到冲突或者说前后不一致时会重试 直到成功
乐观锁采用的机制叫CAS compare and swap
CAS有3个操作数 内存值V 要跟内存值做比较的值A 和 新值 B
其操作逻辑为
while(true){
if(V == A){
V = B;
return ;
}else{
A = V;
}
}
CAS的操作对象为volatile类型
volatil ...
字面意思是倒计时类
类名其实说的很形象,倒数到0时线程解除阻塞,继续往下执行
测试类
public class TestCDL {
private static CountDownLatch countDownLatch = new CountDownLatch(3);
public static void test(){
Thread thread = new Thread(){
@Override
public void run() {
try {
//阻塞在这儿了
countDownLatch.await();
} ca ...
package net.rubyeye.xmemcached.example;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeoutException;
import net.rubyeye.xmemcached.KeyIterator;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.Memcac ...
java中的io与nio主要区别在于阻塞上
io采用的是阻塞
nio可自定义
阻塞与非阻塞到底有什么不同?其底层是怎么实现的呢?
从内核的角度来理解,就是进程的阻塞 运行状态的切换
阻塞实际上是进程在等待资源,而资源没有就绪( ...