2014-01-29 72 views
1

使用JDBC驱动程序,我该如何使用来自不同查询多个结果集,而不会不断地打开和关闭连接,因为它站在IM提取w.e我需要的,它传递给另一种方法。每次打开多个结果,不同的查询,同一个数据库SQLSERVER

public static void OppQuery() { 
    Connection conn = null; 
    Statement stmt = null; 
    ResultSet result_set = null; 
    try { 
     Class.forName(JDBC_DRIVER); 
     conn = DriverManager.getConnection(DB_URL); 
     stmt = conn.createStatement(); 

     String emailInfoQuery = "FROM WHERE"; 
} 


public static void addQuery(String latestRenewalId) { 
    Connection conn = null; 
    Statement stmt = null; 
    ResultSet result_set = null; 
    try { 
     Class.forName(JDBC_DRIVER); 
     conn = DriverManager.getConnection(DB_URL); 
     stmt = conn.createStatement(); 
     String new_AddressLine1, new_AddressLine2; 
     new_AddressLine1=new_AddressLine2=""; 
     int new_ChannelOption= 0; 
} 

我试着在一个方法使用多个结果集,但它不停地抛出异常说结果集被关闭了一个新的康涅狄格州,Statement和ResultSet。我没有与SqlServver了丰富的经验,因此任何指导,将有助于:-)

+0

你目前的代码没有你描述的问题(但它似乎也是不完整的) –

+0

我想知道我可以避免这种情况,并结合成一种方法没有用一个连接分开全部 – Bgreen

回答

2

在JDBC,当连接处于自动提交模式(这是默认设置),语句的任何执行会犯以前的交易并关闭同一连接上的任何打开的结果集(假设可保存性为ResultSet.CLOSE_CURSORS_AT_COMMIT,其实际为isn't the default for SQL Server)。当你需要有多个结果集打开,你需要有自动提交禁用(或使用ResultSet.HOLD_CURSORS_OVER_COMMIT您需要使用多个Statement对象。 JDBC要求同一个对象上的新执行会关闭来自同一语句的任何其他打开结果集。

所以

  1. 禁用自动提交(Connection.setAutoCommit(false)
  2. 使用多个Statement对象打开ResultSet小号
+0

我明白为什么需要多个'Statement'对象,但我不太确定自动提交的要求。看看[这里](http://pastebin.com/BJ83DhHP)。 –

+0

规范(第10章)说:“通常情况下,在当前SQL语句需要一个并没有 无交易已经设立一个新的事务启动[...]启用自动提交导致每个个体后事务提交SQL语句一旦完成“。 JDBC有一个'每个连接单个事务'模型,所以如果一个事务是通过执行一个'Statement'开始的,那么这意味着前一个事务将被提交(或回滚),因此任何打开的ResultSet'都将被关闭(除了可保留的ResultSet外)。 –

+1

@GordThompson默认情况下,Microsoft SQL Server JDBC Driver看起来像使用可保留的'ResultSet's,请参阅[使用可持久性](http://technet.microsoft.com/zh-cn/library/ms378765.aspx) –

0

继马克的回答,因为Microsoft SQL Server的JDBC驱动程序似乎创建“可Holdable”ResultSet对象默认情况下,启用自动提交时,以下测试代码将工作:

import java.sql.*; 

public class SqlServerTest { 

    public static void main(String[] args) { 
     try { 
      String connectionUrl = 
        "jdbc:sqlserver://localhost:52865;" + 
        "databaseName=myDb;" + 
        "integratedSecurity=true"; 
      Connection con = DriverManager.getConnection(connectionUrl); 
      System.out.println(String.format("con.getAutoCommit returned %s", con.getAutoCommit())); 

      Statement st1 = con.createStatement(); 
      ResultSet rs1 = st1.executeQuery("SELECT id FROM odds"); 
      rs1.next(); 
      System.out.println(String.format("value from rs1: %d", rs1.getInt(1))); 

      Statement st2 = con.createStatement(); 
      ResultSet rs2 = st2.executeQuery("SELECT id FROM evens"); 
      rs2.next(); 
      System.out.println(String.format("value from rs2: %d", rs2.getInt(1))); 

      rs1.next(); 
      System.out.println(String.format("value from rs1: %d", rs1.getInt(1))); 

      rs2.next(); 
      System.out.println(String.format("value from rs2: %d", rs2.getInt(1))); 

      rs2.close(); 
      rs1.close(); 
      con.close(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

对于命名[比值]在表中的试验数据...

id description 
-- ----------- 
1 one 
3 three 
5 five 

...和[找齐] ...

id description 
-- ----------- 
2 two 
4 four 
6 six 

...控制台输出是:

con.getAutoCommit returned true 
value from rs1: 1 
value from rs2: 2 
value from rs1: 3 
value from rs2: 4 
相关问题