Timesten for java guide 学习笔记
2008-05-26 17:01
387 查看
使用timesten for java
Java类
想链接timesten,在你的java类中你需要引入标准jdbc包(java.sql.*)如果你想使用数据源你还需要引进包javax.sql.*包。Timesten 提供了对标准java标准包的扩展。
com.timesten.jdbc.DataSource 实现了javax.sql.DataSource接口
com.timesten.jdbc.TimesTenVendorCode 实现了javax.sql.XADataSource接口
com.timesten.jdbc.TimesTenConnection 实现了java.sql.Connection接口
链接timesten
在操作手册中讲解了如何创建一个DSN来定义一个到timesten的连接。你创建的DSN的类别取决于你创建的链接是直接连接数据库还是通过一个客户端。当你创建完一个DSN,程序就可以链接数据库了。timesten的数据库连接驱动是com.timesten.jdbc.TimesTenDriver,其他和我们使用jdbc链接数据库一样。
创建一个connection Url对timesten数据库
格式如下:jdbc:timesten:{direct | client}:dsn=DSNname;[DSNattributes;]
如:jdbc:timesten:direct:dsn=demo
可以在后面加参数 如:jdbc:timesten:direct:dsn=demo;LockLevel=1
链接数据源
定义了Connetion URL 可以通过DriverManager.getConnection() 或者 TimesTenDataSource.getConnection()方法连接到数据库。
如果要使用数据源:
TimestenDataSource ds = new TimestenDataSource();
ds.setUrl(url);
Connection con = ds.getConnection();
关闭连接使用connection.close()方法
在java程序中调用SQL Statement的方法
使用con.setAutoCommit()方法设置是否自动提交事务。如果不是自动提交你可以调用Connetion.commit()方法手动提交。
PraperedStatement
当你准备通过PraperdStatement执行Sql,调用Connetion.commit()方法来释放先前获得锁和?????。当你执行完了一个prapered statment后,调用ParperedStatment.close释放相关资源。
执行Sql语句
与jdbc中操作一样。
在执行一个sql时,可以设置执行的超时,你可以在timesten中通过设置DSN的设置,设置所有链接的执行Sql的超时时间。你也可以在当前连接中调用Statement.setQueryTimeout重新设置执行一个Sql的最长响应时间。在timesten超时时间必将的是触指其执行的Sql语句超时。设置超时时间的操作只能在非事务性的操作起作用,对于事务而言,当事务执行的时候,timesten不会管这个超时时间。
注意:在LockWait值和SqlQueryTimeout在timesten中被同时设定时,值小的值会被timesten采用。
抓取多条数据
你可以制定你要抓取的数据的数量:
调用Statement.setFitchSize()和ResultSet.setFitchSize()方法,这是标准jdbc调用。但是一次设置只在一个statment中有用。
你可以调用TimestenConnection.setFitchCount()方法或者使用ttIsql prefetchcount命令。通过这种方式可以设置一个connetion的所有statment的抓取数量。注意:你只能在direct-linked模式下使用TimestenConnection的setFitchCount方法才有作用。当你将setFItchCount(int count)中的count设为零时,timeten将使用默认值,这个默认值依赖于你对数据库设置的Isolation的级别。在read commited 下,这个值为5,在serializeable模式下这个值为128.
通过batch同时执行多条语句
与jdbc一致
结果集ResultSet
TimesTen不支持在一个statment中打开多个ResultSet,一个statment不能返回多个ResultSet。
TimesTen不支持持有游标。你不能指定长期持有一个ResultSet及时在Commit后没有关闭ResultSet。
ResultSet对象不能制定ResultSet.CONCUR_UPDATABLE和ResultSet.TYPE_SCROLL_SENSITIVE属性
在你使用完ResultSet后马上关闭它。
ResultSet的getString方法是个高昂消耗的方法,尽量少使用它。
JDBC ignores the setting for the ConnectionCharacterSet attribute. It
returns data in UTF-16 encoding.
在timesten中使用存储过程
处理多线程
当你使用direct-linked模式连接数据库,timesten使用一个共享栈在你程序中。在多线程环境下,避免给线程重复分配栈是非常重要的。这个栈空间的消耗取决于Sql的执行。在32位机上该栈空间最小是16kb,64位机上在34kb到72kb之间。给每个线程分配的栈空间依赖于操作系统。注意:在多线程环境下,一个线程发出的对同一数据的请求在多个连接器上可能会造成死锁。timesten解决这种死锁的方法是使用lock timeouts。
回滚失败的事务
使用Connection.rollback()方法回滚失败的事务。
调优你的程序:(以下大部分建议对oracle数据库也应该适用)
关闭autocommit模式
XACT_COMMITS中的SYS.MONITOR表记录了事务提交的次数。大量的无意义的事物提交对系统的效率会有较大的影响
选择一个合适的超时时间
减少链接数量
Data store contention can substantially impede application performance.(大量存储连接会大大影响系统的效率)
选择适当的锁级别
分布存储你的表或者数据
在SYS.MONITOR表中LOCK_GRANTS_IMMED,LOCK_GRANTS_WAIT和LOCK_GRANTS_CONT记录当前的锁信息。
选择最好的锁方法
timesten支持data-level locking、table-level locking和row-level locking
使用恰当的锁级别
如果访问连接非常少(很少有事务同时产生的时候),使用表锁定会得到非常好的效率和很少发生死锁的情况。表锁定也非常适用于几乎全表的数据update的时候。Date-level locking 一般在系统初始化时使用。
选择恰当的隔离级别
当使用row-level locking时,程序事务可以是serializeable 和 Read_committed级别,默认是Read_committed级别。
当事务运行在serializeable的隔离级别时,timesten 将在整个事务过程中持有所有的锁。 //todo: 验证这两种方式。
任何的对于row锁的更新都在commit时写入。
该row在事务commit后才能读。
当事务运行在Read_committed级别时,timesteen只在整个过程中持有更新锁。
SYS.MONITOR表中的LOCK_TIMEOUT和DEADSLOCK记录着锁消息。
选择恰当的日志配置
SYS.MONITOR表中的LOG_FORCES配置了日志写入硬盘的时间间隔。你可以使用LogDir参数在创建链接的时候,自己指定日志的输出目的地。
使用prepared statement
避免不必要的prepared选项
应为预编译Sql语句是一个较昂贵的操作,所以你的程序应尽量将调用Connection.PraperedStatement降到最小。尽量将多的操作放在同一个事务里多次调用在一个connction中,PraperedStatment在一个conntion关闭后失效。
使用batch一次执行多条语句
当有多条Sql执行时,使用Statment和PraperedStatment的execute的batch方法,可以提高程序的效率。
大批量的抓取数据、
避免获取当量数据时,其中某些数据有锁。
适当的事务大小
每一个事务提交时timesten会自动的产生日志,并自动触发写入日志到硬盘。高效的系统应当避免不必要的磁盘写入。如果你的磁盘io使用率过高,可以通过两种方式在事务提交的时候避免写入。
调整事务的大小
调整当事务提交时是否写入属性
长事务的执行只有很少的磁盘写入,当时要控制多个长事务同时发生。如果整个程序只有一个链接操作数据库,长事务确实可以大大提高程序的性能。但长事务同时有很多缺陷,比如长事务的回滚。
如果有多个连接,你需要抉择io的延迟还是锁的延迟,最好保持他们自然的长度。这取决于他们的持久性和原子性。
恰当的事务提交
Timesten 会默认将每一次事务提交的结果写入硬盘,以便在系统出现问题的时候不置数据丢失。程序可以避免对非持久性的提交的对磁盘的写入操作。
SYS.MONITOR表中的XACT_D_COMMITS记录着持久性提交的数量。事务可以定义成持久的可以定义延迟的在链接的底层,程序可以调用
ttDurableCommit方式强制持久提交。
保守的使用ResultSet.getString方法
因为Java中String是不可以改变的,ResultSet.getString方法在每次调用的时候重新分配空间。在JDBC中这是个昂贵的调用。你可以使用原始数据类型,如byte或者Integer,除非必须使用String。使用这些原始类型是速度是非常快的。
避免类型转换
避免事务回滚
从性能的角度出发这是我们不愿看到的:一个事务的回滚不仅回滚本身带了了性能上的开销,而且也同时代表的事务本身的消耗的浪费。
避免频繁的checkpoints
有时候我们需要调用ttCkpt程序来检查日志文件是否已经填满了整个硬盘,这个操作对系统性能有较大影响。但ttCkpt是一个非阻塞操作,比起ttCkptBlocking的阻塞操作来说要好的多。
对jdbc接口的支持:
timesten的Connetion等类节本实现了对java.sql和javax.sql下面标准接口的实现
对jdbc接口的扩展:
对jdbc的扩展主要是TimesTenConnection和TimesTenVendorCode (具体信息参看文档)
相关文章推荐
- View Programming Guide for iOS 学习笔记_1
- cilk之User Guide学习笔记(4)cilk_for的分析
- Java for Web学习笔记(五九):Controller替代Servlet(1)请求匹配
- Java for Web学习笔记(六二):Controller替代Servlet(4)方法返回值
- Java for Web学习笔记(五七):Spring框架简介(6)代码设置
- View Programming Guide for iOS 学习笔记_3
- Java for Web学习笔记(二十):Session(4)在集群中使用Session
- JAVA学习笔记(for的用法)
- Java for Web学习笔记(六):Servlet(4)HttpServletResponse
- Java for Web学习笔记(七七):Validation(1)启动验证
- Java for Web学习笔记(十六):JSP(6)jspx
- Java学习笔记:for-each增强for循环
- Java for Web学习笔记(六四):Controller替代Servlet(6)Spring Form Tag
- Java for Web学习笔记(七四):国际化i18n(2)Locale Resolver
- Java for Web学习笔记(八六):消息和集群(1)一般性了解
- Java for Web学习笔记(五二):Spring框架简介(1)特点简述
- Java for Web学习笔记(三八):自定义tag(6)一些注意
- Java学习笔记_4_增强的for循环
- 九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
- Java for Web学习笔记(九九):持久化初探(4)JPA小例子(下)