Timesten for java guide 学习笔记

使用timesten for java
i.    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接口

ii. 链接timesten
在操作手册中讲解了如何创建一个DSN来定义一个到timesten的连接。你创建的DSN的类别取决于你创建的链接是直接连接数据库还是通过一个客户端。当你创建完一个DSN,程序就可以链接数据库了。timesten的数据库连接驱动是com.timesten.jdbc.TimesTenDriver,其他和我们使用jdbc链接数据库一样。

iii. 创建一个connection Url对timesten数据库
格式如下:jdbc:timesten:{direct | client}:dsn=DSNname;[DSNattributes;]
如:jdbc:timesten:direct:dsn=demo
可以在后面加参数  如:jdbc:timesten:direct:dsn=demo;LockLevel=1

iv. 链接数据源
定义了Connetion URL 可以通过DriverManager.getConnection() 或者 TimesTenDataSource.getConnection()方法连接到数据库。
如果要使用数据源:
TimestenDataSource ds = new TimestenDataSource();
ds.setUrl(url);
Connection con = ds.getConnection();

关闭连接使用connection.close()方法

v. 在java程序中调用SQL Statement的方法
□ 使用con.setAutoCommit()方法设置是否自动提交事务。如果不是自动提交你可以调用Connetion.commit()方法手动提交。
□ PraperedStatement
当你准备通过PraperdStatement执行Sql,调用Connetion.commit()方法来释放先前获得锁和?????。当你执行完了一个prapered statment后,调用ParperedStatment.close释放相关资源。

vi. 执行Sql语句
与jdbc中操作一样。
在执行一个sql时,可以设置执行的超时,你可以在timesten中通过设置DSN的设置,设置所有链接的执行Sql的超时时间。你也可以在当前连接中调用Statement.setQueryTimeout重新设置执行一个Sql的最长响应时间。在timesten超时时间必将的是触指其执行的Sql语句超时。设置超时时间的操作只能在非事务性的操作起作用,对于事务而言,当事务执行的时候,timesten不会管这个超时时间。
注意:在LockWait值和SqlQueryTimeout在timesten中被同时设定时,值小的值会被timesten采用。


vii. 抓取多条数据
你可以制定你要抓取的数据的数量:
□ 调用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.


viii. 通过batch同时执行多条语句
与jdbc一致

ix. 结果集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.

x. 在timesten中使用存储过程
xi. 处理多线程
当你使用direct-linked模式连接数据库,timesten使用一个共享栈在你程序中。在多线程环境下,避免给线程重复分配栈是非常重要的。这个栈空间的消耗取决于Sql的执行。在32位机上该栈空间最小是16kb,64位机上在34kb到72kb之间。给每个线程分配的栈空间依赖于操作系统。注意:在多线程环境下,一个线程发出的对同一数据的请求在多个连接器上可能会造成死锁。timesten解决这种死锁的方法是使用lock timeouts。

xii. 回滚失败的事务
使用Connection.rollback()方法回滚失败的事务。






调优你的程序:(以下大部分建议对oracle数据库也应该适用)
i.    关闭autocommit模式
     XACT_COMMITS中的SYS.MONITOR表记录了事务提交的次数。大量的无意义的事物提交对系统的效率会有较大的影响

ii.   选择一个合适的超时时间

iii.   减少链接数量
   Data store contention can substantially impede application performance.(大量存储连接会大大影响系统的效率)
□    选择适当的锁级别
□    分布存储你的表或者数据
  在SYS.MONITOR表中LOCK_GRANTS_IMMED,LOCK_GRANTS_WAIT和LOCK_GRANTS_CONT记录当前的锁信息。

iv.   选择最好的锁方法
  timesten支持data-level locking、table-level locking和row-level locking

v.   使用恰当的锁级别
如果访问连接非常少(很少有事务同时产生的时候),使用表锁定会得到非常好的效率和很少发生死锁的情况。表锁定也非常适用于几乎全表的数据update的时候。Date-level locking 一般在系统初始化时使用。

vi. 选择恰当的隔离级别
当使用row-level locking时,程序事务可以是serializeable 和 Read_committed级别,默认是Read_committed级别。
当事务运行在serializeable的隔离级别时,timesten 将在整个事务过程中持有所有的锁。   //todo: 验证这两种方式。
□      任何的对于row锁的更新都在commit时写入。                                                   
□      该row在事务commit后才能读。
当事务运行在Read_committed级别时,timesteen只在整个过程中持有更新锁。 
SYS.MONITOR表中的LOCK_TIMEOUT和DEADSLOCK记录着锁消息。

vii. 选择恰当的日志配置
SYS.MONITOR表中的LOG_FORCES配置了日志写入硬盘的时间间隔。你可以使用LogDir参数在创建链接的时候,自己指定日志的输出目的地。

viii. 使用prepared statement

ix. 避免不必要的prepared选项
应为预编译Sql语句是一个较昂贵的操作,所以你的程序应尽量将调用Connection.PraperedStatement降到最小。尽量将多的操作放在同一个事务里多次调用在一个connction中,PraperedStatment在一个conntion关闭后失效。

x. 使用batch一次执行多条语句
当有多条Sql执行时,使用Statment和PraperedStatment的execute的batch方法,可以提高程序的效率。

xi. 大批量的抓取数据、
避免获取当量数据时,其中某些数据有锁。

xii. 适当的事务大小
每一个事务提交时timesten会自动的产生日志,并自动触发写入日志到硬盘。高效的系统应当避免不必要的磁盘写入。如果你的磁盘io使用率过高,可以通过两种方式在事务提交的时候避免写入。
□  调整事务的大小
□ 调整当事务提交时是否写入属性
长事务的执行只有很少的磁盘写入,当时要控制多个长事务同时发生。如果整个程序只有一个链接操作数据库,长事务确实可以大大提高程序的性能。但长事务同时有很多缺陷,比如长事务的回滚。
如果有多个连接,你需要抉择io的延迟还是锁的延迟,最好保持他们自然的长度。这取决于他们的持久性和原子性。

xiii. 恰当的事务提交
Timesten 会默认将每一次事务提交的结果写入硬盘,以便在系统出现问题的时候不置数据丢失。程序可以避免对非持久性的提交的对磁盘的写入操作。
SYS.MONITOR表中的XACT_D_COMMITS记录着持久性提交的数量。事务可以定义成持久的可以定义延迟的在链接的底层,程序可以调用
ttDurableCommit方式强制持久提交。

xiv. 保守的使用ResultSet.getString方法
因为Java中String是不可以改变的,ResultSet.getString方法在每次调用的时候重新分配空间。在JDBC中这是个昂贵的调用。你可以使用原始数据类型,如byte或者Integer,除非必须使用String。使用这些原始类型是速度是非常快的。

xv. 避免类型转换

xvi. 避免事务回滚
从性能的角度出发这是我们不愿看到的:一个事务的回滚不仅回滚本身带了了性能上的开销,而且也同时代表的事务本身的消耗的浪费。

xvii. 避免频繁的checkpoints
有时候我们需要调用ttCkpt程序来检查日志文件是否已经填满了整个硬盘,这个操作对系统性能有较大影响。但ttCkpt是一个非阻塞操作,比起ttCkptBlocking的阻塞操作来说要好的多。

对jdbc接口的支持:
        
   timesten的Connetion等类节本实现了对java.sql和javax.sql下面标准接口的实现             

对jdbc接口的扩展:
           
              对jdbc的扩展主要是TimesTenConnection和TimesTenVendorCode  (具体信息参看文档)

             









你可能感兴趣的:(java,多线程,oracle,sql,jdbc)