PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别以及如何避免SQL注入式攻击?这篇教程中我们会讨论为什么要用PreparedStatement?使用PreparedStatement有什么样的优势?PreparedStatement又是如何避免SQL注入攻击的?
PreparedStatement是什么?PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预 ...
为了深入了解Java的ClassLoader机制,我们先来做以下实验:
package java.lang;
public class Test {
public static void main(String[] args) {
char[] c = "1234567890".toCharArray();
String s = new String(0, 10, c);
}
}
String类有一个Package权限的构造函数String(int offset, int length, char[] array),按照默认的访问权限,由于Test属于java.lang包,因此理论上应该可以访问String的这个构造函数。**编译通过!**执行时结果如下:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: ...
一 Two-Phase Termination Pattern
Two-Phase Termination Pattern,指的就是当希望结束一个线程的时候,送出一个终止请求,但是不会马上停止,做一些刷新工作。进入“终止处理中”,在该状态下,不会进行该线程日常工作任务的操作,而是进行一些终止操作。
这个方式所考虑的因素如下:
1,必须要考虑到使得该线程能够安全的结束,Thread中的stop会有问题的,因为它会不管线程执行到哪里,都会马上停止,不能保证安全的结束。
2,一定能够进行正常的终止处理,在java中,这点可以使用finally来实现
3,能够高响应的终止,收到终止后,当线程在wait或者sleep或者join的时候,不用等到时间到才终止,而是马上中断线程的这些状态,进而进行终止操作。
当一个线程正在执行周期性的工作时候,在“作业中”发了停止执行绪的请求,此时该线程不能马上离开停止,而应该先做完本次周期内部的工作,然后进入“善后阶段”完成一些善后的工作,所谓的两阶段终止,即中止“运作阶段”,并完成“善后阶段”,完整的完成执行绪的工作。
两阶段终止线程 ...
LINUX常用命令(基础)
startx 切换到图形界面
man 对你熟悉或不熟悉的命令提供帮助解释
eg:man ls 就可以查看ls相关的用法
注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行。
ls 查看目录或者文件的属*,列举出任一目录下面的文件
eg: ls /usr/man
ls -l
a.d表示目录(directory),如果是一个”-“表示是文件,如果是l则表示是一个连接文件(link)
b.表示文件或者目录许可权限.分别用可读(r),可写(w),可运行(x)。
cp 拷贝文件
eg: cp filename1 filename2 //把filename1拷贝成filename2
cp 1.c netseek/2.c //将1.c拷到netseek目录下命名为2.c
rm 删除文件和目录
eg: rm 1.c //将1.c这个文件删除
mv 移走目录或者改文件名
eg: mv filename1 filename2 / ...
程序员面试一直是社区乐于讨论的热门话题,在有了两年面试别人的经历后,我打算通过文章站在面试官角度对于程序员面试问题的一个阶段性反思和经验总结。
程序员面试一直是社区乐于讨论的热门话题。我自己从06年实习以来,先后经历了4家软件公司,全部是外企,其中有世界500强的通信企业,有从事期权期货交易的欧洲中等规模的金融公司,也有为大型汽车制造商开发Android智能汽车的新兴公司。跨入IT行业以来,我在求职过程中经历过多次面试,最近两年也有过多次面试别人的经验。我感觉现在到了对这个问题发表自己看法的时候,这篇文章是我站在面试官角度对于程序员面试问题的一个阶段性反思和经验总结。
目标相信和不少朋友一样,有了几年工作经验成为Senior后就开始了面试别人的经历。我在最初这个阶段只是按照自己的想象把”找到基础好的程序员“,”找到算法能力优秀的程序员“,”找到有Android开发经验的程序员“等作为面试的目标。但是,实际的经历告诉我,尤其是按“基础好”,“算法好”这些目标招到的人最终效果并不好。比如,有的面试者基础知识和算法掌握情况不错,进程、线程、内存等概念清晰,基本的Hash,二叉树,快速排序等数 ...
摘要:你是一个程序员初哥,刚从大学迈进公司却没有人指导,要么公司给你指定了导师,却不好意思大事小情都问他。你想提高自己的编程水平,却不知该如何下手。如果你想提升自己,成为一个合格的天天向上的程序员,这篇文章就是为你准备的。
学什么? 有些人对什么都感兴趣,硬盘上存着几百G的教学视频电子书破解软件,却只是仅仅保存着,没有转化成知识。有些人只知道自己刚进公司的那点东 西,JDK一定要1.4.2,VC++一定要6.0,系统一定要Windows XP,否则就是大逆不道。前一种是不知道自己想要什么,后一种是固步自封、眼界短浅,都不是一个程序员应该有的学习态度。
常见的程序员有Windows桌面开发,Linux服务器开发,Web前端开发,DB数据库相关,游戏服务器端开发,游戏客户端开发,RIA开发 (如Flash、Silverlight),移动开发(这个现在最火了尤其是Android和iOS),嵌入式开发,行业软件开发等等,基本上我列举的这些已经涵盖了大部分程序员类型,每个类型都有不同的基础知识以及扩展内容需要学习。另外有一些共通的内容如数据结构、基本算法、操作系统是都应该学习了解的。
...
多线程-并发
未读简介非阻塞算法在更细粒度的层面协调争用,它比传统的锁有更高的并发性。随着非阻塞算法在 Java 中的应用越来越广泛,java.concurrent 包中用非阻塞算法实现的并发容器也越来越多,ConcurrentLinkedQueue 就是其中的一个重要成员。鉴于 ConcurrentLinkedQueue 的非阻塞算法实现在并发容器中具有代表性,本文将结合 JDK Update23 的源代码来分析它在当前的实现。由于非阻塞算法本身比较复杂,阅读本文的读者需要对 CAS 原子指令和非阻塞同步机制有所了解。本文分为两部分,第一部分主要是对非阻塞算法相关理论知识的简介,第二部分结合 ConcurrentLinkedQueue 的源代码,来探索非阻塞算法的具体实现。希望通过本文,能够有助于读者理解非阻塞算法在并发容器中的工作原理与具体实现机制。
非阻塞算法相关技术简介为了便于读者更好的理解本文,首先让我们来对非阻塞算法相关的理论知识做个简单的了解,更详细的论述请参阅文中提及的相关参考文献。
Java 的多线程同步机制在现代的多处理器系统中,提高程序的并行执行能力是有效利用 CPU 资源的关键。 ...
实现伸缩性和性能调优的经验所保有的价值容易被低估。两者都是“晚些时候”或“我们真正流行起来时”所面临的难题。早期创业公司确实不应该立即花这份钱,而大公司通常不能做出足够快速的反应以实现所需的改变。再加上这需要一个多学科的团队,它立刻就变成了一个需要解决的政治上和工程上的难题。
但是它从来不会从我们的视线中消失——在过去的少数几个 Qcon 会议上,“Architectures You’ve Always Wondered About(你始终感到惊讶的架构)”专题被淹没了,正因为如此,我们渴望学习“大人物”们如何去做这些事情的技巧和诀窍。
在这次 InfoQ.com 的虚拟座谈会上,我们从几个最大的公司和项目中邀请了几个在实现可伸缩性和性能方面的专家,让我们进入他们取得了成果而我们却依然梦想的神秘世界吧。
座谈会的参与者包括有 Blaine Cook,Twitter 的前任架构师,他领导开发者进行了 Starling 消息队列 ruby gem 的开发。Blaine 在“如何让 Ruby 和 Rails 伸缩自如”的会谈中发出了积极的声音,在这一领域有非常多的经验。
他是被 Randy ...
多线程-并发
未读参考《分布式java应用》一书,简单过一遍并发包(java.util.concurrent)
ConcurrentHashMapConcurrentHashMap是线程安全的HashMap的实现。
1)添加
put(Object key , Object value)
ConcurrentHashMap并没有采用synchronized进行控制,而是使用了ReentrantLock。
123456public V put(K key, V value) { if (value == null) throw new NullPointerException(); int hash = hash(key.hashCode()); return segmentFor(hash).put(key, hash, value, false); }
这里计算出key的hash值,根据hash值获取对应的数组中的segment对象。接下来的工作都交由segment完成。
segment可以看成是HashMap的一 ...
工作一年了,换过一次工作,最近面试的时候面试官说我只能算是一个junior,离senior还差一些,虽然 不服气,但是仔细想来,却也没什么不对的。 一年了,对自己水平的总结就是:貌似什么都知道点,但是什么又都不深入。
曾经一个同学告诉我,技术 通过做两个项目就上来了!然后面试官问我怎么快速提高自己的水平,我就说做几个项目就上来了。他说,那不可能,没有那么多项目给你做。 仔细想来,自己曾经做过的工作,虽然工作能提高一些技能,但是大部分的提高貌似都是自学的。有没有人同感?
现在说这个自学,平时我也好研究一些小技术,小技巧,然后将实例代码保存起来。但是工作中不用,项目中不用,这些技术就慢慢忘记了。比如说存储过程的基本语法,一时兴起,看看资料,照着例子写上几个存储过程,然后过一阵子,工作中不用,自己平时也不用,存储过程慢慢就又不会写了,然后面试笔试的时候又出问题了。所以就出现了,貌似什么都研究过,都曾用过,但是又什么都不深入。 就拿存储过程来说,如果项目中经常写,自己平时也用到,那基本上手到擒来。 再后来,慢慢的什么都记不住了,又不知道自己该研究啥了,慢 ...
