十个 JDBC 的最佳实践
JDBC是Java为多种关系型数据库提供的统一的访问接口,以下是我长期使用JDBC总结的十个最佳实践。
1. 使用PrearedStatement
任何一个使用过JDBC的Java程序员几乎都知道这个,PreparedStatment可以通过预编译的方式避免我们在拼接SQL时造成SQL注入。
2. 使用ConnectionPool(连接池)
使用连接池作为最佳实践几乎都成了公认的标准。一些框架已经提供了内建的连接池支持, 例如Spring中的Database Connection Pool,如果你的应用部署在JavaEE的应用服务器中, 例如JBoss,WAS,这些服务器也会有内建的连接池支持,例如DBCP。 使用连接的原因简单的说就是因为创建JDBC连接耗时比较长,如果每次查询都重新打开一个连接, 然后关闭,性能将会非常低,而如果事先创建好一批连接缓存起来,使用的时候取出, 不使用的时候仍不关闭,将会节省大量的创建关闭连接的时间。
3. 禁用自动提交
这个最佳实践在我们使用JDBC的批量提交的时候显得非常有用,将自动提交禁用后, 你可以将一组数据库操作放在一个事务中,而自动提交模式每次执行SQL语句都将执行自己的事务, 并且在执行结束提交。
4. 使用Batch Update
JDBC的API提供了通过addBatch()方法向batch中添加SQL查询,然后通过executeBatch()执行批量的查询。 JDBC batch update可以减少数据库数据传输的往返次数,从而提高性能。
5. 使用列名获取ResultSet中的数据,从而避免invalidColumIndexError
JDBC中的查询结果封装在ResultSet中,我们可以通过列名和列序号两种方 式获取查询的数据, 当我们传入的列序号不正确的时候,就会抛出invalidColumIndexException, 例如你传入了0,就会出错,因为ResultSet中的列序号是从1开始的。 另外,如果你更改了数据表中列的顺序,你也不必更改JDBC代码,保持了程序的健壮性。 有一些Java程序员 可能会说通过序号访问列要比列名访问快一些,确实是这样,但是为了程序的健壮性、可读性,我还是更推荐你使用列名来访问。
6. 使用变量绑定而不是字符串拼接
在第一条最佳实践中,我们已经说过要使用PreparedStatment可以防止注入,而使用? 或者其他占位符也会提升性能,因为这样数据库就可以使用不同的参数执行相同的查询, 这个最佳实践带来更高的性能的同时也防止了SQL注入。
7. 要记住关闭Statement、PreparedStatement和Connection
通常的做法是在finally块中关闭它们,这样做的好处是不论语句执行正确与否, 不管是否有异常抛出,都能保证资源被释放。在Java7中,可以通过Automatic Resource Management Block来自动的关闭资源。
8. 选择合适的JDBC驱动
有四种JDBC驱动,分别是
JDBC-ODBC Bridge driver (bridge driver)
Native-API/partly Java driver (native driver)
AllJava/Net-protocol driver (middleware driver)
All Java/Native-protocol driver (Pure java driver)
9. 尽量使用标准的SQL语句,从而在某种程度上避免数据库对SQL支持的差异
不同的数据库厂商的数据库产品支持的SQL的语法会有一定的出入,为了方便移植,我推荐使用标准的ANSI SQL标准写SQL语句。
10. 使用正确的getXXX()方法
当从ResultSet中读取数据的时候,虽然JDBC允许你使用getString()和getObject()方法获取任何数据类型, 推荐使用正确的getXXX方法,这样可以避免数据类型转换。
十个 JDBC 的最佳实践的更多相关文章
- 开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践
7.5 集成Spring JDBC及最佳实践 大多数情况下Spring JDBC都是与IOC容器一起使用.通过配置方式使用Spring JDBC. 而且大部分时间都是使用JdbcTemplate类(或 ...
- Spring JDBC最佳实践(1)
原文地址:https://my.oschina.net/u/218421/blog/38513 Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Tem ...
- 【转】Java中关于异常处理的十个最佳实践
原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...
- 十个书写Node.js REST API的最佳实践(上)
收录待用,修改转载已取得腾讯云授权 原文:10 Best Practices for Writing Node.js REST APIs 我们会通过本文介绍下书写Node.js REST API的最佳 ...
- RESTful API的十个最佳实践
WebAPI在过去几年里非常的盛行,我们很多以往的技术手段都慢慢的转换为使用WebAPI来开发,因为它的语法简单规范化,以及轻量级等特点,这种方式收到了广泛的推崇. 通常我们使用RESTFul(Rep ...
- 吴太银:华为消费者云服务Cassandra使用场景与最佳实践
大家好,我是华为消费者云的吴太银. 我今天分享的主要是华为消费者云服务使用Cassandra的应用场景和最佳实践.我这个可能跟其他嘉宾分享的不太一样,因为前几个嘉宾讲的实际上对Cassandra原生的 ...
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
- [转]10个有关RESTful API良好设计的最佳实践
Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...
- Atitit.guice3 ioc 最佳实践 o9o
Atitit.guice3 ioc 最佳实践 o9o 1. Guice的优点and跟个spring的比较 1 2. 两个部分:::绑定and注入@Inject 1 3. 绑定所有的方法总结 2 3. ...
随机推荐
- 一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Linux:NFS文件共享问题重新认识
之前也搭建过nfs,服务器之间目录里面的文件同享也一直正常.今天有现场反映,搭建nfs后,客户端文件在服务器端看不见. 在我之前的认识里,服务器端搭建好并启动nfs服务,客户端mount后,客户端.服 ...
- C++数组作为函数参数的几个问题(转)
本文需要解决C++中关于数组的2个问题:1. 数组作为函数参数,传值还是传址?2. 函数参数中的数组元素个数能否确定? 先看下面的代码. #include <iostream> using ...
- can't set android permissions - built without android support
/**************************************************************************** * can't set android pe ...
- HDU6028:Forgiveness(TLE ing,占位)
Problem Description Little Q is now checking whether string A matches B. Two strings are considered ...
- SPOJ:PATHETIC STRINGS(分配问题&贪心)
Problem statement: A string is said to be “PATHETIC” if all the characters in it are repeated the sa ...
- Watir: Watir webdriver对JS 弹出框的操作现在非常简单。
以下代码支持Firefox,IE,Chrome require 'watir-webdriver' #require "watir-webdriver/extensions/alerts&q ...
- 洛谷P1247取火柴游戏
题目:https://www.luogu.org/problemnew/show/P1247 可以知道必败局面为n[1]^n[2]^...^n[k]=x=0: 而若x不等于0,则一定可以取一次使其变为 ...
- CCRect 构造函数的几个参数解释
转自: http://blog.163.com/hzklclick_wy/blog/static/21550517520137139511839/ void CCRect::setRect(f ...
- centos7更改远程端口
centos7更改远程端口 一.创建个普通账户(useradd work),给普通账户创建密码(password work) 二.查看应有的软件是否安装 1.查看semanager是否安装执行下面命令 ...