jdbc相关技术Word文件下载.docx
- 文档编号:1552453
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:24
- 大小:28.40KB
jdbc相关技术Word文件下载.docx
《jdbc相关技术Word文件下载.docx》由会员分享,可在线阅读,更多相关《jdbc相关技术Word文件下载.docx(24页珍藏版)》请在冰点文库上搜索。
...
Class.forName(driverName);
db=DriverManager.getConnection(connectURL);
Statementstatement=db.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE
);
这个Statement现在将产生能够更新并将应用其他数据库用户所作更改的ResultSet。
您还能够在这个ResultSet中向前和向后移动。
第一个参数指定ResultSet的类型。
其选项有:
TYPE_FORWARD_ONLY:
缺省类型。
只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:
允许在列表中向前或向后移动,甚至能够进行特定定位,例如移至列表中的第四个记录或从当前位置向后移动两个记录。
不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:
象TYPE_SCROLL_INSENSITIVE相同,允许在记录中定位。
这种类型受到其他用户所作更改的影响。
假如用户在执行完查询之后删除一个记录,那个记录将从ResultSet中消失。
类似的,对数据值的更改也将反映在ResultSet中。
第二个参数配置ResultSet的并发性,该参数确定是否能够更新ResultSet。
CONCUR_READ_ONLY:
这是缺省值,指定不能够更新ResultSet
CONCUR_UPDATABLE:
指定能够更新ResultSet
MySQLTimestamp型態的屬性(新增/修改自動更新Timestamp型態的欄位)
MySQL的timestamp型態的屬性比較特別,預設timestamp的屬性是,只要有值新增/修改(同一個row),MySQL會自動幫你將"
timestamp型態的欄位"
寫入現在時間.
有兩種屬性可供調整使用:
∙自動初始化:
此欄位寫入資料時,自動將timestamp的欄位寫入現在時間(建立時,自動寫入時間).(DEFAULTCURRENT_TIMESTAMP)
∙自動更新:
此欄位修改資料時,自動將timestamp的欄位寫入現在時間(更新時,自動寫入時間).(ONUPDATECURRENT_TIMESTAMP)
主要有下述四種設法/時機:
(範例轉載自官方網站:
MySQL5.1ReferenceManual-TIMESTAMPProperties)
∙自動初始化及自動更新
tsTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP
∙只做自動初始化(建立時初始化,更新時不修改時間)
tsTIMESTAMPDEFAULTCURRENT_TIMESTAMP
∙只做自動更新(建立時不做初始化動作)
tsTIMESTAMPDEFAULT0ONUPDATECURRENT_TIMESTAMP
∙全都不做(使用這個的話,或許直接用DATETIME的型態似乎比較方便?
)
tsTIMESTAMPDEFAULT0
mysqlJDBCDriver
常用的有两个,一个是gjt(GiantJavaTree)组织提供的mysql驱动,其JDBCDriver名称(JAVA类名)为:
org.gjt.mm.mysql.Driver
详情请参见网站:
http:
//www.gjt.org/
或在本网站下载mysqlJDBCDriver(mm.jar)
另一个是mysql官方提供的JDBCDriver,其JAVA类名为:
com.mysql.jdbc.Driver
驱动下载网址:
Connector/J区域下载。
mysqlJDBCURL格式如下:
//[host:
port],[host:
port].../[database][?
参数名1][=参数值1][&
参数名2][=参数值2]...
现只列举几个重要的参数,如下表所示:
参数名称
参数说明
缺省值
最低版本要求
user
数据库用户名(用于连接数据库)
所有版本
password
用户密码(用于连接数据库)
useUnicode
是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true
false
1.1g
characterEncoding
当useUnicode设置为true时,指定字符编码。
比如可设置为gb2312或gbk
autoReconnect
当数据库连接异常中断时,是否自动重新连接?
1.1
autoReconnectForPools
是否使用针对数据库连接池的重连策略
3.1.3
failOverReadOnly
自动重连成功后,连接是否设置为只读?
true
3.0.12
maxReconnects
autoReconnect设置为true时,重试连接的次数
3
initialTimeout
autoReconnect设置为true时,两次重连之间的时间间隔,单位:
秒
2
connectTimeout
和数据库服务器建立socket连接时的超时,单位:
毫秒。
0表示永不超时,适用于JDK1.4及更高版本
3.0.1
socketTimeout
socket操作(读写)超时,单位:
0表示永不超时
对应中文环境,通常mysql连接URL可以设置为:
3306/test?
user=root&
password=&
characterEncoding=gbk&
autoReconnect=true&
failOverReadOnly=false
在使用数据库连接池的情况下,最好设置如下两个参数:
需要注意的是,在xml配置文件中,url中的&
符号需要转义成&
。
比如在tomcat的server.xml中配置数据库连接池时,mysqljdbcurl样例如下:
amp;
characterEncoding=gbk
&
failOverReadOnly=false
其他参数请参见mysqljdbc官方文档:
MySQLConnector/JDocumentation
使用他们.
数据库有一个艰苦的工作.它们不断地从许多客户端读取SQL查询,对数据进行尽
可能高效的查询.处理语句可能成为一个代价较高的操作,但是现在数据库都是很
好的设计,这样这个困难被减到最小.但是这些优化需要应用程序开发者的协助,
这篇文章给你展示一下怎样正确使用PreparedStatement来漂亮地帮助数据库执行
这些优化.
一个数据库怎样执行一条语句?
显然,不要希望这里有许多细节;
我们只看一下对这篇文章比较重要的部分.当一个
数据库接收到一条语句的时候,数据库引擎首先解析这条语句,查看语法错误.一
旦语句解析了,数据库需要找出最有效的方法来执行这条语句.这个计算起来代价
很大.数据库检查什么索引(如果有的话)能有所帮助,或者它是否能全部读出一张
表中所有的记录.数据库根据这些关于数据库所存数据的统计数字来找出最好的
办法.一旦制订出查询方案,就可以由数据库引擎来执行.
需要CPU来产生访问方案.理想的情况,如果我们把相同的语句给数据库发送两
次,我们期望数据库重用第一条记录的访问方案.这会比第二次重新产生方案要使
用较少的CPU.
语句缓冲
数据库可以进行调节来做语句缓冲.通常包含一些类型的语句缓冲.缓冲使用语句
本身作为关键字,访问方案和相应的语句存储在缓冲区中.这样就允许数据库引擎
对以前执行过的语句所使用的访问方案进行重用.举个例子来说,如果我们向数据
库发送这样一条语句"
selecta,bfromtwherec=2"
计算好的访问方案就放入缓冲
区了.如果我们以后再使用同样的语句,数据库就能重用以前的访问方案,这样就
能节省CPU.
但是要注意,整条语句是一个关键字.例如,如果我们后来发送的语句是"
selecta,b
fromtwherec=3"
那么就不会找出以前的访问方案.因为"
c=3"
和"
c=2"
是不一
样的.所以,例如:
For(intI=0;
I<
1000;
++I)
{
PreparedStatementps=conn.prepareStatement("
selecta,bfromt
wherec="
+I);
ResultSetrs=Ps.executeQuery();
Rs.close();
Ps.close();
}
这里不会用到缓冲.每次循环向数据库发送一条不同的SQL语句.每次循环都重新
计算新的访问方案,用这种方法我们会浪费大量的CPU周期.但是,看看下一个片
段:
selecta,bfromtwherec
=?
"
For(intI=0;
ps.setInt(1,I);
ResultSetrs=ps.executeQuery();
ps.close();
这样就会高效得多.发送给数据库的语句在sql中使用'
?
'
符号来参数化.这意味着
每次循环发送的是同一条语句,在"
c=?
部分带有不同的参数.这样就允许数据库
重用语句的访问方案,是程序在数据库内部运行得更高效.这基本上能使你的程序
运行得更快,或者使数据库用户能更多地使用CPU.
PreparedStatement和J2EE服务器
当我们使用J2EE服务器的时候,事情会变得更加复杂.通常情况下,一个预先准备
好的语句(preparedstatement)是和一个单独的数据库连接相关联的.当连接关闭时,
语句就被丢弃了.一般来说,一个胖客户端应用程序在得到一个数据库连接后会一
直保持到程序结束.它会使用两种方法创建所有的语句:
急切创建(eagerly)或者懒
惰创建(lazily).Eagerly是说,当程序启动时全部创建.Lazily是说随用随创建.急切
的方法会在程序启动时有些延时,但是一旦程序启动以后,运行很好.懒惰的方法启
动很快,但是当程序运行时,预先准备的语句在第一次使用是创建.这就会造成性能
不平衡,知道所有的语句都准备好了,但是最终程序会和急切方法一样快.哪一种
最好要看你需要的是快速启动还是均衡的性能.
一个J2EE应用程序所带来的问题就是它不能像这样工作.它只在一个请求的生存
时间中保持一个连接.这意味着在他处理每一个请求时都会重新创建语句,就不象
胖客户端只创建一次,而不是每个请求都创建那样有效,
当J2EE服务器给你的程序一个连接时,并不是一个真正的连接,而是一个经过包装
的.你可以通过查看那个连接的类的名字来检验一下.它不是一个数据库的JDBC
连接,是你的服务器创建的一个类.通常,如果你调用一个连接的close方法,那么
jdbc驱动程序会关闭这个连接.我们希望的是当J2EE应用程序调用close的时候,
连接会返回到连接池中.我们通过设计一个代理的jdbc连接类来做这些,但看起来
就象是实际的连接.当我们调用这个连接的任何方法时,代理类就会把请求前递给
实际的连接.但是,当我们调用类似close的方法时,并不调用实际连接的close方
法,只是简单地把连接返回给连接池,然后把代理连接标记为无效,这样当它被应
用程序重新使用时,我们会得到异常.
包装是非常有用的,因为它帮助J2EE应用程序服务器实现者比较聪明地加上预先
准备语句的支持.当程序调用Connection.prepareStatement时,由驱动程序返回一
个PreparedStatement对象.当应用程序得到它时,保存这个句柄,并且在请求完成
时,关闭请求之前关闭这个句柄.但是,在连接返回到连接池之后,以后被同样或者
另一个应用程序重用时,那么,我们就理论上希望同样的PreparedStatement返回给
应用程序.
J2EEPreparedStatement缓冲
J2EEPreparedStatement缓冲由J2EE服务器内部的连接池管理器使用一个缓冲区
来实现.J2EE服务器在连接池中保存一个所有数据库的预先准备语句的一个列表.
当一个程序调用一个连接的prepareStatement方法时,服务器先检查这个语句是否
已经有了,如果是,相应的PreparedStatement就在缓冲区内,就返回给应用程序,如
果不是,请求就会传递给jdbc驱动程序,请求/预先准备语句对象就会加入到缓冲
区里.
对于每一个连接我们需要一个缓冲区,因为这是jdbc驱动程序的工作要求.任何返
回的preparedStatement都是针对这个连接的.
如果我们要利用缓冲区的优势,要使用和前面相同的规则.我们需要使用参数话的
查询,这样它们就会和已经在缓冲区的某一个匹配.大多数应用程序服务器都允许
你调整缓冲区的大小.
概要
总之,对于预先准备语句,我们应该使用参数化的查询.这样允许数据库重用已经存
在的访问方案,从而减轻数据库的负担.这样的缓冲区是这个数据库范围的,所以
你可以安排你所有的应用程序,使用相似的参数化的SQL,就会提高这样的缓冲区
方案的效率,因为一个应用程序可以使用另一个应用程序的语句.一个应用服务器
的优势也在于此,因为访问数据库的逻辑应该集中在数据访问层上(OR映射,实体
bean或者直接JDBC).
最后,预先准备语句的正确使用也让你利用应用程序服务器的预先准备语句的缓冲
区的好处.会提高你的应用程序的性能,因为应用程序通过对以前的预先准备语句
的重用减少JDBC驱动程序调用的次数.这样使它能和胖客户端的效率竞争,并且
去掉了不能保持一个长期连接的坏处.
如果你使用参数化的预先准备语句,就可以提高数据库和你的服务器端的代码的效
率.这些提高都会允许你的应用程序提高性能.
JDBC性能优化
jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另一个是与数据库相对独立的jdbc应用程序接口(api)的使用。
这里说的是如何正确使用jdbc编程接口,以获得更好的性能。
jdbc主要优化有:
1.选择正确的jdbc驱动程序
2.Connention的优化:
使用连接池来管理Connection对象
3.Statement的优化:
使用批量更新等
4.Result的优化:
正确的从数据库中get数据等
(1)选择正确的jdbc驱动程序:
1、jdbc-odbc桥
2、本地api-部分java驱动
3、jdbc网路协议-纯java驱动
4、jdbc本地协议
最好选择jdbc网路协议-纯java驱动
效率比较高
但需要第三方软件的支持比如corba
weblogic属于这种类型
(2)优化Connection对象:
1、设置适当的参数
DriverManager.getConnection(Stringurl,Propertiesprops);
例如:
Propertiesprops=newProperties();
props.put("
user"
"
wuwei"
password"
defaultRowPrefectch"
30"
dufaultBatchValue"
5"
Connectioncon=DriverManager.getConnection("
oracle:
thin:
@hostsString"
props);
对象可以通过设置setDefaultRowPrefetch(int)和setDefaultBatchValue(int)两个参数类优化连接
2、使用连接池
可以自己写一个连接池,这样程序的灵活性强,便于移植。
apache项目开发了一套非常通用而表现非常稳定的对象池http:
//jakarta.apache.org/commons/pool.htm
设计了自己的连接池后,在客户端调用建立对象:
publicObjectmakeObject()throwsException{
Class.forName("
oracle.jdbc.driver.OracalDriver"
returnDriverManager.getConnection("
url"
username"
}
销毁对象时用:
publicvoiddestroyObject(Objectobj)throwsException{
((Connection)obj.close());
注意几点:
对象池里有没有回收机制,对象池里有机有容量限制,对象池里有多少个闲置对象(可以释放)
3、控制事务的提交
最好手动提交事务,不但可以可以保证数据原子性,而且对新能提高留下余地。
try{
connection.setAutoCommint(false);
//代码用PreparedStatement性能比Statementh好
mit();
connection.setAutoCommit(true);
}catch(SQLExceptione){
}finally{
//代码
if(connection!
=null){
connection.close();
4、适当的选择事务的隔离级别
TRANSACTION_READ_UNCOMMITED
性能最高
TRANSACTION_READ_COMMITED
快
TRANSACTION_REFEATABLE_READ
中等
RANSACTION_SERIALIZABLE
慢
(3)Statement优化:
jdbc3个接口用来处理sql的执行,是StatementPreparedStatementCallableStatement提供适当的Statement接口批量执行sql从数据库批量获取数据。
PreparedStatement比Statement性能要好主要体现在一个sql语句多次重复执行的情况。
PreparedStatemnt只编译解析一次而Statement每次编译一次。
批量修改数据库
Statement提供方法addBatch(String)和executeBatch()
调用方法为
stmt.addBatch("
isnert....."
update....."
stmt.executeBatch();
也可以用PreparedStatement从而更好的提高性能:
pstmt=conn.preparedStatement("
insertintotest_table(......)values(....?
)"
pstmt.setString(1,"
aaa"
pstmt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- jdbc 相关 技术