JDBC错误FAQ

问题1:出现ClassNotFoundException

    这个问题是由于你没有把driver类放到你的classpath中,也就是说你的程序找不到驱动类,包括三个包:msutil.jar,msbase.jar,mssqlserver.jar

--解决:jb:可以在工程属性中加入这三个包,netbean:可以把这三个包copy到某一个 lib下,也就是某个类的公共库中。

 

问题2:出现[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket

    这个错误,不论在什么情况下,凡是出现这种错误的,都不是程序本身的错误,因为大部分人都知道:jdbc:microsoft:sqlserver:@/localhost:1433;这样写是对的,但为什么这样写呢?

 

下面我们就详细的看一下如何用jdbc连接到sqlserver2000(引自converse斑竹的帖子)

介绍连接server2000的方法之一:使用DriverManager.getConnection(...)连接到数据库有两种方法,one is :with a connection url through the jdbc driver manager,another is with a jndi datasource.

我们先说第一种:使用DriverManager.getConnection()方法

第一:你需要设置classpath,它是你的jvm加载类时所要寻找的路径。

    当然首先你要有jdbs driver for sqlserver。

    设置环境变量:window os:set classpath=.;${your path to save the driver}/msbase.jar;${}/mssqlserver.jar;${}/msutil.jar

第二:注册你的驱动registering the driver

    注册驱动告诉你得jdbc管理器去加载什么驱动程序类,当使用class.forName(),你必须指定驱动类名称,

com.microsoft.jdbc.sqlserver.SQLServerDriver.例如:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

第三:在注册完一个驱动类后,你必须把你的数据库的物理信息以一个url的形式传给管理器,下面是一个url模版:jdbc:microsoft:sqlserver://server_name:port,其中server2000默认的端口号为:1433.下面是一个例子:

Connection con=DriverManager.getConnection("jdbc:microsoft:sqlserver://server_name:1433","userName","password");

注:这里的server_name必须是一个ip address,或者一个主机名,你可以使用ping命令来测试你的主机名是否传回一个正确的ip address

下面是连接url的属性解释:

------------------------------------------------------------------------------

---属性----------------------------------------说明--------------

--DatabaseName(0)                    ------the name of the sql server database to which you want to connect

--HostProcess   (O)                  ------the process ID of the application connecting to SQL Server

2000.The supplied value

                                     ------appears in the "hostprocess" column of the sysprocesses table.

--NetAddress(O)                      ------the MAC address of the network interface card of the

application   connnecting to sql   .server 2000.the supplied

value appears in the "net_address" column   of

the sysprocesses table.

--Password                           ------the case-insensitive password used to connect to your sql

server database.

--PortNumber(O)                      ------the tcp 端口号(一般在使用datasource时使用)默认为:1433

--ProgramName(0)                     ------the name of the application connecting to sql server 2000,

the supplied value appears in   the "program_name" column of

the sysprocesses table.

--SelectMethod                       ------SelectMethod={cursor|direct}.determines wherther database

cursors are used for select   statements .performance and behavior

of the driver are affected by

the selectMethod.                                         

-------setting.Direct:            --------the direct method sends the complete results set in one request

to the driver .it is useful for queries that only produce a small amount of

data that you fetch completely,you should avoid using direct when

executing queries that produce a large

amount of    data,as the result set is cached completely on the client

and constrains memory .In this mode,each statement requires its

connection to the database.this is accomplished by

cloing connections .

-------cloned              connections use the same connection properties as the

original connection;however,because transactions occur on a

single connection,auto commit mode is required,Due to this,JTA is

not supported in direct mode.In addition,some operations,such as

updating an insensitive result set,are not supported in direct mode

because driver create a second statement internally.Exceptions

generated due to the creation of cloned statements usually return

an error message similar to "Cannot start a cloned connection while

in manual transaction mode"

----Cursor:           ------when the selectMode is set to cursor ,a server-side cursor is generated

行被以一起的方式提取出来,JDBC语句setFetchSize这时候就起作用了,它可以控制每次提取的行数,cursor值在查询结果产生大量数据的时候非常有用,并且也用在jta中,但是setFetchSize具体设置多大,这是没有什么规则的,只能通过多多尝试找到一个合理的值。

 

--解决:启动你的sqlserver2000的服务器网络实用工具后,确保你的Tcp/Ip协议已启动,默认的应该都启动了,这是进行通讯的条件一

然后,在选中Tcp/Ip协议后点击属性,就看到了一个默认端口号,这就是你在 getConnection里用到的端口号,你必须把你程序里用

到的端口号,写成这里的值,这样才能解决上面的问题,当然你也可以在这里把端口号给该了,而保持程序不变!

 

问题3:有些时候也连接上了,但就是不能访问,或者提示说sql语句有错误

--解决:这些都是管理sqlServer2000所需要注意的,或许你没有给这个用户分配足够的权限,或者你的sql语句中用到了sqlserver里保留的关键字,我就遇到了这样一个问题:我写了个 select * from USER这个语句怎么执行都不对,后来看了分析器,才知道这是一个关键字,你不可以用它来命名的!

错误:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.

A: 这个错误产生的原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用 direct (SelectMethod=direct) 模式. Direct 模式是默认的模式.

解决办法

    当你使用手动事务模式时,必须把SelectMethod 属性的值设置为 Cursor, 或者是确保在你的连接上只有一个STATEMENT操作。

 

问题4:java.sql.SQLException

A:这个错误产生的原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用 direct (SelectMethod=direct) 模式. Direct 模式是默认的模式.

解决办法

    当你使用手动事务模式时,必须把SelectMethod 属性的值设置为 Cursor, 或者是确保在你的连接上只有一个STATEMENT操作。

 

问题5:xp下出现[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket

A:在WinXP sp2下,sqlserver 不能用jdbc,下载 sql server sp3,下载jdbc sp3的驱动,装上以后就正常了:下载Microsoft SQL Server 2000 Service Pack 3a并安装,SQL请选用混和安装模式;下载SQL Server 2000 Driver for JDBC Service Pack 3 并安装。

另外一种解决办法:本机的SQL Server 2000 当客户端,直接连接到主机(Windows XP)上的SQL Server 2000数据库,也就是在本机上新注册一个SQL Server,指向服务器上的SQL Server。这样再运行一下原来的Java 程序就不会出现Error establishing socket这个错误了

 

问题6:Microsoft JDBC "ResultSet Can Not Re-Read Row Data" Error

A:使用MS SQL Server 2000 SP3a/SP4做数据库服务器时,用Microsoft提供的JDBC驱动(2.2.0040),在查询时遇到一个SQLException:

java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column #。

查询语句和JDBC代码都没有问题,怀疑是Microsoft驱动的BUG,google一下果然在Microsoft support站点发现了问题:http://support.microsoft.com/kb/824106,原因是如果该表存在TEXT, NTEXT, IMAGE等大型字段,对于ResultSet的字段读取必须按照从左向右读,如果你用:

int a = rs.getInt(2);

int b = rs.getInt(1);

则报错。Microsoft给出的方案是不能从右往左也不能连续读2次。没办法自己改代码,严格从左向右读,结果就没有问题了。

 

问题7:当oracle procedure中使用了事务时,jta的事务不起作用

A:用jdbc调用存储过程,存储过程中最好不要有事务,除非所有的数据库操作都在存储过程中完成;如果存储过程中有事务,该事务能提交或回滚本次同数据库会话中进行的所有操作。包括在程序中进行的还没有提交的操作;无论在jta还是在存储过程中的事务,其控制的对象都是同数据库的会话,所以其本质是一样的。

 

问题8:连接池不断增加直至weblogic down机

A:应该是程序建立连接的方式和关闭方式不当造成的,可以在连接池设置一下Inactive Connection Timeout。

 

问题9:SQL的服务自动停止的问题

A:错误原因:

线程试图对一个虚地址进行读或写,但没有做适当的存取。

解决方法

注意:从 SP3 安装 CD 或安装目录运行以下命令。在下面的步骤中,安装目录是 C:\sql2ksp3。

1. 在命令提示符处,运行以下命令,将 CAB 格式的自解压文件 SQLRedis.exe 中的文件解压缩到 C:\Extract 文件夹中:

C:\sql2ksp3\x86\other\sqlredis.exe /T:C:\Extract /C

注意:SQLRedis.exe 文件位于安装目录中的 \x86\Other 文件夹中。

2. 在 C:\Extract 文件夹中找到 Mdac_qfe.exe 文件,然后运行 Mdac_qfe.exe 文件。

3. “Microsoft Data Access Components Hotfix Installer”对话框打开,显示出您正在安装修复程序。单击“确定”,继续安装修复程序。 

4. 成功安装 MDAC 修复程序 (Mdac_qfe.exe) 后,再次运行 SQL Server 2000 SP3 安装程序,成功完成安装。

 

问题10:DB2的type4驱动程序一直出现如下的错误:com.ibm.db2.jcc.a.DisconnectException: encoding not supported

A:在建立Database时,必需选UTF-8的编码,如果选用Big5时会出现encoding not supported的错误。DB2的JDBC 只支持UTF-8的编码方式。解决方法也就是用不同的字符集创建数据库:

db2 drop db userdb

export LANG=en_US.iso88591

db2 create db userdb

 

问题11:jb2005与mysql连接报错com.borland.dx.dataset.DataSetException:

The URL: jdbc:jdbc:mysql://localhost/mydata could not be found.  

Check for misspellings, and that the right driver is present on the classpath

A:配置Tools-->Enterprise   Setup-->Database   Drivers-->Add,加入User Home/mysql

后,要重新启动一下你的JBuilder才可以的。

 

问题12:oracle存取blob字段出现ORA-01002:fetch out of sequence错误

A:1.禁用自动提交试试。如果你仍然有其他的行在查询的时候也禁用手工提交,当有for update游标仍然打开时执行的任何提交可能会造成这个错误。

setAutoCommit(false)

2.升级补丁

Versions Affected

This problem affects Oracle versions:

8.1.7.3 and 8.1.7.4

9.0.1.3

9.2.0.1 (Base Release)

The problem does NOT affect:

Versions prior to and including 8.1.7.2

9.0.1.0 to 9.0.1.2 inclusive

9.0.1.4

9.2.0.2 onwards (not available at time of writing)

 

问题13:喆、娗、奭、珺、旻、奭、旻等怪异字符插不进informix数据库

A:GBK不是标准字符集,除了GB2312,你可以试试GB18030,如果支持GB18030那什么中文字符都能插入。

 

问题14:Jbuilder连接interbase数据库提示[interclient][interbase]connection rejected by remote interface

A:是不是客户端和服务端版本不一致;防火墙导致;登录用户的权限是否足够。

 

问题15:SQL Server 的身份验证模式改不过来怎么办

A:企业管理器-〉新建SQL注册,看看帮助文档

 

问题16: weblogic server定义连接连接池,测试连接时总是提示找不到类路径

A:将类文件放在server\lib下,然后在server\bin\setWLSEnv.cmd中将他们添加进去

 

问题17:JDBC Connection Pool 测试出现异常:Warning! Connectivity to backend database not verified. This is either because required connection pool attributes "TestConnectionsOnReserve" or "TestConnectionsOnRelease" have not been enabled, or an invalid value has been specified for attribute "TestTableName". Please check the server log for more details

A:weblogic的控制台中,配置pool完毕后要选择Test Reserved Connections 、 Test Released Connections选项;另外要指定测试要连接的表的名称。

 

问题18:为了复用Connection,我在excute()方法的开始部分取得连接,在结束时释放Connection。在excute()方法中将Connection传递给DAO进行数据库操作。请问这样做有什么缺陷,应该怎样做?从DataSource中取Connection是个很耗时的操作吗?

A:最好不要这样做,从服务器的connection pool 中获取连接时间很短,大概是1%秒的样子,所以用了就释放最好了,不会引起connection leak


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。