`
刘方然
  • 浏览: 30102 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
文章列表
最近在工作中遇到这样一个问题:多个数据库实体(以下简称“左侧实体”)要同另一实体关联。关于关联表的设计有如下两种方案。(业务背景是,多种实体有同样的权限控制模型)。   方案1:为每个左侧的实体建立一张与另一实体的关联表。 方案2:只建立一个关联表,完成多个实体对另一实体的关联。需要使用额外的字段存储左侧实体类型。   乍一看,两种方式各有优缺点:某一方案的优点即另一方案的缺点,这里只列出缺点。  
一般的系统总是由小到大发展的。一开始使用一个数据库,而后逐渐扩展。在分库过程中经常使用对特定的键值进行hash的办法进行分库分表。但是使用hash来进行分库分表,在具体的应用中可能不能满足需求。比如,在SAAS平台下,不同租户的数据量是千差万别的,根据二八现象,20%的租户可能占用了80%的存储资源。如果使用hash算法,很可能导致数据分布不均匀。 这里提出一个分库分表算法,解决SAAS平台下,数据存储的二八现象。 元数据准备 1. 业务数据按照租户ID进行分库。 2. 用一张表存储,租户ID->虚拟库ID的映射关系,(可在启动后,导入内存)。 3. 用另一张表存储,虚拟库ID-> ...
Eclipse的Dynamic Web Project支持直接热部署。通过部署到Eclipse内嵌的Server,可以立即看到修改后的效果,非常好用。Maven提供的依赖管理,便利的打war包命令,也非常好用。 现在已经有很多如何让Maven支持热部署的方式,但是貌似我还没有找到让Eclipse的Dynamic Web Project结合Maven的资料。如果贸然将一个pom.xml丢进工程目录,用maven打包的时候,会出现如下问题: 1. 找不到由项目依赖引入到类(这个问题不论是否和Maven整合,都会有,之前都是通过ant脚本,把依赖的工程打成jar包,再部署到WEB-INF/lib解决 ...
在对Tomcat的多次压力测试中,在配置-Xmx512m情况下,发送25万多条,就会导致内存耗尽,频繁Full GC(最后几乎不能再响应任何请求,一直在Full GC),说明内存没有释放。尝试了Tomat 6.0.20和7.0.5,行为一致。开始猜测如下两种可能 1. 内存泄漏 2. 每次请求都消耗了一定资源(约2.5k),需要等待session过期才能释放。 第一种可能性只是猜测,毕竟Tomcat已经久经考验。接下来,试图证实第二种可能性。 使用ApacheBench压测Tomcat 7.0.5。请求的是一个小JSP文件。 之前的多次测试,确认在AMD Tourion双核1.8G Hz ...
在Win7下,用tortoiseSVN,update时,几乎每次都报如下错误   Cant’ move xxx\.svn\tmp\entries to xxx\.svn\entries   尝试了1. 清空整个目录,重试2. clean up3. 升级TortoiseSVN到最新版4. 关闭360文件实施监控   问题依旧。 最后发现了篇博文 http://hi.baidu.com/wangshunyun/blog/item/4977a4c3aeaf695ab319a894.html   原来是 Win7的索引服务(Indexing)惹的祸。 去掉对应目录的索引服务后,一切 ...
最近在做一个基于RMI的可扩展框架。由于Spring很是方便,便打算用Spring的RMI特性。但是在实现如下场景时,出现了问题:程序客户端希望通过RMI获取远程服务Master的Stub,而且要以远程调用的方式使用Master提供的Service。   public class Client { Master master; // 由Spring RmiProxyFactoryBean获得。 public void someMethod() { Service service = master.getService(); ...
日志滚动是log4j简单好用的功能,只需要简单配置一个RollingFileAppender就可以了。在使用RollingFileAppender的时候,大家都会以为,日志将在临晨零时作日志切换,原来的日志文件被改名,新的日志文件被创建。这是个很合理的“想当然”推断。 但是事实不是这样的。日志的切换并不一定发生在零点,而是发生在:次日第一条日志写入的时候。网上几乎查不到RollingFileAppender日志文件切换的准确描述,基本上都是“想当然”的版本。 发现这个细节,完全出自巧合。一个被配置为日滚动的配置文件被一个清理老旧日志的脚本无端删除。我原本的想法是,由于配置了日滚动,那么文件将在每 ...
在实际的系统中,常常有这样的场景:把一个任务丢到一个任务队列(Task Queue)中,由另一个或多个线程异步执行。此时又想控制队列的大小(防止内存溢出或是业务逻辑需要);丢弃最老的任务,保护系统。 一般的做法是: ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize, maxPoolSize, 10000, TimeUnit.NANOSECONDS, new ArrayBlockingQueue<Runnable>( limitSize), new ThreadPoo ...
今天在写一个流量控制的模块,要做一个根据输入的时间,获得下一天0点0分0秒的时间戳。 public long caculateResetTimestamp(long currentTimestamp) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(currentTimestamp); cal.clear(Calendar.MILLISECOND); cal.clear(Calendar.SECOND); cal.clear(Calendar.MINUTE); cal.clear ...
Global site tag (gtag.js) - Google Analytics