用spring配置的连接,
<bean id="DataSource"
class="com.xxx.web.common.MyBasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://172.16.9.5:1433;database=intercontract;Reconnection=true">
</property>
<property name="username" value="intercon"></property>
<property name="password" value="98b27691680137ca86818e3e34744a94"></property>
</bean>
在应用中使用JdbcTemplate进行数据库操作,但是sql server 连接数很快就会达到200,用户也只有几个人,请问这是为什么?

解决方案 »

  1.   

    分别关闭RS、stmt和connection即可释放连接用三个对象close()方法
      

  2.   

    源码如下:
    public class DetailImportAction extends DispatchAction{
    private ArrayList<String> init (){ ArrayList<String> list1 = new ArrayList<String>(); JdbcTemplate jdbctemp = JDBCUtil.getJdbcTemplate();
    StringBuffer kind = new StringBuffer();                   //0出厂性质
    StringBuffer subcomp = new StringBuffer();                //1子公司
    StringBuffer customerkind = new StringBuffer();           //2客户类型
    StringBuffer prodkind = new StringBuffer();               //3产品类别
    StringBuffer tradelang = new StringBuffer();   //4贸易术语
    StringBuffer currency = new StringBuffer();   //5币种
    String sql;
    ArrayList list = new ArrayList();
    ArrayList templist = new ArrayList();
    try{
    sql = "select * from leave_kind";                         //基本信息录入.出厂性质
    kind.append("<select id=\"kind\"   name=\"kind\"> ");
    kind.append("<option value=\"\">出厂性质</option>");     SqlRowSet rs = jdbctemp.queryForRowSet(sql);
        while (rs.next()){
         kind.append("<option value=\"" + rs.getString(1) + "\">" + rs.getString(2) + "</option>");
        }    kind.append("</select>");
      list1.add(kind.toString());
        
      sql = "select * from sub_comp";                            //基本信息录入.子公司
      subcomp.append("<select id=\"subcomp\"   name=\"subcomp\"> ");
      subcomp.append("<option value=\"\">子公司</option>");  rs = jdbctemp.queryForRowSet(sql);
        while (rs.next()){
         subcomp.append("<option value=\"" + rs.getString(1) + "\">" + rs.getString(2) + "</option>");
        }     subcomp.append("</select>");
       list1.add(subcomp.toString());
      
       sql = "select * from customer_kind";                       //基本信息录入.客户类型
       customerkind.append("<select id=\"customerkind\"   name=\"customerkind\"> ");
       customerkind.append("<option value=\"\">客户类型</option>");   rs = jdbctemp.queryForRowSet(sql);
        while (rs.next()){
         customerkind.append("<option value=\"" + rs.getString(1) + "\">" + rs.getString(2) + "</option>");
        }   customerkind.append("</select>");
       list1.add(customerkind.toString());
      
       sql = "select * from prod_kind";                           //基本信息录入.产品类别
       prodkind.append("<select id=\"prodkind\"   name=\"prodkind\"> ");
       prodkind.append("<option value=\"\">产品类别</option>");   rs = jdbctemp.queryForRowSet(sql);
        while (rs.next()){
         prodkind.append("<option value=\"" + rs.getString(1) + "\">" + rs.getString(2) + "</option>");
        }     prodkind.append("</select>");
       list1.add(prodkind.toString());
      
       sql = "select * from trade_lang";                          //基本信息录入.贸易术语
       tradelang.append("<select id=\"tradelang\"   name=\"tradelang\"> ");
       tradelang.append("<option value=\"\">贸易术语</option>");   rs = jdbctemp.queryForRowSet(sql);
        while (rs.next()){
         tradelang.append("<option value=\"" + rs.getString(1) + "\">" + rs.getString(2) + "</option>");
        }     tradelang.append("</select>");
       list1.add(tradelang.toString());
      
         sql = "select * from currency_kind where 1=1 ";                   //基本信息录入.币种
         currency.append("<select id=\"currency\"   name=\"currency\"> ");
         currency.append("<option value=\"\">币种</option>");       rs = jdbctemp.queryForRowSet(sql);
             while (rs.next()){
              currency.append("<option value=\"" + rs.getString(1) + "\">" + rs.getString(2) + "</option>");
             }         currency.append("</select>");
           list1.add(currency.toString());
           } catch (Exception ex) {     ex.printStackTrace();
    }
    finally { }
    return list1;
    }这个要怎么关?
      

  3.   

    JdbcTemplate 是自动释放的吧
      

  4.   

    rs.close();
    stmt.close();
    con.close();
                
      

  5.   

    然后在数据库中产生了大量上批TSQL命令如:
    sp_unprepare;1 
    select * from currency_kind where 1=1
    的进程
      

  6.   

    然后在数据库中产生了大量上批TSQL命令如:
    sp_unprepare;1 
    select * from currency_kind where 1=1
    的进程
      

  7.   

    请教楼主,Reconnection=true是什么意思,是指连接失败自动重新连接吗?我没这么用过。谢谢
      

  8.   

    JdbcTemplate这是在JDBC核心包中最重要的类。它简化了JDBC的使用,因为它处理了资源的建立和释放。它帮助你避免一些常见的错误,比如忘了总要关闭连接。它运行核心的JDBC工作流,如Statement的建立和执行,而只需要应用程序代码提供SQL和提取结果。这个类执行SQL查询,更新或者调用存储过程,模拟结果集的迭代以及提取返回参数值。它还捕捉JDBC的异常并将它们转换成 org.springframework.dao包中定义的通用的,能够提供更多信息的异常体系。
      

  9.   

    原因可是连接池的问题,也可能是事务配置不当,还有可能是某些开源代码的问题。
    参考http://www.javaeye.com/topic/32378