您的位置:首页 > 产品设计 > UI/UE

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 (具体信息参看文档)
 
             
 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息