确定
取消
×
仅自己可见
JDK源码阅读顺序
淩度奢望

标题为包名,后面序号为优先级1-4,优先级递减 1、java.lang1) Object 12) String 13) AbstractStringBuilder 14) StringBuffer 15) StringBuilder 16) Boolean 27) Byte 28) Double 29) Float 210) Integer 211) Long 212) Short 213) Thread 214) ThreadLocal 215) Enum 316) Throwable 317) Error 318) Exception 319) Class 420) ClassLoader 421) Compiler 422) System 423) Package 424) Void 42、java.util1) AbstractList 12) AbstractMap 13) AbstractSet 14) ArrayList 15) LinkedList 16) HashMap 17) Hashtable 18) HashSet 19) LinkedHashMap 110) LinkedHashSet 111) TreeMap 112) TreeSet 113) Vector 214) Queue 215) Stack 216) SortedMap 217) SortedSet 218) Collections 319) Arrays 320) Comparator 321) Iterator 322) Base64 423) Date 424) EventListener 425) Random 426) SubList 427) Timer 428) UUID 429) WeakHashMap 43、java.util.concurrent1) ConcurrentHashMap 12) Executor 23) AbstractExecutorService 24) ExecutorService 25) ThreadPoolExecutor 26) BlockingQueue 27)AbstractQueuedSynchronizer 28)CountDownLatch 29) FutureTask 210)Semaphore 211)CyclicBarrier 213)CopyOnWriteArrayList 314)SynchronousQueue 315)BlockingDeque 316) Callable 44、java.util.concurrent.atomic1) AtomicBoolean 22) AtomicInteger 23) AtomicLong 24) AtomicReference 35、java.lang.reflect1) Field 22) Method 26、java.lang.annotation1) Annotation 32) Target 33) Inherited 34) Retention 35) Documented 46) ElementType 47) Native 48) Repeatable 47、java.util.concurrent.locks1) Lock 22) Condition 23) ReentrantLock 24) ReentrantReadWriteLock 28、java.io1) File 32) InputStream 33) OutputStream 34) Reader 45) Writer 49、java.nio1) Buffer 32) ByteBuffer 43) CharBuffer 44) DoubleBuffer 45) FloatBuffer 46) IntBuffer 47) LongBuffer 48) ShortBuffer 410、java.sql1) Connection 32) Driver 33) DriverManager 34) JDBCType 35) ResultSet 46) Statement 411、java.net1) Socket 32) ServerSocket 33) URI 44) URL 45) URLEncoder 4阅读笔记简版1、Object 1) wait(), notify(), notifyAll(), wait(timeout) 2) hashCode(), equals() 3) clone()2、String 1) char[] value 2) int hash 3) equals(), startWith(), endWith(), replace3、AbstractStringBuilder 1) char[] value 2) int count 3) 扩容:翻倍,不够取所需最小4、StringBuffer 1) 继承AbstractStringBuilder 2) synchronized方法保证线程安全 3) char[] toStringCache5、StringBuilder 继承AbstractStringBuilder6、ArrayList 1) Object[] elementData 2) int size 3) 默认大小10 4) 扩容:翻倍,不够取所需最小7、LinkedList 1) Node {E item, Node prev, Node next} 2) int size 3) Node first 4) Node last 5) linkFirst(), linkLast(), linkBefore(), unLinkFirst(), unLinkLast(), unLink(), indexOf()8、HashMap 1) Node{int hash, K key, V value, Node next} 2) 默认容量16,负载因子0.75f 3) int size, modCount, threshold, float loadFactor 4) Node[] table 5) Set entrySet 6) put():根据key算hash,根据容量和hash算index,table[index]没有直接添加到数组中,table[index]有,若index位置同一个key则更新,否则遍历next是否有,有则更新,无则新增,最后根据thread与size判断是否扩容。注:扩容时容量翻倍,重新算hash复制到新数组 7)get()类似 注:先比较hash,若相等在比较equals9、Hashtable 1) 结构实现与HashMap基本一致 2)通过synchronized方法保证线程安全10、HashSet:委托给HashMap,其Value是同一个默认对象11、LinkedHashMap继承HashMap 1) Entry{HashMap.Node, Entry before, after} 2) Entry head, tail 3) 重写newNode()添加节点时,除像HashMap中添加外,保存before、after信息12、LinkedHashSet继承HashSet:不知道如何实现的顺序?13、AbstractMap维护EntrySet,AbstractSet维护Iterator,AbstractList维护Iterator14、ConcurrentHashMap 1) JDK1.7及以前: a、Segment[] ,HashEntry[] , HashEntry{hash, k, v, next} b、根据key算hash,根据hash和Segment的大小算位置,每个segment拥有一个自己的HashEntry[] c、get():不加锁,volatile类型 d、put(): 对相应segment加锁 e、size():各HashEntry[] 之和,先不加锁算两遍,若一致则返回,若不一致则加锁重新计算 2)JDK1.8 a、Node{hash, key, value, next} b、Node[] table c、大多数操作类似于HashMap,不同CAS方式设置,根据key算hash,在根据hash和容量算index,对table[index]加锁,从而达到更大的并发量 d、get(): 同HashMap e、put(): 对table[index]加锁15、TreeMap 1)红黑树,即自平衡二叉查找树,时间复杂度O(logn) 2)Entry{K k, V v, Entry parent, left, right, boolean color} 3)Entry root,int size, int modeCount16、TreeSet:委托TreeMap实现

(0) (0)
snapseed
淩度奢望
81
今天的分享,大家看名字也知大概,重在讲后期。后期不是无意义的夸张,而且为了还原眼之所见,心之所感。很多画面我们由于身临其境,触动会非常大,但拍到相机里,会打一个折扣,再加上观众处于“现场之外”,又是一个折扣,当多个折扣相乘,能够传递给观众的东西就会非常的少。

为了能够尽可能的挽救这种情况,后期便成了自然的事情,通过后期加强画面,还原你的眼之所见,心之所感,是它最本真的意义。今天的后期分享有两个特别之处,一是回归基本法,通过温习后期的三大元素,知新其意。二是通过一个简单的手机后期APP:snapseed,阐述后期的运用,而看似更复杂的Photoshop等都是一样的调色原理。

首先进入第一部分,后期到底是在调什么?其实简单说,就是三个参数:明暗、色彩、对比。

(0) (1)
【转】找回密码的功能设计
淩度奢望
5

作者: 阮一峰  

所有需要登录的网站,都会提供"找回密码"的功能,防止用户忘记密码。

正确设计这个功能,保证安全可靠,并不简单。下面就是安全专家 Troy Hunt 给出的设计指南

一、如何保存密码

一个网站要想保证密码安全,第一步就是以正确的方法保存密码。一般说来,密码有三种保存方式。

(1)明文保存

"明文保存"就是用户的密码原文不动地写入数据库。这种方式最不安全,极易泄漏,应该严格禁用。

(2)加密保存

"加密保存"就是使用密钥,将密码加密后,以密文保存进数据库。这种方式虽然有一定的安全性,但是终究还是可以用密钥还原密码。因此,还是存在泄漏的可能,也不推荐使用。

(0) (2)
博主生日快乐哟
mc冒险家
1
此人很懒,什么也没写...
(2) (0)
【后端框架】SSH框架
淩度奢望

SSH框架

描述:SSH是JavaEE中三种框架(Struts+Spring+Hibernate)的集成框架,是目前比较流行的一种Java Web开源框架
  • 1

struts五大组件介绍

1. ActionServlet Struts中的最大控制器,是Struts框架的入口,并且封装了Servlet,被配置在web.xml当中 2. Action 小控制器,处理具体的业务逻辑 3. ActionForm 和页面表单对应的一个特殊javabean,负责在页面和控制器之间传递数据。同时还提供了集中验证方法 4. ActionMapping 用来从Struts的配置文件中读取信息 5. ActionForward 页面之间的跳转

Spring特征

  1. Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
  2. 强大的基于 JavaBeans的采用控制反转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组件更加快捷简易。
  3. 一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。
  4. 数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。
  5. 内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的 JTA 或者 EJB CMT 相反。
  6. JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另一个 ‘终止’ (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象(Data Access Object) 异常等级相一致.
  7. 以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的反转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.
  8. 灵活的基于核心 Spring 功能的 MVC 网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。

Hibernate特征

  1. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
  2. 将对数据库的操作转换为对Java对象的操作,从而简化开发。通过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。
  3. 提供线程和进程两个级别的缓存提升应用程序性能。
  4. 有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。
  5. 屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。 非侵入式:Hibernate不要求持久化类实现任何接口或继承任何类,POJO即可。
(1) (0)
js日期格式化
mc冒险家

Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt;}调用: var time1 = new Date().Format("yyyy-MM-dd");var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");

(0) (0)
MySQL 对于千万级的大表要怎么优化?
作者:大括号链接:https://www.zhihu.com/question/19719997/answer/549041957来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

问题概述

使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。

问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视。原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!!

我尝试解决该问题,so,有个这个日志。

方案概述

  • 方案一:优化现有mysql数据库。优点:不影响现有业务,源程序不需要修改代码,成本最低。缺点:有优化瓶颈,数据量过亿就玩完了。
  • 方案二:升级数据库类型,换一种100%兼容mysql的数据库。优点:不影响现有业务,源程序不需要修改代码,你几乎不需要做任何操作就能提升数据库性能,缺点:多花钱
  • 方案三:一步到位,大数据解决方案,更换newsql/nosql数据库。优点:没有数据容量瓶颈,缺点:需要修改源程序代码,影响业务,总成本最高。

以上三种方案,按顺序使用即可,数据量在亿级别一下的没必要换nosql,开发成本太高。三种方案我都试了一遍,而且都形成了落地解决方案。该过程心中慰问跑路的那几个开发者一万遍 :)

方案一详细说明:优化现有mysql数据库

跟阿里云数据库大佬电话沟通 and Google解决方案 and 问群里大佬,总结如下(都是精华):

  • 1.数据库设计和表创建时就要考虑性能
  • 2.sql的编写需要注意优化
  • 3.分区
  • 4.分表
  • 5.分库

1.数据库设计和表创建时就要考虑性能

mysql数据库本身高度灵活,造成性能不足,严重依赖开发人员能力。也就是说开发人员能力高,则mysql性能高。这也是很多关系型数据库的通病,所以公司的dba通常工资巨高。

设计表时要注意:

  • 表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。
  • 尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。
  • 使用枚举或整数代替字符串类型
  • 尽量使用TIMESTAMP而非DATETIME
  • 单表不要有太多字段,建议在20以内
  • 用整型来存IP

索引

  • 索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
  • 应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描
  • 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段
  • 字符字段只建前缀索引
  • 字符字段最好不要做主键
  • 不用外键,由程序保证约束
  • 尽量不用UNIQUE,由程序保证约束
  • 使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引

简言之就是使用合适的数据类型,选择合适的索引

1.选择合适的数据类型

  • (1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
  • (2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
  • (3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
  • (4)尽可能使用not null定义字段
  • (5)尽量少用text,非用不可最好分表

2.选择合适的索引列

  • (1)查询频繁的列,在where,group by,order by,on从句中出现的列
  • (2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
  • (3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好
  • (4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高:
原开发人员已经跑路,该表早已建立,我无法修改,故:该措辞无法执行,放弃!

2.sql的编写需要注意优化

  • 使用limit对查询结果的记录进行限定
  • 避免select *,将需要查找的字段列出来
  • 使用连接(join)来代替子查询
  • 拆分大的delete或insert语句
  • 可通过开启慢查询日志来找出较慢的SQL
  • 不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边
  • sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库
  • OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内
  • 不用函数和触发器,在应用程序实现
  • 避免%xxx式查询
  • 少用JOIN
  • 使用同类型进行比较,比如用'123'和'123'比,123和123比
  • 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  • 对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5
  • 列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大
原开发人员已经跑路,程序已经完成上线,我无法修改sql,故:该措辞无法执行,放弃!

引擎

引擎

目前广泛使用的是MyISAM和InnoDB两种引擎:

1. MyISAM

MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:

  • 不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁
  • 不支持事务
  • 不支持外键
  • 不支持崩溃后的安全恢复
  • 在表有读取查询的同时,支持往表中插入新纪录
  • 支持BLOB和TEXT的前500个字符索引,支持全文索引
  • 支持延迟更新索引,极大提升写入性能
  • 对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用

2. InnoDB

InnoDB在MySQL 5.5后成为默认索引,它的特点是:

  • 支持行锁,采用MVCC来支持高并发
  • 支持事务
  • 支持外键
  • 支持崩溃后的安全恢复
  • 不支持全文索引

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表

MyISAM速度可能超快,占用存储空间也小,但是程序要求事务支持,故InnoDB是必须的,故该方案无法执行,放弃!

3.分区

MySQL在5.1版引入的分区是一种简单的水平拆分,用户需要在建表的时候加上分区参数,对应用是透明的无需修改代码

对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实际上是通过对一组底层表的对象封装,但对SQL层来说是一个完全封装底层的黑盒子。MySQL实现分区的方式也意味着索引也是按照分区的子表定义,没有全局索引

用户的SQL语句是需要针对分区表做优化,SQL条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,可以通过EXPLAIN PARTITIONS来查看某条SQL语句会落在那些分区上,从而进行SQL优化,我测试,查询时不带分区条件的列,也会提高速度,故该措施值得一试。

分区的好处是:

  • 可以让单表存储更多的数据
  • 分区表的数据更容易维护,可以通过清楚整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作
  • 部分查询能够从查询条件确定只落在少数分区上,速度会很快
  • 分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备
  • 可以使用分区表赖避免某些特殊瓶颈,例如InnoDB单个索引的互斥访问、ext3文件系统的inode锁竞争
  • 可以备份和恢复单个分区

分区的限制和缺点:

  • 一个表最多只能有1024个分区
  • 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来
  • 分区表无法使用外键约束
  • NULL值会使分区过滤无效
  • 所有分区必须使用相同的存储引擎

分区的类型:

  • RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区
  • LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择
  • HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式
  • KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值

具体关于mysql分区的概念请自行google或查询官方文档,我这里只是抛砖引玉了。

我首先根据月份把上网记录表RANGE分区了12份,查询效率提高6倍左右,效果不明显,故:换id为HASH分区,分了64个分区,查询速度提升显著。问题解决! 结果如下:PARTITION BY HASH (id)PARTITIONS 64

select count(*) from readroom_website; --11901336行记录

/* 受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 5.734 sec. */

select * from readroom_website where month(accesstime) =11 limit 10;

/* 受影响行数: 0 已找到记录: 10 警告: 0 持续时间 1 查询: 0.719 sec. */

4.分表

分表就是把一张大表,按照如上过程都优化了,还是查询卡死,那就把这个表分成多张表,把一次查询分成多次查询,然后把结果组合返回给用户。

分表分为垂直拆分和水平拆分,通常以某个字段做拆分项。比如以id字段拆分为100张表: 表名为 tableName_id%100

但:分表需要修改源程序代码,会给开发带来大量工作,极大的增加了开发成本,故:只适合在开发初期就考虑到了大量数据存在,做好了分表处理,不适合应用上线了再做修改,成本太高!!!而且选择这个方案,都不如选择我提供的第二第三个方案的成本低!故不建议采用。

5.分库

把一个数据库分成多个,建议做个读写分离就行了,真正的做分库也会带来大量的开发成本,得不偿失!不推荐使用。

方案二详细说明:升级数据库,换一个100%兼容mysql的数据库

mysql性能不行,那就换个。为保证源程序代码不修改,保证现有业务平稳迁移,故需要换一个100%兼容mysql的数据库。

1. 开源选择

开源数据库会带来大量的运维成本且其工业品质和MySQL尚有差距,有很多坑要踩,如果你公司要求必须自建数据库,那么选择该类型产品。

2. 云数据选择

  • 阿里云POLARDB

云数据库POLARDB_高吞吐在线事务处理_关系型云数据库_价格_购买 - 阿里云

官方介绍语:POLARDB 是阿里云自研的下一代关系型分布式云原生数据库,100%兼容MySQL,存储容量最高可达 100T,性能最高提升至 MySQL 的 6 倍。POLARDB 既融合了商业数据库稳定、可靠、高性能的特征,又具有开源数据库简单、可扩展、持续迭代的优势,而成本只需商用数据库的 1/10。

我开通测试了一下,支持免费mysql的数据迁移,无操作成本,性能提升在10倍左右,价格跟rds相差不多,是个很好的备选解决方案!

  • 阿里云OcenanBase

淘宝使用的,扛得住双十一,性能卓著,但是在公测中,我无法尝试,但值得期待

  • 阿里云HybridDB for MySQL (原PetaData)

云数据库HybridDB for MySQL_产品详情_阿里云

官方介绍:云数据库HybridDB for MySQL (原名PetaData)是同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP(Hybrid Transaction/Analytical Processing)关系型数据库。

我也测试了一下,是一个olap和oltp兼容的解决方案,但是价格太高,每小时高达10块钱,用来做存储太浪费了,适合存储和分析一起用的业务。

  • 腾讯云DCDB

分布式数据库 - 腾讯云

官方介绍:DCDB又名TDSQL,一种兼容MySQL协议和语法,支持自动水平拆分的高性能分布式数据库——即业务显示为完整的逻辑表,数据却均匀的拆分到多个分片中;每个分片默认采用主备架构,提供灾备、恢复、监控、不停机扩容等全套解决方案,适用于TB或PB级的海量数据场景。

腾讯的我不喜欢用,不多说。原因是出了问题找不到人,线上问题无法解决头疼!但是他价格便宜,适合超小公司,玩玩。

方案三详细说明:去掉mysql,换大数据引擎处理数据

数据量过亿了,没得选了,只能上大数据了。

1. 开源解决方案

hadoop家族。hbase/hive怼上就是了。但是有很高的运维成本,一般公司是玩不起的,没十万投入是不会有很好的产出的!

2.云解决方案

这个就比较多了,也是一种未来趋势,大数据由专业的公司提供专业的服务,小公司或个人购买服务,大数据就像水/电等公共设施一样,存在于社会的方方面面。

国内做的最好的当属阿里云。

我选择了阿里云的MaxCompute配合DataWorks,使用超级舒服,按量付费,成本极低。

MaxCompute可以理解为开源的Hive,提供sql/mapreduce/ai算法/python脚本/shell脚本等方式操作数据,数据以表格的形式展现,以分布式方式存储,采用定时任务和批处理的方式处理数据。DataWorks提供了一种工作流的方式管理你的数据处理任务和调度监控。

当然你也可以选择阿里云hbase等其他产品,我这里主要是离线处理,故选择MaxCompute,基本都是图形界面操作,大概写了300行sql,费用不超过100块钱就解决了数据处理问题。

(1) (0)
【JAVA调用webservice】使用JDK wsimport工具生成客户端类(特殊参数)
淩度奢望
9

.工具

1.JDK1.7(至少保持JDK版本为1.6以上,可以在JDK的安装目录下的bin目录下查看是否有wsimport.exe这个可执行文件)

 .创建服务端

1.创建一个服务端项目

运行main方法,输出如下表示发布成功。

2.在地址栏里输入你刚才发布的http://localhost:9000/HelloWorld?wsdl,这时候就能看到xmll文档  

(0) (1)
http://www.creative6.cn/
(1) (0)
<meta http-equiv="Access-Control-Allow-Origin" content="*">

<meta http-equiv="Access-Control-Allow-Origin" content="*">

(0) (0)
再见,90版本
1
此人很懒,什么也没写...
(0) (3)
等一个睡觉
mc冒险家
1
此人很懒,什么也没写...
(2) (3)
无艺凡笑尿
此人很懒,什么也没写...
(3) (1)
【买鞋,我只认窝弟】[[[
mc冒险家
此人很懒,什么也没写...
(0) (0)
【买鞋,我只认窝弟】ppp
mc冒险家
此人很懒,什么也没写...
(0) (0)
1 / 11
Bio:{{user.bio== undefined?'(→_→)Nothing':user.bio}}
发帖
个人中心
消息
{{noticeNum}}
登出