求解此异常:信息: Loading Spring root WebApplicationContext
DBCP borrowObject failed: com.microsoft.sqlserver.jdbc.SQLServerException: TDS 预登录响应不完整。目标服务器必须是 SQL Server 2000 或更高版本。
2011-11-24 11:56:27 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.appfuse.webapp.listener.StartupListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/hibernate_context.xml]: Initialization of bean failed; nested exception is org.apache.commons.dbcp.DbcpException: com.microsoft.sqlserver.jdbc.SQLServerException: TDS 预登录响应不完整。目标服务器必须是 SQL Server 2000 或更高版本。
org.apache.commons.dbcp.DbcpException: com.microsoft.sqlserver.jdbc.SQLServerException: TDS 预登录响应不完整。目标服务器必须是 SQL Server 2000 或更高版本。
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:85)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:184)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1158)
at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:117)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:110)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:312)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:80)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:72)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1881)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1174)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:800)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:726)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1059)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:363)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:269)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:320)
at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:134)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:246)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
at org.appfuse.webapp.listener.StartupListener.contextInitialized(StartupListener.java:36)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3830)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4337)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

解决方案 »

  1.   

    以下是hibernate_content.xml中连接数据库的<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close"> <property name="driverClassName">
    <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
    </property> <property name="url">
    <value>jdbc:sqlserver://192.168.2.4:1433;DatabaseName=dpc_feedback360;</value>
    </property> <property name="username">
    <value>dpc_feedback360</value>
    </property> <property name="password">
    <value>ibmserver</value>
    </property>
    </bean>
      

  2.   

    以下是proxool.xml。。
    管理连接池的<proxool>
          <!-- 连接池的别名 -->
    <alias>feedback</alias>
    <!--proxool 只能管理由自己产生的连接 -->
    <driver-url>jdbc:sqlserver://192.168.2.4:1433;DatabaseName=dpc_feedback360;
    </driver-url>
    <!--JDBC 驱动程序 -->
    <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
    <driver-properties>
    <property name="user" value="dpc_feedback360" />
    <property name="password" value="ibmserver"/>
    </driver-properties>
    <!-- proxool 自动侦察各个连接状态的时间间隔 ( 毫秒 ), 侦察到空闲的连接就马上回收 , 超时的销毁 -->
    <house-keeping-sleep-time>90000</house-keeping-sleep-time> <!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数 , 超过这个请求数的用户连接就不会被接受 -->
    <maximum-new-connections>20</maximum-new-connections> <!-- 最少保持的空闲连接数 -->
    <prototype-count>5</prototype-count>
    <!--
    允许最大连接数 , 超过了这个连接,再有请求时,就排在队列中等候,最大的 等待请求数由 maximum-new-connections
    决定
    -->
    <maximum-connection-count>100</maximum-connection-count>
    <!-- 最小连接数 -->
    <minimum-connection-count>10</minimum-connection-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
    <statistics>15m,1h,1d</statistics>
    </proxool>
      

  3.   

    代码少了,看不出哪里的错,如果你是用sping跟hibernate搭建的话,看看配置文件的连接数据库的配置对了没有
    比如sa,123等,还有你的是sql2000的,你导入的驱动包正确不?
    我知道的是sqlserver2008的不能用sqlserver2005的包,你的是2000的,最好用2000,不要相信什么向后兼容等,直接到CSDN上面下载sql2000的架包,也就1分资源而已!如果是先搭spring在搭hibernate的话,配置文件应该是这样的
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName"
    value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
    </property>
    <property name="url"
    value="jdbc:sqlserver://127.0.0.1:1433;databaseName=test">
    </property>
    <property name="username" value="sa"></property>
    <property name="password" value="123"></property>
    </bean>
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.SQLServerDialect
    </prop>
    </props>
    </property>
    </bean></beans>
      

  4.   

    我用的是sql2005的 服务器上的sql 也是2005的。。驱动包 也是下的最新2005版本的。。很是奇怪 怎么会抛这个错误
      

  5.   

    你的目标服务器的地址那里出了问题,你是在局域网内做测试是吧!如果你现在连接的电脑不是你的本机,你是在一个局域网内连接,那是要打开一个sqlserver的配置的,不然是连接不上的!
      

  6.   


    <driver-url>jdbc:sqlserver://192.168.2.4:1433;DatabaseName=dpc_feedback360;去掉最后的分号
      

  7.   

    jdbc:sqlserver://192.168.2.4:1433;DatabaseName=dpc_feedback360  这样就行了
      

  8.   

    以前 就是这样连接的。那时候服务器上的sql版本是2000
    这次服务器上的sql版本是2005.
    不知为啥就出这样的问题了。。
      

  9.   

    你可以简单的用你学java时最基本的写法去连接,
    Class.forName();
    这些方式去连接,你也连接不上,我发现可能就是这个问题,我猜你是在做测试吧?而且192.168这个ip不是你的地址把?
    如果是跟我说的差不多,你是在用别人的电脑当目标服务器,那你的连接是绝对出问题的,你要打开你的一个配置,可以远程连接!因为sqlserver默认的是只能本地连接,所以你要找到程序---》sqlserver的外围应用配置---》
    服务连接和应用配置器---》远程连接----》本地连接和远程连接,
    只有这样你的192.168这些ip才能访问,
    记住是你要访问的那台电脑要做这些设置,你的电脑不需要!你访问哪台,就把那台电脑的远程连接勾上!
    然后在试试用你学java的时候最基本的连接方式试试能不能连接!
      

  10.   

    你用你学java时最基本的方式去连接,你肯定是连接不上的!
    你以前用的是2000的,可能是默认打开了或者别人跟你配置了!把那个勾给勾上了!
      

  11.   

    那些我都知道。
    192.168.2.4是公司的一台服务器,版本是2005的,而端口号、tcp/ip远程链接等都设置好了。
    就是说服务器那没问题。
    在我机器上命令行 输入 telnet 192.168.2.4 1433 是可以连接上的。。
      

  12.   

    NO NO。。
    以前的2000和现在的这个不是 一台机器上的。
    两台服务器。 不同的版本 只要改下ip就OK。。
    我现在怀疑 是不是我的sp4补丁没打上 或者、、
    有点乱
      

  13.   

    服务器那设置没问题。
    这样看来还是我本机这的问题。
    到底是jar包的问题 还是sp4补丁没打上的缘故。。
    还是其他的。。
    哎。
    怎么判断sp4补丁到底打没打呢。。
      

  14.   

    sqlserver2005不需要打那个补丁吧。。2000的才需要打SP4,2005的需要换一个jar包。使用sqljdbc.jar
      

  15.   

    你的jar包你确定对了?
    你要知道,jar包的名字是可以改的,我就见过一个人,他用sql2000的jar包能连接2008的sql,我但是就奇怪了,哪知道是jar包的名字改了,里面的class文件都一样!
      

  16.   

    你用简单的方式连接能不能连上了?你的databaseName的d大写了!
      

  17.   

    最大的问题我想还是驱动包的问题,我发现好多人的sqlserver的jar包的名字都不一样,这个是个人命的,所以还是看看sql2005的jar包的class文件对不对了!
    还有记得,不要在一个项目里面放入两个sql的jar包,他会默认找包的,不然连接就错误了
    我发生过这种情况,我在一个项目里,放入了2005跟2008的,但是我的是08的数据库,最后没报错,没有数据,就是默认2005的,但是如果你的是2000的跟2005的jar包,我就不知道什么情况了
      

  18.   

    嗯 sqljdbc.jar 有了。。
      

  19.   

    databaseName 的d 就应该大写的
      

  20.   

    查了很多这方面的资料。。多数是你端口的问题确定1433端口是开着的?telnet能通?
    还有1433端口确定是sql2005的端口?不会还有2000的sql吧?
      

  21.   

    端口没有冲突的。
    telnet 能通、
    1433 确定是2005 的端口。很是纳闷。。
    简单写了一个sql的测试程序 也是抛这个异常
    public class Cs {

    public static void main(String[] args) {
        try {
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
          System.out.println("数据库驱动程序注册成功");
          Connection conn = DriverManager.getConnection("jdbc:sqlserver://192.168.2.4:1433;DatabaseName=dpc_feedback360;User=dpc_feedback360;Password=ibmserver");
          System.out.println("成功连接数据库");
        }
        catch (Exception e) {
          System.out.println("数据库连接失败");
          e.printStackTrace();
        }
    }
    }异常信息:
    数据库驱动程序注册成功
    数据库连接失败
    com.microsoft.sqlserver.jdbc.SQLServerException: TDS 预登录响应不完整。目标服务器必须是 SQL Server 2000 或更高版本。
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.DBComms.Prelogin(Unknown Source)
    at com.microsoft.sqlserver.jdbc.DBComms.<init>(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at org.appfuse.util.Cs.main(Cs.java:9)
      

  22.   

    难道是数据库登录模式的问题。。?http://wenku.baidu.com/view/caa45d4c2b160b4e767fcff8.html
    看看这个对你有没有帮助。。
      

  23.   

    哎 不是。。
    服务器上的sql2005同时支持着两种模式。
    所以 和登录模式没关系的。
      

  24.   

    你在下载个驱动包试试了,你的jar包名字可能是sqlserver2005的,但是里面的class文件可能是2000的!
      

  25.   

    哎 谢了。
    我也在一步步的查找、、
    我本机就装了一个客户端的、
    服务器上的sql2005是很完全的、