首页
学习
活动
专区
工具
TVP
发布

java大数据

专栏作者
627
文章
443081
阅读量
29
订阅数
动态生成html当中的组件
有时html里的字数太多, 而且有一定的规律时,我们就可以用如下的方法产生动态的内容。
马克java社区
2021-10-10
1.9K0
url,sendRedirect当中有中文
中文当想出现在url当中,或通过网络http header或request的parameter或response传送时,得需要变成iso格式传送,到目的地后,再用GBK转换一下,人才能看懂。
马克java社区
2021-10-10
9850
中文文件下载
假 如你的文件名是英文的话,jspsmartupload就可以胜任。但如果你的文件名是中文的话,就只能用下面的方法。这时jspsmartupload 是不能胜任的。以下例子能下载中文文件名(在firefox,ie8,360都通过测试, eclipse内置浏览器不行):
马克java社区
2021-10-10
7930
jsp的文件怎么上传
<%@ page contentType="text/html; charset=GBK" %>
马克java社区
2021-10-10
4.2K0
缓存中ConcurrentHashMap的加锁怎么做给个例子?
记 不记得,我们在讲java的线程部分安全知识时,举了一个例子【例:1.8.2-(补充)】。卖书卖到最后,卖出了个负数。这里还用那个例子,可是完全用 ConcurrentHashMap。那个例子当中有个bookNum--操作。本例中就想说明ConcurrentHashMap的这个操作 (bookNum--)如何做。
马克java社区
2021-10-10
5820
缓存是集合框架HashMap怎么做?
马克-to-win:在 实践当中,有很多数据并不是像火车票数或者账户余额这样的关键数据(存在的意义就是为了疯狂的加减,疯狂的变化)。它们只是普通数据库表的一个缓存而已。 比如淘宝网中展示的衣服数据,基本不变,即使变了,不实时准确的展示最新的,也不会引起灾难性的后果,不像银行账户或火车票数。马克-to-win:这种数据我们就考虑放在集 合框架当中。我们的备选方案有1)Hashtable,2)HashMap,3)Collections.synchronizedMap(new HashMap())或4)ConcurrentHashMap()。
马克java社区
2021-10-10
2180
缓存是ConcurrentHashMap怎么做给个例子?
马克-to-win:ConcurrentHashMap是java1.5的新特性。HashTable在并发环境下效率低的原因: HashTable就一把锁,所有线程竞争。ConcurrentHashMap里面有很多锁,就像数据库里的行级锁一样。改这行,锁这行,不影响别的 行。最重要的是:一个线程添加(put)元素,同时另一个线程读数据不会引起ConcurrentModificationException异常。读写 可以同时进行,只不过读的有可能不是最新数据。马克-to-win:所以如果需要原子操作时,还得手动加锁。所以我们前面学的锁的理论,照样适用。(见下面的例子)
马克java社区
2021-10-10
3210
自制乐观锁
private synchronized int updAtom(int num,int verNum)
马克java社区
2021-10-10
4470
自制悲观锁
public MulThreMarkToWin(Ticket_Pess_MarkToWin ticPes_MarkToWin) {
马克java社区
2021-10-10
4530
缓存的具体实现
马克-to-win:本 部分我们还是沿用上面的买车票的例子。不过这次的车票不是放在数据库当中,而是放在内存(缓存)当中。为了车票数这个变量不能被两个线程同时改变,我们或者可以用synchronized冠以买票的方法,或者可以加锁。在我们这部分教学中,我们采 取了加锁的方法。一共讲了两个方案,一个是悲观锁,一个是乐观锁。马克-to-win:悲观锁的意思是只有拿到了锁才能改变变量,而乐观锁的意思是两个线程可以直接改变这个变量,但如果发现变量的 版本跟当时取变量的版本不一样时,就放弃这种改变。这里我们手动编写这两种锁,只是实现了锁的思想,还有很多细节没有实现,比如排队等候等。
马克java社区
2021-10-10
3590
缓存层如何设计
马克-to-win:我们前面讲过 了n-tier架构。在我们的程序当中,还可以设计一个缓存层。在去访问数据库之前,先看看缓存层中有没有数据,如果没有的话,从数据库取完数据回来,一 定要放在缓存层当中一份,下次就不用去数据库了。马克-to-win:如果对数据库当中,某个数据更新了,同时一定要记住也更新一下缓存当中的数据。这样的话,既保证了缓存的 数据是最新的,也保证了将来查询时不用去查数据库,减轻了对数据库的压力。 这里有些问题,问题1,如果除了你的项目,还有其他的地方可以更改数据库,怎么办?可以做一个守护线程,发现某个表的版本变了,就重新把表的数据加载回你 的缓存。问题2,对于条件查询,如何处理缓存?比如30元到50元的衣服数据的第二页。大家通常的做法是,把整个衣服表都加载到缓存中,无非就是一个 List,之后整个做个遍历,把符合条件的选出来。为什么要整个加载?因为别人还有可能要查20到40块钱的第五页的数据。问题3,项目a处需要看表的 123列,b处需要看表的456列,缓存时就直接把123456列作为一个表缓存起来,供两处使用。马克-to-win:顺便说一句,缓存也可以缓存图片。数据库和图片服务 器,可以认为是大的仓库,什么都能找到,而缓存可以看做是前端的商店,客户经常要买的东西就存一部分在商店,这样可以提高效率。如果商店没有相应的商品, 也不用着急,因为我们后面的仓库肯定有。
马克java社区
2021-10-10
7900
map端做join和reduce端做join有何区别?
马克-to-win @ 马克java社区:map 端做join和reduce端做join有何区别?我们前面讲的是Reduce端join,因为Reduce端join需要把所有的数据都经过 Shuffle,非常消耗资源,效率要远远低于Map端join。Map端join是指只有map工作,reduce不工作,这样可以有效的避免数据倾 斜。
马克java社区
2021-10-10
4880
MapReduce当中什么叫数据倾斜(data skew)?
马克-to-win @ 马克java社区:什么叫数据倾斜(data skew)?假如,你有两个reduce节点,数据都跑到第一个节点,(比如p_id=p1的数据非常多)第二个节点没什么数据, 结果第一个节点,工作完成总是卡在99.99%,一直99.99%不能结束。
马克java社区
2021-10-10
5940
缓存如何应对断电
马克-to-win:有 的同学说了,如果突然掉电怎么办?这,我们就需要观察数据库是怎么处理的。对,日志。数据库为了保证正确性,在真正改变数据库之前,都是先存入日志,如果 存入日志时掉电,那简单忽略就行。如果日志存好了,往数据库当中真写的时候发生了掉电,电源恢复了以后,再重新按照日志改变数据库。马克-to-win:一句话,对付掉电,就 靠日志。我们的缓存也一样。何况说,如果你的公司认为缓存真的有用的话,可以配置不间断电源。在我们的程序当中不像成型的那些缓存系统,比如 Memcached。我们就忽略了日志的研究。
马克java社区
2021-10-08
8390
缓存在高并发当中有何意义?
马克-to-win:上 面我们学习了数据库的并发安全。但是每次要更新数据,都需要访问数据库,这会耗费大量的时间。一万个人的更新数据,需要访问一万次数据库,这样做效率太低 了。马克-to-win:如果要能变成,最开始的时候访问一次数据库,把数据从数据库中取出来,放在内存中缓存起来,之后一万个人的更新数据,就变成更新这个缓存起来的变量 (操作都发生在内存),最后夜里再持久化一次,把它存到数据库当中,这个效率多高。
马克java社区
2021-10-08
2060
一个高并发买票的实例
马克-to-win:我 们现在回到春节高并发买票的问题。我们假设有一百万个人买一百张票,其中买票程序一百万个线程同时运行。不用改变mysql的缺省事务隔离级别。任何人在 买之前都用普通的select * from table来访问数据库获得目前的票数。假如现在是一百,之后大家一起点“下单”钮。这个钮所对应的程序可以这样:先select * from table for update,这样所有别人的select * from table for update这句话都会被挡住,这个时刻选出的数据库的票的存量是准确的。你可以加一个判断,比如如果存量大于1,我就买一张票。(有很多高并发程序,会 在这里加一个乐观锁版本的判断,如果还是老版本就做更新。马克-to-win:原理和目的和我们的例子是一样的)注意这里加判断,虽然耗时,但至关重要,(这也是很多公司的通 用做法)而且必须像这样独占排他挡住别人大张旗鼓的做。假如你不下决心独占排他的去做判断,当你真正更新的时候,也许数据已经被别人更改了。也许一秒前看 存量是一百,一秒之后已经变成零了。不判断就直接更新的话,数据库票数也许会变成负数。完成判断之后就是更新数据库票数减一张,当然还需做一些其他的工 作,比如订单表中需要增加一行记录是谁买的之类的,最后提交。之后队列中下一个事务就会被开始执行。这只是程序的一个总的思路,真正做项目还需考虑用户体 验比如超时问题,(connection query有超时timeout异常)或用户等得不耐烦,主动关闭窗口。这时数据库服务器就会照顾下一个select * from table for update。马克-to-win:真正做项目时,我们可以选择用select * from t for update nowait (不等待行锁释放,提示锁冲突,不返回结果)或select * from t for update wait 5 (等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果)给用户提供三个选择,可以死等,不等,或等5秒。同时告诉用户现在多少人在队列中你的前面(每有 一个人发出请求,在ServletContext中就加1,完成就减1),大概多长时间可以到你,因为数据库完成一个用多长时间可以算出来。下面我们就给 出一个并发买票的简单实现。(本例子我们还用上章的register数据库表,用age变量代表车票数,道理是一样的)
马克java社区
2021-10-08
3510
什么是REPEATABLE-READ隔离级别?
马克-to-win:既 然我们教材用mysql,我们仔细研究一下mysql缺省情况,即两个窗口都是REPEATABLE-READ(可重复读)级别的情况。两个窗口都开始事 务以后,窗口2的update,delete,insert,窗口1肯定都看不见。但双方如果都同时update,delete,insert的话,虽然 会被block住,但一旦最后两个窗口都提交,两个窗口的效果是累加的。马克-to-win:举几个例子:1)比如窗口2先要减1,虽然窗口1看不见这种变化,窗口1如果也要 减1的话,虽然当时被block住,但只要窗口2提交的话,窗口1竟然凭着select * from table能够看到累加的效果,即一共减了2。换句话说,窗口1如果不update一下,就不会看到窗口2的update的效果。2)同样道理,如果窗口 2删除了一条记录,提交以后,窗口1未提交之前,还以为这条记录存在呢。select时发现还有,但update时,不能update,也不报错。提交以 后才发觉,数据早没有了。更新半天,都是瞎忙活。马克-to-win:也好理解,因为窗口2早delete了嘛!3)如果窗口2增加一条,窗口1也想增加同样主键的这条记录 (因为看不到这条主键的记录),暂时被挡住以后,当窗口2提交,窗口1会报错,说试图增加重复键。4)窗口1想更新全部的记录为红色,同时窗口2想插入一 条蓝色的,被挡住后不能动弹键盘。窗口1必须先提交,select一下,没发觉蓝色的,等窗口2提交以后,大家都发觉,所有的都变成了红色,除了新插入的 一条是蓝色。所以还是符合提交的变化都会生效,变化的效果是累加的。5)窗口2增加一条,窗口1死活看不到这一条。即使看不见,如果愣更新这条记录的话, 会被挡在那里。马克-to-win:这时如窗口2提交,窗口1简单select,就可以看到自己update的效果。mysql的策略是,只要你叠加在别人的修改之上修改了, 在你提交之前,是可以看到这种修改的,即使你的窗口级别是REPEATABLE-READ(可重复读)。
马克java社区
2021-10-08
8060
缺省隔离级别是怎么回事?如何改变?
马克-to-win:比 如oracle,sql server的缺省隔离级别是READ-COMMITTED。而mysql的缺省隔离级别是REPEATABLE-READ。在mysql中,我打开两个 窗口,分别代表两个事务,这两个窗口的缺省的隔离级别就是REPEATABLE-READ。马克-to-win:其中窗口1我通过set session transaction isolation level read uncommitted; 命令可以把它变成READ-UNCOMMITTED级别。(java语言是获取connection以后,用 connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 来变。)。而窗口2因为没变,级别还是REPEATABLE-READ。
马克java社区
2021-10-08
5460
事务隔离与更改数据库的关系
马克-to-win:当 然,为了保持数据的一致性和数据库的正确性,涉及到同时改变数据库(update,insert,delete)时,不管任何的隔离级别,事务一定是序列 的执行的。先执行的事务挡住(block)后执行的事务正好要改变数据库的那句话(换句话说,在那句话后面的事务就卡在那了)。后执行的事务需要获得相关 行的“行排他锁”才能改数据。先执行的,一定是事务完成才释放“行排他锁”。注意不止是那句更新完成就释放“行排他锁”。马克-to-win:先执行的事务一完成,后面的事务 立刻继续。注意二者都commit后,对数据库的改变是叠加的。只要commit,改变就不会白做,保证了数据库的正确性。(查事务的ACID的 Durable的特性)比如一个insert,另一个update,效果也叠加,即使update的select时,还看不见insert的东西。只要对 准那个insert的row的主键update,更新就不白做。马克-to-win:两个都update,效果更是叠加了。如果你delete,我看不见,我还update, 就白做了,也好理解,因为你先delete了嘛!具体见“REPEATABLE-READ隔离级别”
马克java社区
2021-10-08
5970
事务隔离和锁的关系
马克-to-win:事 务的四种隔离级别实际上就是数据库厂商利用锁的机制,为我们这些程序员提供的四套总的并行读数据的策略。有了这四种隔离级别,基本上我们就省了很多麻烦自 己动手去操纵锁了。当然该需要自己动手操纵锁的时候也要大胆做。见我底下是如何自己操纵锁的,比如select * from table for update,就加了行独占锁。马克-to-win:当然,如同Oracle公司向大家建议的:用户尽量不要自行进行锁的控制,因为这样容易导致死锁。注意自行加的锁的级别比 数据库厂商提供的事务隔离级别优先级高。
马克java社区
2021-10-08
3820
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档