Tomcat Sql Server2005 连接池折腾小记

最近把一个老项目下载下来,想把系统搭建下来看看原来写的东西,数据库使用的是mssql(对其熟悉不如oracle,正因为如此,才想折腾!),然后把对应的数据库也导出出来了(sqlserver2000),导入本机的sqlserver2005数据库:现在开源连接池那么多,tomcat已经不怎么使用了,但是我就是想折腾一下。

一、小报一个错:报备份集中的数据库备份与现有的数据库不同的错误.解决方法:还原时设置:选项 -->还原选项 -->覆盖现有数据库 --> 确定,通过了。

二、一开始有点sb式的把sqlserver2000的jdbc驱动包(msbase.jar、msutil.jar、mssqlserver.jar)拷进tomcat/lib下,当然不行:

报错:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory ([Microsoft][SQLServer 2000 Driver for JDBC]Error 
establishing socket.)
    三、删掉mssqlserver.jar,换成个貌似是2005版本的包也叫mssqlserver.jar(从另一个正使用的2005版数据库的系统中找到的),然后修改下tomcat下comtext.xml的Resource配置,报错:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.microsoft.jdbc.sqlserver.SQLServerDDriver

找不到驱动了?后来才明白应该是driverClassname="com.microsoft.sqlserver.jdbc.SQLServerDriver"中的顺序不对,应该根据jar的目录结构来定。

注意:在SQLSERVER2005中连接项与SQLSERVER2000不同:sqlserver与jdbc先后不一样。

四、一会报这错,一会报那错,我对comtext.xml的Resource配置没信心,对jar引入是否正确没信心,都迟怀疑态度,遇到报错就急着改,急着要搞定,所以两手抓:改Resource配置+换jar包,没有严密的解决方法的逻辑性。这次换成了个sqljdbc4.jar包,重启:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The TCP/IP connection to the host localhost, port 1433 
has failed. Error: Connection refused: connect. Please verify the connection properties and check that a SQL Server instance is running on the 
host and accepting TCP/IP connections at the port, and that no firewall is blocking TCP connections to the port.)

其实回头想想:这次报错够明显的了,离终点算是最近了,可我还是没引起重视,走绕行了。

五、朝上面这个错误解决,应该能最明显最快了,可是这个时候同事搞的测试,马上成功的,我觉得他的那个简单获取connection的测试页面---这种方式挺好的,移植到我这来,不行!

我们访问的是不同的数据库(我访问的是本机,他访问的是某服务器),则改成服务器数据库,通过了,可获取链接!shit,我的数据库有问题!

测试页面:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="javax.naming.Context"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="javax.sql.DataSource"%>
<%@ page import="java.sql.Connection"%>
<%
    Context ctx = new InitialContext();
    String strLookup = "java:comp/env/test";
    DataSource ds = (DataSource) ctx.lookup(strLookup);
    Connection con = ds.getConnection();
    if (con != null) {
        out.print("拿到链接了");
    } else {
        out.print("失败了");
    }
%>

然后小google一下,发现sqlserver这些版本还需要打补丁,于是sb的去下补丁,然后安装重启机子,依然不可以!

六、竟然操蛋的发现是我的mssql是express版本,只限制为本地连接,连1433端口服务都没有打开也没有地方可以打开,:s_h_i_t。又去找解决方法;

查看SQLServerExpress2005网络配置信息(SQLServer2005NetworkConfiguration――>ProtocolsforSQLEXPRESS)。默认的情况下右边列表中的NamedPipes和TCP/IP的状态为Disable,即没有启用。右键点击这两项,在弹出菜单中选中Enable启用这两个协议;在TCP/IP协议上双击鼠标,弹出对话框。修改对话框Protocol属性页中的“ListenAll”项设为“no”。IPAddress属性页中,修改你要数据库服务监听的IP地址的属性,修改Enabled属性为Yes,修改TCPDynamicPorts属性为空,TCPPort项在默认安装下为空,现在修改为我们监听端口1433。

查看连接:netstat-an或netstat-ptcp,发现1433终于有了。

七、重启sqlserver服务一下。测试tomcat连接池,貌似能从tomcat的连接池获取连接成功了。但是还是不能连接上数据库、不能并登入系统。caodan!

报错:传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确,参数1(""):数据类型0x38未知。这个时候把mssqlserver.jar换成sqljdbc.jar,修改下参数顺序为:driverClassname="com.microsoft.sqlserver.jdbc.SQLServerDriver"

重启,依然不行,TMD,换成sqljdbc4.jar,重启,登陆系统成功。TMD,真够折腾的。

PS:看着好乱吧,凌乱不堪啊,发现自己解决问题过于急于求成,过于急躁,一口气想搞定,但是有些基础知识又不扎实,造成手忙脚乱的喜欢瞎折腾。经过这个经历,发现平时真应该认真整理整理自己的思路,和解决问题的逻辑方法,先后顺序,一步一步来,不能一口吃下一个胖子的,不能为了解决问题而解决,解决完事了也就完事了,这样一来,下次遇到问题,依然会是手忙脚乱急于求成,欲速则不达!

形成各初步解决问题的思路吧:获取基础知识--->修改测试--->有问题--->修改、将出现问题的范围变小进行排除--->不断缩小直到真相现形!

20110608ADD:

tomcat连接sqlserver2005时:

不能拿到connection,报错信息:cannotcreatejdbcdriverofclass“某某某”forconnecturl“某某某”:

改正:将context.xml文件中Resource配置的:

url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=某数据库;SelectMethod=Cursor"

改成:

url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=某数据库;SelectMethod=Cursor"

(数据库版本:MicrosoftSQLServer2005-9.00.4035.00(IntelX86)Nov24200813:01:59Copyright(c)1988-2005MicrosoftCorporationExpressEditionwithAdvancedServicesonWindowsNT5.1(Build2600:ServicePack3),未打sp4补丁)

若是报错:cannotcreatejdbcdriverofclass“某某某”forconnecturl“null”,那就可能需要打sp4补丁了。

相关推荐