MS SQL SERVER JDBC DRIVER的并发控制级别

链接是同步的,由于链接所对应的资源是有限的:物理通道。安全

可是STATEMENT即会话不是同步的。会话层承载的不是通讯,而是对话。通讯须要同步是由于有限资源,对话层创建在通讯层的基础上,既然通讯层已经同步了,为何还要在会话层再同步一次呢。意思是,对有限资源:物理通道,的同步,已经在通讯层实现了,没有必要再在会话层实现它。通讯须要同步可是会话不须要的另外一个缘由是,没有任何理由要求全部会话按照必定的顺序来进行。即:一次对话必须在另外一次对话完成之后才能开始。。。没有任何这方面的充足理由。通道摆在那里的缘由就是为会话提供服务,而通道是全双工的,为何我要固守一个一个来的原则。必定要那样作,那固然是愚蠢的。服务器

能够在一个通道上同时进行多个对话。这么作的缘由是,通道是全双工的。若是在对话的回复等待期间傻傻地等待,那是一件很是愚蠢的事情。由于通道在这段时间内被浪费了(这即是为何使用多个链接的并发策略的确“有效”的缘由了------由于多个链接虽然没有共享通道,可是它们共享了服务器端资源。而通道共享的目的显然也是为了共享服务器端资源------对通道的任何使用,最终目的都是为了获得服务器端所提供的服务!)。多线程

下面是微软的JDBC DRIVER使用指南:并发

在多线程中使用 JDBC 驱动程序 

经过 Microsoft SQL Server 2005 JDBC Driver SQLServerConnection 对象进行的通讯是同步的,所以可安全地执行在多个线程中共享一个链接的语句。StatementSQLServerResultSet 类不是线程安全的。全部与 SQL Server Database Engine 的通讯都在链接级别同步。在 JDBC 中,事务控制(例如提交和回滚)是在链接级别实现的。所以,若是多线程须要独立的事务控制,则它们必须分别建立和操做本身的链接。spa

下列驱动程序线程方案是有效的:线程

单线程的操做

Connection con = <new connection>
Statement stmt = con.createStatement(..);
stmt.execute(..)

使用单个链接的多线程

Connection con = <new connection>

SomeThread t1 = new SomeThread(con);
t1.start();

SomeThread t2 = new SomeThread(con);
t2.start();

class SomeThread implements Runnable {
   SomeThread(Connection con) {
      connection = con;
   }
   run() {
      Statement stmt = connection.createStatement(..);
      stmt.execute(..);
   }
}

 

意思是,链接是同步的。由于链接被假设为将被多线程共享。可是句子是不一样步的,由于句子被假设为将不被多线程共享。由于没有理由这么作。为何我会须要在一个线程执行一个句子,同时在另外一个线程执行一样的句子呢?一个句子执行一次就能够了。将一个句子执行两次是没有意义的。code

因此没有必要!对象

问题是,当句子执行的时候,确定是要调用链接层的东西的。那么在这个时候,链接层到底有没有提供并发的对话支持?由于要提供对并发对话的支持,它必须在内存中管理多个对话,也就是说,它必须在其中实现并发式的会话能力。事务

相关文章
相关标签/搜索