Java 错误:com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭

Java 错误:com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭,java,web-services,sql-server-2014,tomcat9,Java,Web Services,Sql Server 2014,Tomcat9,每当我重新启动Tomcat服务器时,我的webservice代码在第一次时运行良好,并生成结果,但从第二次开始它就会抛出下面的错误 com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭 只有在添加try-catch-finally语句并关闭finally块中的连接后,才会发生此错误。下面是我的代码。我不知道问题在哪里。如果你能在这方面帮助我,我将不胜感激 package com.CIBIL; 导入java.sql.Connection; 导

每当我重新启动Tomcat服务器时,我的webservice代码在第一次时运行良好,并生成结果,但从第二次开始它就会抛出下面的错误

com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭

只有在添加try-catch-finally语句并关闭finally块中的连接后,才会发生此错误。下面是我的代码。我不知道问题在哪里。如果你能在这方面帮助我,我将不胜感激

package com.CIBIL;
导入java.sql.Connection;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入com.CIBIL.dao.InitialiseCIBILDatabaseConnection;
导入com.CIBIL.xmldom.AddressType;
导入com.CIBIL.xmldom.applicationInfo;
导入com.CIBIL.xmldom.banktype;
导入com.CIBIL.xmldom.CredithistoryType;
导入com.CIBIL.xmldom.IdentityType;
导入com.CIBIL.xmldom.PersonalType;
公共类检索数据{
字符串sqlquery=null;
Connection repositoryDatabaseConnection=null;
结果集queryResult=null;
PreparedStatement sqlToFetch=null;
公共应用程序信息检索应用程序数据(字符串AadhaarNumber)引发异常{
repositoryDatabaseConnection=InitialiseCIBILDatabaseConnection.getFrameworkRepositoryDatabaseConnection();
试一试{
sqlquery=“选择一个[aadharid],p1.[pan],p2.[firstname],p2.[lastname],p2.[addressline1],p2.[addressline2],p2.[addressline3],”+
“p2.[addressline4],p2.[addressline5],p2.[addressline6],p2.[city],p2.[state],p2.[pincode],p2.[country],p2.[mobile],p2.[DOB],”+
“b.[银行名称]、b.[银行账户]、b.[国际金融服务中心代码]、chs.[ccj]、chs.[defaults]、chs.[bank\u name]、chs.[Check\u fail]、chs.[credit\u score]”+
“来自[CIBIL].[dbo].[CIBIL_customer_aadharid]a”+
“在a.aadharid=p1.aadharid上加入[CIBIL].[dbo].[CIBIL\u customer\u pan]p1”+
“在p1.pan=p2.pan上加入[CIBIL].[dbo].[CIBIL\u customer\u personal]p2”+
“在p1.pan=b.pan上加入[CIBIL].[dbo].[CIBIL_客户_银行]b”+
“在p1.pan=chs.pan上加入[CIBIL].[dbo].[CIBIL\u credit\u hostory\u and\u score]chs”+
其中p1.aadharid='“+AadhaarNumber+”;”;
sqlToFetch=repositoryDatabaseConnection.prepareStatement(sqlquery);
ResultSet queryResult=sqlToFetch.executeQuery();
applicationInfo applicationObject=新的applicationInfo();
IdentityType IdentityObject=新IdentityType();
PersonalType PersonalObject=新PersonalType();
AddressType AddressObject=新的AddressType();
BanktypeType BankObject=新的BanktypeType();
CredithistoryType CreditObject=新的CredithistoryType();
while(queryResult.next())
{
IdentityObject.setAadhaarNumber(queryResult.getString(“aadharid”));
IdentityObject.setPanNumber(queryResult.getString(“pan”);
setFirstName(queryResult.getString(“firstname”);
setLastName(queryResult.getString(“lastname”);
AddressObject.setAddressline1(queryResult.getString(“addressline1”);
AddressObject.setAddressline2(queryResult.getString(“addressline2”);
AddressObject.setAddressline3(queryResult.getString(“addressline3”);
AddressObject.setAddressline4(queryResult.getString(“addressline4”);
AddressObject.setAddressline5(queryResult.getString(“addressline5”);
AddressObject.setAddressline6(queryResult.getString(“addressline6”);
AddressObject.setCity(queryResult.getString(“城市”);
AddressObject.setState(queryResult.getString(“state”);
AddressObject.setPincode(queryResult.getString(“pincode”);
AddressObject.setCountry(queryResult.getString(“国家”);
setMobile(queryResult.getString(“mobile”);
setDob(queryResult.getString(“DOB”);
BankObject.setBankName(queryResult.getString(“银行名称”);
BankObject.setBankAccountNumber(queryResult.getString(“银行账户”);
BankObject.setBankIFSCCode(queryResult.getString(“ifsc_代码”);
CreditObject.setCcj(queryResult.getString(“ccj”);
CreditObject.setBankdefault(queryResult.getString(“默认值”);
CreditObject.setbankruppty(queryResult.getString(“破产”);
CreditObject.setChequeBounce(queryResult.getString(“check_fail”);
setFinalCreditScore(queryResult.getString(“信用评分”));
applicationobject.setapplicationidentityinfo(IdentityObject);
applicationObject.setapplicationPersonalInfo(PersonalObject);
applicationObject.setapplicationAddressInfo(AddressObject);
applicationobject.setapplicationbankinfo(BankObject);
applicationObject.setapplicationCreditHistoryInfo(CreditObject);
}
返回应用对象;
}捕获(例外e){
e、 printStackTrace();
}	
最后{
if(queryResult!=null){
试一试{
queryResult.close();
}catch(SQLException e){/*忽略*/}
}
if(sqlToFetch!=null){
试一试{
sqlToFetch.close();
}catch(SQLException e){/*忽略*/}
}
if(repositoryDatabaseConnection!=null){
试一试{
repositoryDatabaseConnection.close();
}catch(SQLException e){/*忽略*/}
}
}
返回null;
}
}
您应该使用和绑定变量


学习如何使用JNDI数据源的最佳方法是。

您真的应该参数化该查询-您可能会受到注入攻击。关于SQL注入的评论很好。我还要说,您的代码不应该创建连接。更好的办法是创建一个JNDI数据源池,您的方法可以在方法范围内检出、使用和返回这些数据源。它的伸缩性会更好。@DaveCullum谢谢您的评论。我现在已经将查询更改为参数,但问题仍然存在。我现在已经更新了我的新代码查询参数fix对连接问题没有帮助。它们是完全分开的。这样对待他们。你的下一步应该是c