摘要: 介绍当分布式系统编程成为你生活中的一部分时,你需要经历一段学习曲线。这篇文章描述了一下我当前在这个领域大致属于哪个层次,并希望能为你指出足够多 的错误,从别人的错误中学习,从而使你能以最优的路径通向成功。先声明一下,我在1995年时达到第1级,我现在处于第3级。你自己属于哪一级呢?第0级:完全一无所知每个程序员都从这一级开始。我不会在此浪费太多口舌,因为这实在没什么太多可说的。相反,我会引用一些我曾经经历过的对话,为从未接触过分布式系统的开发者们提供一些建议。对话1:NN:“在分布式系统中,复制是个很容易的操作,你只需要让所有的结点同时存储你要复制的东东就行了”。另一段对话(从我记忆深处挖出来 阅读全文
posted @ 2013-11-27 11:02 Jevo 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 基本概念 领域驱动设计(简称 DDD)概念来源于2004年著名建模专家Eric Evans发表的他最具影响力的书籍:《Domain-Driven Design –Tackling Complexity in the Heart of Software》(中文译名:领域驱动设计—软件核心复杂性应对之道)一书。,书中提出了“领域驱动设计(简称 DDD)”的概念。 领域驱动设计一般分为两个阶段: 1. 以一种领域专家、设计人员、开发人员都能理解的“通用语言”作为相互交流的工具,在不断交流的过程中发现和挖出一些主要的领域概念,然后将这些概念设计成一个领域模型; 2. 由领域模型驱动软件设计,用代码来. 阅读全文
posted @ 2013-11-05 20:56 Jevo 阅读(3488) 评论(0) 推荐(0) 编辑
摘要: Java多线程总结 有几天未写博客了,虽然在网络上一搜Java多线程主题有许多的结果,而且有许多深入讲解Java多线程的文章,仍想自己简单总结一下多线程。 线程的生命周期是指从线程创建、运行到消亡的整个过程。线程的状态可以表明线程处于生命周期具体那一阶段。线程的状态包括:创建、就绪、运行、阻塞、死亡五个状态。 线程状态间的转化,引用一张网上的图来说明:Java多线程基本概念 Java多线程的编程主要通过几个基础类来完成的:Thread、Runnable、Object对象的wait()、notify()、notifyAll()方法、synchronized关键字以及Java 5.0后引入的一些多 阅读全文
posted @ 2013-09-29 14:06 Jevo 阅读(771) 评论(0) 推荐(0) 编辑
摘要: 通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作)。当读取者完成对表的操作的时候,锁就会被解除。如果写入者正在等待的时候,另一个读取操作到达了,该读取操作也会被阻塞(block),因为默认的调度策略是写入者优先于读取者。当第一个读取者完成操作并解放锁后,写入者开始操作,并且直到该写入者完成操作,第二个读取者才开始操作。 通过LOCK TABLES和UNLOCK TABLES语句可以显式地获取或释放锁,但是在通常情况下,服务器的锁管理器会自动地在需要的时候获取锁,在不再需要的时候释放. 阅读全文
posted @ 2013-09-11 21:51 Jevo 阅读(7976) 评论(1) 推荐(1) 编辑
摘要: 在分析性能欠佳的查询时,应考虑: 1) 应用程序是否正获取超过需要的数据,即访问了过多的行或列。 2) Mysql服务器是否分析了超过需要的行。 如果发现访问的数据行数很大,而生成的结果中数据行很少,那么可以尝试修改,比如使用覆盖索引、更改架构或重写查询让优化器可以以优化的方式执行它。 优化最终集中在减少IO,降低CPU,提高查询速度。 一般应用中数据库通常是IO密集型的,大部分数据库操作中超过90%的时间是由IO操作所占用,所以减少IO访问次数是SQL优化中首要考虑的因素。除了IO外,需要再考虑优化CPU的运算量。通常,ORDER BY、GROUP BY、DISTINCT和一些比较运算都是主 阅读全文
posted @ 2013-09-06 22:10 Jevo 阅读(2203) 评论(0) 推荐(1) 编辑
摘要: 1.如果索引了多列,遵守最左前缀法则。所谓最左前缀,指的是查询从索引的最左前列开始,并且不跳过索引中的列。mysql> explain select uid, fuid, name from ptb where uid=1378109017;+----+-------------+-------+------+---------------+----------+---------+-------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | 阅读全文
posted @ 2013-09-05 22:17 Jevo 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 1. 优化数据库对象1)选择表合适存储引擎:MyISAM存储引擎: 应用时以读和插入操作为主,只有少量的更新和删除,并且对事务的完整性,并发性要求不是很高的。 * 表锁:MyISAM表有表级锁,注意不要让它成为瓶颈。 * 不支持自动数据恢复:如果MySQL服务器崩溃或掉电,就应该在使用之前进行检查和执行可能的修复。如果有大型表,这可能会花几个小时。 * 不支持事务:MyISAM表不支持事务。实际上,MyISAM甚至不保证单个命令完成。如果在多行UPDATER的中途有错误发生,一些行会被更新,而另外一些行则不会。 * 只有索引被缓存在内存中:MyISAM只缓存了MySQL进程内部的索引,并保存在 阅读全文
posted @ 2013-09-03 22:26 Jevo 阅读(716) 评论(0) 推荐(1) 编辑
摘要: 在MySQL中,联接是一种对表的引用,多表联接类型:1.笛卡尔积(交叉联接):在MySQL中为CROSS JOIN或省略JOIN,如: select * from course, teachcourse; -- 隐式交叉联接或者select * from course join teachcourse或 select * from course cross join teachcourse; 返回结果为被连接的两张表的乘积。因此当有WHERE,ON或USING条件时一般不建议使用。因为数据多太时查询会很慢。一般使用LEFT [OUTER] JOIN或者 RIGHT [OUTER] JOIN。 阅读全文
posted @ 2013-09-02 21:51 Jevo 阅读(758) 评论(0) 推荐(0) 编辑
摘要: 一.MySQL逻辑架构 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。 第二层值得关注。这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,行计划优化, query cache 的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视 图等。 第三层包括了存储引擎。通常叫做StorEngine Layer ,也就是底层数据存取操作实现 阅读全文
posted @ 2013-08-28 21:10 Jevo 阅读(535) 评论(0) 推荐(0) 编辑
摘要: EXPLAIN语句可以用作DESCRIBE的一个同义词,或获得关于MySQL如何执行SELECT语句的信息:EXPLAIN tbl_name是DESCRIBE tbl_name或SHOW COLUMNS FROM tbl_name的一个同义词。· 如果在SELECT语句前放上关键词EXPLAIN,MySQL将解释它如何处理SELECT,提供有关表如何联接和联接的次序。 借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。还可以知道优化器是否以一个最佳次序联接表。为了强制优化器让一个SELECT语句按照表命名顺序的联接次序,语句应以S 阅读全文
posted @ 2013-08-27 22:48 Jevo 阅读(787) 评论(1) 推荐(0) 编辑
摘要: MySQL Query Profiler, 可以查询到此 SQL 语句会执行多少, 并看出 CPU/Memory 使用量, 执行过程 System lock, Table lock 花多少时间等等.从启动Profile之后的所有查询包括错误语句都会被记录。mysql的sql语句优化也可以使用explain,但是执行计划是没有办法知道详细的Memory/CPU等使用量。 SHOW PROFILE [type [, type] ... ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]]type: ALL | BLOCK IO | CONTEXT SW 阅读全文
posted @ 2013-08-26 19:10 Jevo 阅读(1031) 评论(0) 推荐(0) 编辑
摘要: MySQL提供标准的SQL模式匹配,SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。。关于SQL模式匹配:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matching1.MySQL仅仅支持多数正则表达式实现的一个很小的子集。2.SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。;而REGEXP使用扩展正则表达式匹配列值的子串,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。注意使用SQL模式时,不能使用=或!=;而应 阅读全文
posted @ 2013-08-25 19:58 Jevo 阅读(1064) 评论(0) 推荐(0) 编辑
摘要: mysql日志的种类,一般来说,日志有五种,分别为:错误日志:-log-err (记录启动,运行,停止mysql时出现的信息)二进制日志:-log-bin (记录所有更改数据的语句,还用于复制,恢复数据库用)查询日志:-log (记录建立的客户端连接和执行的语句)慢查询日志: -log-slow-queries (记录所有执行超过long_query_time秒的所有查询)更新日志: -log-update (二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用)官方文档:http://dev.mysql.com/doc/refman/5.1/zh/database-adm 阅读全文
posted @ 2013-08-24 19:26 Jevo 阅读(27391) 评论(0) 推荐(3) 编辑
摘要: 1.通过mysqldump命令进行数据备份 mysql数据库的备份采用直接打包数据库文件夹(注:InnoDB引擎不支持直接拷贝数据文件备份数据库,由于使用InnoDB引擎的库或表是不能使用此种方式);或者使用专用的导出工具mysqldump。 通过mysqldump命令可以将指定的库、表或全部的库导出为SQL脚本。A.数据导出: 格式1:导出指定库中的部分表 • Mysqldump[选项]库名 [表名1][表名2] . .>/备份路径/备份文件名 格式2:导出一个或多个完整的库(包括其中所有的表) • Mysqldump[选项]--databases库名1[库名2]… >/备份路径 阅读全文
posted @ 2013-08-23 22:16 Jevo 阅读(689) 评论(0) 推荐(0) 编辑
摘要: MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。一、整型 整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT这两种整数类型。MySQL数据库除了支持这两种类型外,还扩展支持了TINYINT、MEDIUMINT和BIGINT。 各种整数类型的取值范围、存储的字节数如下:整型字节数无符号数的取值范围有符号数的取值范围TINYINT10~255128~127SMALLINT20~65535-32768~12767MEDIUMINT30~16777215-8388608~8388607INT40~4294967295-2... 阅读全文
posted @ 2013-08-23 09:01 Jevo 阅读(963) 评论(0) 推荐(0) 编辑
摘要: MySQL的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。 字符(Character)是指人类语言中最小的表义符号。给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符'A'赋予数值0,给字符'B'赋予数值1,则0就是字符'A'的编码; 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{'A' 阅读全文
posted @ 2013-08-22 21:54 Jevo 阅读(830) 评论(0) 推荐(0) 编辑
摘要: 自定义函数的格式:CREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_bodyfunc_parameter: param_name typetype: Any valid MySQL data typecharacteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MO 阅读全文
posted @ 2013-08-21 22:55 Jevo 阅读(4334) 评论(0) 推荐(1) 编辑
摘要: 触发器是一种特殊的存储过程,是嵌入到mysql的一段程序,它在插入,删除或修改特定表中的数据时触发执行。 数据库触发器有以下的作用:1.安全性。可以基于数据库的值使用户具有操作数据库的某种权利,允许或限制对表的修改: # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。 # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。2.提供审计和日志记录。例:跟踪用户对数据库的操作。 # 审计用户操作数据库的语句。 # 把用户对数据库的更新写入审计表,更新日志记录。3.实现复杂的数据完整性规则 # 实现非标准的数据完整性检查和约束。触发器可产生比规则. 阅读全文
posted @ 2013-08-21 21:55 Jevo 阅读(6553) 评论(0) 推荐(0) 编辑
摘要: 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。 存储过程通常有以下优点: (1)存储过程在服务器端运行,执行速度快。 (2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。 (3)确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。 (4) 存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算. 阅读全文
posted @ 2013-08-20 21:25 Jevo 阅读(4956) 评论(1) 推荐(1) 编辑
摘要: MySQL授权系统主要通过五个表(user、db、host、tables_priv和columns_priv)来实现,其中用于访问数据库的各种用户信息都保存在mysql库的user表中。账户权限信息被存储在mysql数据库的user、db、host、tables_priv、columns_priv和procs_priv表中。 user表——该表决定是否允许用户连接到服务器。如果允许连接,权限字段则为该用户的全局权限。 db表——用于决定哪些用户可以从哪些主机访问哪些数据库。包含在db表中的权限适用于这个表标识的数据库。 host表——当您想在db表的范围之内扩展一个条目时,就会用到这个表。举例 阅读全文
posted @ 2013-08-20 09:01 Jevo 阅读(10210) 评论(0) 推荐(1) 编辑
摘要: 一、数据库操作1.创建数据库:Mysql> CREATE DATABASE databaseName;Mysql数据库的数据文件默认存放在/usr/local/mysql/var/目录下,每个数据库对应一个子目录,用于存储数据表文件;新建的空数据库在/usr/local/mysql/var/目录下会自动生成一个与新建的库名相同的空文件夹。例:mysql> create database testdb; mysql> create database if not exists testdb; mysql> create schema if not exists stude 阅读全文
posted @ 2013-08-20 09:01 Jevo 阅读(10423) 评论(0) 推荐(1) 编辑
摘要: 预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name;PREPARE语句用于预备一个语句,并赋予它名称stmt_name,借此在以后引用该语句。预编译SQL的存活期就是当前的会话,也就是当前的数据库连接。如果连接一断开 ,那就会消失。例:mysql> desc tb;+-------+------------------+------+- 阅读全文
posted @ 2013-08-19 12:06 Jevo 阅读(2376) 评论(0) 推荐(0) 编辑
摘要: 首先,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。 创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如: CREATE TEMPORARY TABLE 表名 (…. ) 临时表使用有一些限制条件: * 临时表在 memory、myisam、merge或者innodb上使用,并且不支持mysql cluster簇); show tables语句不会列出临时表,在information_schema中也不存在临时表信息;show create table可以查看临时表;.. 阅读全文
posted @ 2013-08-16 17:41 Jevo 阅读(55354) 评论(1) 推荐(2) 编辑
摘要: 一、数据库查询1.查看当前服务器所有的库:Mysql> SHOW DATABASES; //列出当前Mysql中包含的库,经过初始化后的MySQL服务器,默认建立了三个库:test、mysql和information_schema(其中mysql库中包含了用户认证相关的表)设置新的最大连接数为200: mysql> set GLOBAL max_connections=200显示系统中正在运行的所有进程,也就是当前正在执行的查询: mysql> show processlist大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密 阅读全文
posted @ 2013-08-15 21:21 Jevo 阅读(933) 评论(0) 推荐(0) 编辑
摘要: 根据Debian的官网说明, Debian的安装有几种方式:一、光盘安装:适用于有安装光盘以及主板不是很新的时候。二、网络安装:适用于有网络,主板支持USB启动的情形,需要一张U盘来引导系统。适用于比较新的主板。三、USB安装:适用于没有网络,但主板支持USB启动的情形。四、硬盘安装官网安装手册:http://www.debian.org/releases/sarge/arm/index.html.zh_CN这里最方便的安装方式应该是光盘和网络安装.光盘安装需要下载一个可开机的光盘映像文件,它包含一个基本的安装系统,只下载整个安装系统所需的软件包,也可以下载一个完整的光盘映像文件,这里可只选取 阅读全文
posted @ 2013-06-13 17:57 Jevo 阅读(4445) 评论(0) 推荐(0) 编辑
摘要: Web集群是由多台Web服务器主机相互联结而形成的一种服务器体系结构,包括WEB负载均衡和HTTP Session失效转移。Web集群的一般结构主要由负载均衡器和后端多个Web节点组成,负载均衡器可以是软件也可以是硬件,Web节点可以是同构或异构的服务器。用户访问请求首先进入负载均衡器,由它根据负载均衡策略将请求分配给后端某个Web应用节点。对使用软件的负载均衡,我们可以使用lvs搭建Web服务器集群,也可以使用Apache+Tomcat或Nginx+Tomcat集群方案。在Apache+Tomcat或Nginx+Tomcat集群方案中,负责负载均衡主要Apache或Nginx负责,而TOMC 阅读全文
posted @ 2013-06-02 11:30 Jevo 阅读(3058) 评论(1) 推荐(0) 编辑
摘要: 前面讲述了通过自定义ClassLoader来实现Class的热替换,这里还可以通过动态修改内存中的字节码,将修改过的class再次装载到JVM中。实现动态修改内存中的字节码主要借助Java的Instrumentation特性来实现的。Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。在 Java SE 6 阅读全文
posted @ 2013-04-23 23:10 Jevo 阅读(1473) 评论(0) 推荐(0) 编辑
摘要: 前面有提到过Tomcat的热部署,所谓热部署就是在应用运行时更新Java类文件以升级软件功能,升级过程不需要关停和重启应用。要进行热部署需要做class热替换。Class热替换实现了将修改的class再次加载到JVM中,以动态替换内存中原有的class字节码。实现class的热替换就与Java类加载过程相关,关于Java类加载过程的文章或书籍早些年就已经很多了,这里从” 深入探讨 Java 类加载器(http://www.ibm.com/developerworks/cn/java/j-lo-classloader/)’’一文中摘录了部分内容说明Java类的加载过程。类加载器基本概念基本上所有 阅读全文
posted @ 2013-04-22 22:49 Jevo 阅读(3884) 评论(0) 推荐(1) 编辑
摘要: 在应用中我们一般都会涉及到缓存的使用,实现缓存的方式有很多,在Spring框架中提供了一种支持第三方缓存插件的缓存管理机制。作为自留田总结一下Spring缓存管理的使用。Spring只是提供了个缓存抽象,并没有提供缓存具体实现,我们可以选择第三方的缓存实现,如EHCache、JBoss Cache。Spring的缓存主要是为方法做cache,第一次调用方法时,将方法返回的结果缓存起来,当再次调用该方法时,则先访问缓存,当缓存中存在有相同参数的方法调用的相应数据(结果)时,则直接返回缓存中的数据。缓存应该保证每次调用相同参数的方法返回的结果一致。Spring缓存机制包括了两个方面的操作:缓存方法 阅读全文
posted @ 2013-04-18 21:47 Jevo 阅读(3440) 评论(0) 推荐(0) 编辑
摘要: 缓存在应用程序中的使用十分广泛,由于缓存的介质一般是内存,读写速度快,所以通常我们会把常用的或者要通过比较耗时或大量资源取得的数据缓存起来,从而加整后续的使用。这样在缓存的应用过程中,就需要考虑缓存并发访问的管理以及缓存数据的生命周期。通常,缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围可分为三类。1 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的的对象形式。2 进程范围:缓存被进程内的所有事务共享。这些事 阅读全文
posted @ 2013-04-17 21:57 Jevo 阅读(673) 评论(0) 推荐(0) 编辑
摘要: 延迟加载就是在当真正需要数据的时候去执行数据加载操作,从而避免一些多余的性能开销(数据库查询)。在Hibernate3中提供了对实体对象、集合和属性的延迟加载。1.实体对象的延迟加载延迟加载实体对象只需在实体映射关系中将lazy属性设置为true,如下: <class name=”xxx” table=”xxx” lazy=”true”> …… </class> 通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load 阅读全文
posted @ 2013-04-15 23:02 Jevo 阅读(541) 评论(0) 推荐(0) 编辑
摘要: 在长期的Java客户端开发过程中,一个常用的机制就是消息传送。无论是同步消息传送还是异步消息传送,应该说是建立在Observer设计模式基础上的。在Java中提供了基于这种模式的Observable/Observer事件框架,分别由java.util.Observable类和java.util.Observer接口组成,其中,Observer是观察者角色,Observable是被观察目标(subject)角色。我们先简单的看一下这两个类(接口):Observable是一个封装了基本功能的类,比如注册observer(attach功能),注销observer(detatch功能)等。我们一般只需 阅读全文
posted @ 2013-04-12 23:04 Jevo 阅读(11183) 评论(0) 推荐(1) 编辑
摘要: 在长期的Java客户端开发中,最常见的一个客户端调用模式就是Java的异步调用。所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。在Java语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。虽然在1.5以前从异步线程中取得返回结果需要自己精心设计,但从JDK1.5开始引入了Future接口(FutureTask类)从异步执行的线程中取得返回值。Future 表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。FutureTask类是Future接口 阅读全文
posted @ 2013-04-11 23:05 Jevo 阅读(29691) 评论(0) 推荐(2) 编辑
摘要: Hibernate提供了一系列的查询接口,这些接口在实现上又有所不同。这里对Hibernate中的查询接口进行一个小结。我们首先来看一下session加载实体对象的过程:Session在调用数据库查询前,首先会在缓存中进行查询。如果在内部缓存中通过实体类型和id进行查找并命中,数据状态合法,则直接返回。如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。如在第二级缓存中没有命中,则发起数据库查询操作(Select SQL),根据映射配置和Select SQL得到的ResultSet,创建对应的数据对象。将其数据对象纳入当前Session实体管理容器(一级缓存)。执行In 阅读全文
posted @ 2013-04-10 23:08 Jevo 阅读(1038) 评论(0) 推荐(0) 编辑
摘要: 在项目的开发过程之中,我们常会遇到数据的批量处理问题。在持久层采用Hibernate框架时,在进行批量操作时,需要考虑Hibernate实现机制带来的一些问题。我们知道在每个Hibernate Session中都维持了一个必选的数据缓存,所有保存的实例都将保存在Session缓存中,这个缓存随着Session的创建而存在,随着Session的销毁而消亡。这个内部缓存正常情况下是由Hibernate自动维护的,并且没有容量限制。在批量插入与更新时,由于每次保存的实体都会保存在Session缓存中,当数据量大的时候,就可能出现OutOfMemoryException(内存溢出异常)。所以批量增加或 阅读全文
posted @ 2013-04-09 20:55 Jevo 阅读(16554) 评论(0) 推荐(3) 编辑
摘要: 这里主要总结Java中集成Groovy的应用。Groovy可以与Java完美集成来扩展我们的应用,比如替代Java+jexl实现算式表达式计算或其它功能。在Ofbiz中也集成了Groovy来执行一些查询功能,并且是开始更多的使用Groovy而不是原有的bsh。这里仅仅初步总结我们在Java项目中如何来应用Groovy扩展我们的应用。1.使用GroovyShell计算表达式使用Binding对象将变量传入表达式,并通过GroovyShell返回表达式的计算结果。如下例:public class GroovyShellExample { public static void main(String 阅读全文
posted @ 2013-04-08 13:46 Jevo 阅读(11393) 评论(1) 推荐(0) 编辑
摘要: Hibernate是当前流行的对象关系映射(ORM)框架,实现了程序对象到关系型数据库数据的映射。即然ORM实现的是对象和关系型数据表间的映射,它必然要在映射过程中解决对象层次结构中的关系问题。这里对映射关系作一个小结,以备以后查阅。我们很多Web项目都是由前端页面驱动来进行架构设计,即首先作出Web原型后,并基于此原型来产生表结构。一般情况下,所产生的对象层次是扁平的,对应的表结构也很简单,表间通常没有复杂的关联关系。但也有很多时候,我们需要往先分析项目的业务,然后建立起业务模型,根据业务模型的描述分解出不同类型的对象类。在最后会考虑对其中需要持续化的实体对象建立相关的数据表。这是面向对象的 阅读全文
posted @ 2013-04-02 22:12 Jevo 阅读(1812) 评论(0) 推荐(0) 编辑
摘要: 曾经在一个项目中使用表达式来判断处理一些条件,比如订单价格的折扣计算,库存数量的告警线设置等。我们引入了Jexl(一种表达式语言引擎)来处理这些表达式。这里根据几个例子来总结一下它的应用。例一、算式表达式的处理:public class jextTest { public static void main(String[] args) { //数学公式解析和计算 String expression = "(a+b)/c*5"; JexlContext jexlContext = new MapContext(); jexlContext.set("a", 阅读全文
posted @ 2013-04-01 23:38 Jevo 阅读(1897) 评论(0) 推荐(0) 编辑
摘要: 一个简单的应用:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>单选按钮和多选按钮模拟</TITLE><style type="text/css">a{ width:1200px; height:25px; border:solid 1px #666;}.normallight{ border:solid 2px #666;}.highlight{ border:soli 阅读全文
posted @ 2013-03-29 22:49 Jevo 阅读(520) 评论(0) 推荐(0) 编辑
摘要: Annotation(注解)是JDK5.0版本开始引入的,是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会直接影响到程序的语义,只是作为注解(标识)存在,可以通过反射机制编程实现对这些元数据的访问。在Java开发过程中,我们过去比较常见的方式是将软件的各种配置参数存贮在XML文件中,程序运行时从XML配置文件中读取出各配置参数进行运行时环境配置。这个方式使用程序运行灵活的同时也带来一个问题:就是XML配置文件越来越多,不易管理。注解引进后,减少配置、使用注解替代部分XML配置慢慢变成一种趋势。从某种角度来讲,注解具有XML配置的功能,它可有不 阅读全文
posted @ 2013-03-27 22:57 Jevo 阅读(297) 评论(0) 推荐(0) 编辑