在线等!!使用ODBC:连接占线导致另一个hstmt 使用JDBC:Error establishing socket
SQLServer2000,SP2,j2sdk1.4.2,Tomcat4.0;
这个部分去年用的时候还好好的,可最近再次运行的时候就出现了错误了...机子中间重装过系统,现在也配置好了啊,Java,Tomcat运行都没问题。代码保证没变...纳闷了
一个学生登陆在线考试的部分,说是数据库连接对象使用完没关吧,可这个是刚登陆就出问题,对数据库只执行了查询 ,代码:
Bean:
//实现一个javabean基类,封装了建立数据库联接,执行数据库表格查询,更新数据库表格内容,关闭数据库连接等功能,
//供它的子类直接使用。还提供一个toChinese()方法,主要用来中文数据的处理。
package mybean;
import java.*;
import java.sql.*;
public class ksxtdb{
static Connection con = null;
Statement stmt=null; //用于将SQL语句发送到数据库
ResultSet rs=null;
//database的构造函数
public ksxtdb(){
}
public static void getConnection(){
try{
//注册数据库驱动程序为微软提供的jdbc驱动
String url = "jdbc:microsoft:sqlserver:// ";
String serverName= "10.1.17.23 ";
String portNumber = "1433 ";
String databaseName= "TK1 ";
String userName = "sa ";
String password = "tk ";
String selectMethod = "cursor ";
String getConnectionUrl=url+serverName+ ": "+portNumber+ ";databaseName= "+databaseName+ ";selectMethod= "+selectMethod+ "; ";
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver ");
con = DriverManager.getConnection(getConnectionUrl,userName,password); //建立连接
}
catch(java.lang.ClassNotFoundException e){
//方便调试程序,出错打印mydatabase()就知道在什么地方错了
System.err.println( "mydatabase(): "+e.getMessage());
}
catch(java.sql.SQLException e){
System.err.println( "mydatabase "+e.getMessage());
}
}
//关闭数据库连接
public void closeConnection(){
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(java.sql.SQLException e){
System.err.println( "mydatabase(): "+e.getMessage());
}
rs=null;
stmt=null;
con=null;
}
//executeQuery方法用于进行记录的查询操作
//入口参数为sql语句,返回ResultSet对象
public ResultSet executeQuery(String sql){
rs=null;
try{
if(con==null)
getConnection();
if(con!=null){
stmt=con.createStatement();
//执行数据库操作
rs=stmt.executeQuery(sql);
}
}
catch(SQLException ex){
System.err.println( "mydatabase.executeQuery: "+ex.getMessage()+ " 4这错! ");
}
return rs;
}
//executeUpdate方法用于进行add或者update记录的操作
//入口参数为sql语句,成功返回true,否则为false
public boolean executeUpdate(String sql){
boolean bupdate=false;
try{
//建立数据库连接
if(con==null)
getConnection();
if(con!=null){
stmt=con.createStatement();
int rowCount=stmt.executeUpdate(sql);
//如果不成功,bupdate就会返回false
if(rowCount!=0)
bupdate=true;
}
}
catch(SQLException ex){
//打印出错信息
System.err.println( "mydatabase.executeupdate: "+ex.getMessage());
}
return bupdate;
}
//toChinese方法用于将一个字符串进行中文处理
//否则将会是???这样的字符串
public static String toChinese(String strvalue){
try{
if(strvalue==null) return null;
else{
strvalue=new String(strvalue.getBytes( "ISO8859_1 "), "GBK ");
return strvalue;
}
}
catch(Exception e){
return null;
}
}
}
JSP代码:
<%@ page contentType= "text/html; charset=GB2312 " %>
<%@ page language= "java " import= "java.sql.* " %>
<jsp:useBean id= "conn " scope= "page " class= "mybean.ksxtdb "/>
<%!
ResultSet rs1=null;
ResultSet rs2=null;
String ID= " ";
String sql1= " ";
String sql2= " ";
%>
<%
ID=request.getParameter( "studentid ");
if(ID==null || ID.equals( " ")){ //防止非法输入登录
out.println( " <center> ");
out.println( " <h1> 学号输入非法!请重新输入! </h1> <br> <br> ");
out.println( " <a href=javascript:history.back()> 返回 </a> ");
out.println( " </center> ");
return;
}
sql1= "select * from Student_info where studentid= ' "+ID+ " ' ";
sql2= "select * from System_parameter where studentid= ' "+ID+ " ' ";
try{
rs1=conn.executeQuery(sql1);
rs2=conn.executeQuery(sql2);
//如果是非法学号,回到登录界面
if(!rs1.next()){
%>
<jsp:forward page= "index.jsp ">
<jsp:param name= "errmsg " value= "Invalid Student ID! "/>
</jsp:forward>
<%
}
if(!rs2.next()){
session.setAttribute( "studentlogin ",ID);//将学生登录学号保存到session中
session.setMaxInactiveInterval(60*60*24);
response.sendRedirect( "../exam/login.jsp ");
}else{
if(rs2.getInt( "state ")==1){
//添加强行关闭窗口代码
out.println( " <center> ");
out.println( " <br> <br> <hr> <h1> 您已正常提交试卷,请退出该系统! </h1> <br> <br> ");
%>
<script language= "javascript ">
document.title= "关闭窗口 ";
</script>
<%
out.println( " <a href=javascript:window.close() size=4> 关闭窗口 </a> ");
out.println( " </center> ");
}
else{
session.setAttribute( "studentlogin ",ID);//将学生登录学号保存到session中
session.setMaxInactiveInterval(60*60*24);
response.sendRedirect( "../exam/login.jsp ");
}
}
}catch(Exception e){
System.out.println(e.toString());
%>
<jsp:forward page= "../public/dberror.jsp ">
<jsp:param name= "e " value= " <%=e%> "/>
</jsp:forward>
<%
}
%>
学生登陆后,如果学号错误,也能正常提示Invalid Student ID!,如果正确,登陆掉转到check.jsp时就直接提示错误信息:
IE里显示:数据库操作错误信息:java.lang.NullPointerException
Tomcat里就会出现:[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt 4这错!(因为错误提示的地方标上4这错了),在Bean的查询部分里面。
自己调的时候加了个RS1.close(),还是这个错误...
怕是驱动的问题,用ODBC连接时出现:Tomcat里显示:连接占线导致另一个hstmt ,IE里显示:数据库操作错误信息:java.lang.NullPointerException
另外:防火墙已关闭,补丁已从SP3打到SP4,SQLServer2000是混合模式认证,而且TCP/IP端口设置为1433。在运行里面输入netstat -a一闪而过,不明白什么意思。
着急啊....
[解决办法]
错误信息写错了,两个都写成ODBC的错误了,按上面的JDBC连接代码执行时Tomcat里显示Error establishing socket ,IE里显示:数据库操作错误信息:Java.lang.NullPointerException