`
michales003
  • 浏览: 403605 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

连接字符串中碰到的SelectMethod=cursor

    博客分类:
  • J2EE
阅读更多

今天在数据库连接字符串中看到了selectMethod=cursor
知道了这个用法如下:
作用:以利用服务器端的游标加快速度
使用情况:
  1.执行多个Statements的操作的时候用
  2.需要手动使用事务的时候使用

 

以上是在使用sqlserver数据库的连接字符串的时候使用过。

例如:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=071008_03;SelectMethod=cursor

 

但是今天我将其用在oracle数据库的时候,却报出了一下的错误信息:

Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169869824)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))

 

这是个老话题,2002年在使用ejb的bmp就遇到了这个问题
连接数据库成功之后,想在一个事务中初始化多个预处理句柄时报错
dbConn.setAutoCommit(false)
for (int i = 0; i < 5; i++) {
pstmt[i] = dbConn.prepareStatement(strPreSQL[i]);
错误提示:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start manual transaction mode because there are cloned connections

怀疑MS SQL不能在一个事务中建多个预处理句柄
Resolution:
You have to add a property to the pool definition, something to do with selectMode=cursor or selectMethod=cursor. Check the driver documentation. Otherwise the driver will not allow more than one statement per connection at any given time
微软的专家告诉的
This error occurs when you try to execute multiple statements against a SQL Server database with the JDBC driver while in manual transaction mode (AutoCommit=false) and while using the direct (SelectMethod=direct) mode. Direct mode is the default mode for the driver."

import java.sql.*;
import java.io.*;

public class Repro{

public static void main(String args[])
{
try {
Connection con;
Statement s1 = null;
ResultSet r1 = null;
Statement s2 = null;
ResultSet r2 = null;
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;SelectMethod=Direct;User=User;Password=Password");
//fix 1
//"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;SelectMethod=Cursor;User=User;Password=Password");
con.setAutoCommit(false);

try {
s1 = con.createStatement();
r1 = s1.executeQuery("SELECT * FROM authors");

//fix 2
//r1.close();
//s1.close();

s2 = con.createStatement();
r2 = s2.executeQuery("SELECT * FROM publishers");
}
catch (SQLException ex)
{
System.out.println(ex);
}

}
catch (Exception e)
{
e.printStackTrace();
}
}
}
用SQL Server驱动一次select很多数据最好在connection string中加上SelectMethod=Cursor,以利用服务器端游标加快速度,其实不只sqlserver,oracle的jdbc,只要使用PreparedStatement,驱动默认就使用游标,sqlserver则不然,必须使用SelectMethod=Cursor才打开游标。
这点在使用jotm时,并且使用Xapool时,必须修改DataSourceFactory,把PreparedStatementPool禁掉,否则记录插的太快了,很可能是游标没来得及关闭
即使不使用jotm,大量向oracle插入数据,例如每毫秒1条,也会引发游标用完,所以大量插入数据时,应该使用oracle的批处理batchupdate.
可惜的是,微软的sqlserver的jdbc驱动不支持这个属性

1
1
分享到:
评论

相关推荐

    java连接数据库万能代码

    - `SelectMethod=Cursor`: 查询方法设置为游标方式。 ##### 4. 创建连接 ```java private static Connection con = null; Statement stmt = null; ResultSet rs = null; public connectURL() { try { if (con ...

    tomcat连接池配置

    SelectMethod=cursor" username="sa" password="" maxActive="10" maxIdle="100" maxWait="10000" /&gt; ``` 其中: - `name`是JNDI名称,遵循`jdbc/工程名`的格式。 - `password`和`username`分别是数据库的...

    基本的连接mysql、redis、rabbitmq.zip

    它的读写速度极快,支持多种数据结构如字符串、哈希、列表、集合和有序集合。连接Redis通常使用Redis客户端库,如Python的`redis`库。连接步骤如下: ```python import redis # 创建连接 r = redis.Redis(host='...

    sql2005 批量更新问题的解决方法

    以下是一个示例的JDBC连接字符串: ```properties jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=jdbc:sqlserver://127.0.0.1:1444;databaseName=fax;selectMethod=cursor; ``` ...

    asp连接数据库代码实例

    response.write \"数据库连接出错,请检查conn.asp中的连接字符串。\" response.end end if function CloseDB Conn.Close set Conn=Nothing End Function %&gt; dim badword badword=\"\'|and|select|update|...

    java+sql2005 随机抽取试题的代码

    SelectMethod=Cursor",指明了数据库服务器的地址和端口、使用的数据库名以及查询方式。 5. Java中执行SQL语句: 使用Statement对象来执行SQL查询。需要注意的是,由于可能需要执行多次查询,所以创建了多个...

    Hibernate配置手册.txt

    SelectMethod=cursor;DatabaseName=pubs &lt;property name="connection.driver_class"&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/property&gt; &lt;property name="connection.username"&gt;sa &lt;property name=...

    web前端常用单词.docx

    * Replace: 替换,用于将字符串中某个字符或字符串替换为另一个字符或字符串。 * Split: 分割,用于将字符串分割成多个子字符串。 * Substr: 截取字符串,用于截取字符串的某一部分。 * ToLowerCase: 转换为小写,...

    ASP.NET程序中常用的三十三种代码.txt

     /// 格式后的异常信息字符串,包括异常内容和跟踪堆栈.  ///  ///  public static String FormatException(Exception ex, String catchInfo)  {  StringBuilder strBuilder = new StringBuilder();  if ...

    python 零基础学习篇-18flask入门.zip

    它的数据类型包括整型、浮点型、字符串、布尔型以及列表、元组、字典等复合类型。变量声明无需指定类型,动态类型使得代码更加灵活。控制流语句如if-else、for、while等用于实现逻辑判断和循环。此外,Python还提供...

    ASP.NET常用代码

    /// 格式后的异常信息字符串,包括异常内容和跟踪堆栈. /// /// public static String FormatException(Exception ex, String catchInfo) { StringBuilder strBuilder = new StringBuilder(); if (catchInfo != ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    $b :字符串连接 逻辑和比较 逻辑运算符有: $a &#124;&#124; $b :或 $a or $b :或 $a && $b :与 $a and $b :与 $a xor $b :异或 (当$a或$b为true时为true,两者一样时为false) ! $a :非 比较运算符有: ...

    动态查询oracle加反射

    例如,你可以创建一个通用的DAO类,它接收SQL字符串作为输入,然后利用反射调用特定的CRUD方法。 **OracleProc.txt**: 这个文件可能包含Oracle数据库的存储过程定义或者调用存储过程的示例。在Java中,我们可以...

    Python需要掌握的知识点

    - **字符串**:由一系列字符组成的数据类型。可以进行拼接、分割等操作。 - **布尔**:表示真或假的值,通常用于逻辑判断。 - **元组**:不可变序列,一旦创建后无法更改。例如,`t = (1, 2, 3)`。 - **列表**:可变...

    2021-2022计算机二级等级考试试题及答案No.539.docx

    8. GET请求:在HTML表单中,若要将数据以字符串方式附加在URL后面提交,需要将`&lt;form&gt;`标签的`method`属性设置为`GET`。 9. 表文件名:在某些数据库操作中,如FoxPro,`Number="3" File="file" + Number Use &File`...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    --字符串加解密,返回一串32位长的字符串 --Select UTL_INet.f_MD5( 'TestPassword' ) From Dual; Function f_MD5( as_SourceStr in Varchar2 --需要加密的字符串 ) Return Varchar2; --将Email地址...

    oracle常见Exception

    当尝试将非数字字符串转换为数字类型时,系统会抛出`INVALID_NUMBER`(ORA-01722)异常。 **解决方法:** 1. **验证输入**:确保所有用于数值计算的输入都是有效的数字格式。 2. **使用TRY/CATCH结构**:通过TRY/...

Global site tag (gtag.js) - Google Analytics