即使在代码下方关闭连接,连接也会关闭

时间:2014-07-20 14:28:13

标签: java mysql database-connection

我在下面有一个基本的代码片段,但它不起作用。它可能有什么问题。

public List<String> getStores() throws SQLException{
        List<String> store_id=new ArrayList<>();
        String query="select distinct(store_id) from stores";
        Connection con=ConnectDatabase.getDb2ConObj();
        Statement stmt=con.createStatement();
        java.sql.ResultSet rsResultSet=stmt.executeQuery(query);
        while(rsResultSet.next()){
            store_id.add(rsResultSet.getString(1));
        }
        con.close();
        return store_id;
    }

抛出以下异常

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
    at com.mysql.jdbc.Connection.checkClosed(Connection.java:1931)
    at com.mysql.jdbc.Connection.createStatement(Connection.java:3087)
    at com.mysql.jdbc.Connection.createStatement(Connection.java:3069)
    at com.dao.StoreDao.getStores(StoreDao.java:52)
    at org.apache.jsp.adminViewAllStore_jsp._jspService(adminViewAllStore_jsp.java:119)

ConnectDatabse的代码是

public class ConnectDatabase {
     static Connection con=null;
     static String connectionString="jdbc:mysql://localhost:3306/ayurveda";
     static String username="root";
     static String password="";
     public static Connection getDb2ConObj(){
         if(con==null){
         try{
             Class.forName("com.mysql.jdbc.Driver");
             con=DriverManager.getConnection(connectionString,username,password);
         }
         catch(ClassNotFoundException | SQLException e)
         {
             System.out.println("Connect initialized with error"+e.getMessage());
             e.printStackTrace();
         }
         }
         return con;
     }

我无法理解同样的原因。可能是什么问题。因为我在完成之后关闭连接。

3 个答案:

答案 0 :(得分:0)

在我将其括在try catch finally块中后,它工作了。更改了下面给出的代码

public List<String> getStores() throws SQLException{
        List<String> store_id=new ArrayList<>();
        Connection con=ConnectDatabase.getDb2ConObj();
        try{
        String query="select distinct(store_id) from stores";
        Statement stmt=con.createStatement();
        java.sql.ResultSet rsResultSet=stmt.executeQuery(query);
        while(rsResultSet.next()){
            store_id.add(rsResultSet.getString(1));
        }
        }catch(Exception e){

        }finally{
            con.close();
        }
        return store_id;
    }

感谢。

答案 1 :(得分:0)

使用Java 7 -The try-with-resources Statement

根据oracle documentation,您可以将try-with-resources块与常规try块结合使用

  

典型的Java应用程序操纵几种类型的资源,例如文件,流,套接字和数据库连接。这些资源必须小心处理,因为它们为其操作获取系统资源。因此,您需要确保即使出现错误也可以释放

     

实际上,不正确的资源管理是生产应用程序中常见的失败原因,通常陷阱是数据库连接,并且在代码中的其他位置发生异常后,文件描述符仍保持打开状态。这导致应用程序服务器在资源耗尽时经常重新启动,因为操作系统和服务器应用程序通常具有资源的上限。

示例代码:

try(Connection con = getConnection()) {
   ...
}

了解更多Java 7 Automatic Resource Management JDBC


  • 关闭StatementResultSet

  • 每次需要连接时都不要加载驱动程序类。只需在静态初始化块中加载一次。

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
  • 我建议您使用JNDIDataSource将用户名和密码保留在Java代码之外,以使其更易于管理。将数据库配置保存在单独的xml / properties文件中,而不是Java文件中的硬编码

    请参阅Connecting with DataSource Objects

    上的 Java Tutorial

    我已经发布了一个很好的ConnectionUtil类来管理整个应用程序的单个类中的所有连接。

答案 2 :(得分:0)

您可以使用此类代码...来解决您的问题

     public void actionPerformed(ActionEvent ae)
     {
     String u=t1.getText();
     String p=t2.getText();
    if(ae.getSource()==b1)
     {
      try{
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     Connection con=DriverManager.getConnection("jdbc:odbc:newdsn");

      String stp="SELECT * FROM reg";
      Statement sa=con.createStatement();
      rs=sa.executeQuery(stp);
     while(rs.next())
      {
       String du=rs.getString(2);
       String dp=rs.getString(3);
       if(du.equals(u)&&dp.equals(p))
      {
       a=0;
     break;
     }else{ a=1;}
       }
     if(a==0){
     JOptionPane.showMessageDialog(this,"LOGIN PAGE","Login is successful",1);
       }
      if(a==1){

      JOptionPane.showMessageDialog(this,"LOGIN PAGE","Login is not successful",1);

      }}    
      catch(Exception e){}
      }}

如果即使它正在抛出异常,那么你检查系统32位或64位..你应该尝试64位然后请使你的dsn在32位和使用ms访问2002-2003版本
然后你得到旅游解决方案.....谢谢你