Java套接字超时问题导致打开的文件过多

Java套接字超时问题导致打开的文件过多,java,sockets,socket.io,Java,Sockets,Socket.io,我有一个已经运行了一段时间的java套接字。今天我注意到有很多套接字连接,但几个小时后我得到了太多打开的文件。我已经设置了超时,但不知为什么它没有超时,我不知道为什么。下面是我的代码片段。在我的代码中,我注意到日志中建立了连接,并在这一行停止- System.out.println("\n\n Trying establish a new db connection "); dbconn1 = connectionPool.getConnection(); 它可能没有从池中获取连接,但没有

我有一个已经运行了一段时间的java套接字。今天我注意到有很多套接字连接,但几个小时后我得到了太多打开的文件。我已经设置了超时,但不知为什么它没有超时,我不知道为什么。下面是我的代码片段。在我的代码中,我注意到日志中建立了连接,并在这一行停止-

System.out.println("\n\n Trying establish a new db connection ");
dbconn1 = connectionPool.getConnection();  
它可能没有从池中获取连接,但没有错误或任何套接字连接超时。有什么解决办法吗

      private Socket receivedSocketConn1;
ConnectionHandler(Socket receivedSocketConn1) {
  this.receivedSocketConn1=receivedSocketConn1;
}
BufferedWriter writer1 = null; 
 Connection dbconn1 = null;     
     public void run() { // etc
     writer1 = null;
     String message="";
     BufferedReader reader1 = null; 
     try { 

         writer1 =  new BufferedWriter(new OutputStreamWriter(receivedSocketConn1.getOutputStream()));
         reader1 = new BufferedReader(new InputStreamReader(receivedSocketConn1.getInputStream()));
         receivedSocketConn1.setSoTimeout(60000);
         int nextChar=0;
         while ((nextChar=reader1.read()) != -1) {    
             message += (char) nextChar; 
             if (nextChar == '*'){

                 try{   
                    System.out.println("\n\n Trying establish a new db connection ");
                    dbconn1 = connectionPool.getConnection();
                    dbconn1.setAutoCommit(false);
                    System.out.println("\n\n Checking db connection status "+dbconn1.isClosed());
                    if ((dbconn1 == null) || dbconn1.isClosed()) {
                         System.out.println("\n\n db connection status is closed");
                         dbconn1 = connectionPool.getConnection();
                         dbconn1.setAutoCommit(false);
//other codes follow here.
                    }
                 }
                 catch (SQLException ex){ 
                   System.out.println("Error SQL Exception : "+ex.toString());
                   ex.printStackTrace(System.out);
                   try{    
                     dbconn1.rollback();  
                   } 
                    catch (Exception rollback) {    
                     System.out.println("\nRollback dbconn1 :");  
                     rollback.printStackTrace(System.out);
                   }
                }
                catch (Exception e){
                   System.out.println("\nSQL Error here :");
                   e.printStackTrace(System.out);
                  try{    
                   dbconn1.rollback();  
                  } 
                  catch (Exception rollback) {    
                    System.out.println("\nRollback dbconn1 :");  
                    rollback.printStackTrace(System.out);
                  }
                }
                finally{
                   try {

                   if ( dbconn1 != null ) {
                     dbconn1.close();
                     System.out.println("\n\n dbConn1 is being closed");
                  }

                  }
                 catch(SQLException ex){
                   System.out.println("SQLException has been caught for dbConn1 close");
                   ex.printStackTrace();
               }               
             } 

           }
       }


      }
      catch (SocketTimeoutException ex){ 
           System.out.println("SocketTimeoutException has been caught ");
           ex.printStackTrace();
      }  
      catch (IOException ex) { 
           System.out.println("IOException has been caught ");
           ex.printStackTrace();
      }  
      catch (Exception ex) { 

           System.out.println("Exception has been caught");
           ex.printStackTrace(System.out);
      }      
      finally{

        try {
            if (writer1 != null ) {
                writer1.close();
            }               
        }
        catch(IOException ex){
           System.out.println("IOException has been caught for finally");
           ex.printStackTrace(System.out);
        }
      }
}



public static void main(String[] args) {
try {
  // setup the connection pool
        BoneCPConfig config = new BoneCPConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/****"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
        config.setUsername("***"); 
        config.setPassword("***");      
        config.setMinConnectionsPerPartition(5);
        config.setMaxConnectionsPerPartition(40);
        config.setPartitionCount(1);
        connectionPool = new BoneCP(config); // setup the connection pool           
  }
  catch (SQLException e) {
        e.printStackTrace(System.out);
  }
  try 
  {
           final ServerSocket serverSocketConn = new ServerSocket(8888);                
           while (true) 
                {
                    try 
                    {
                            Socket socketConn1 = serverSocketConn.accept();
                            new Thread(new ConnectionHandler(socketConn1)).start();                     
                    }
                    catch(Exception e)
                    {
                        System.out.println("Socket Accepting has been caught);
                        e.printStackTrace(System.out);
                    }
                }
  } 
  catch (Exception e) 
  {
     System.out.println("Socket Conn has been caught );
     e.printStackTrace(System.out);

  }
} 

它与套接字超时无关

你正在泄漏数据库连接。您正在从池中获取连接,但从未返回该连接


注意:任何返回null或关闭连接的连接池都有严重的问题。您不需要该测试或以下代码。

它与套接字超时无关

你正在泄漏数据库连接。您正在从池中获取连接,但从未返回该连接



注意:任何返回null或关闭连接的连接池都有严重的问题。您不需要该测试或以下代码。

尝试关闭BufferedReader/Writer toYes我已经尝试了我的问题是为什么超时没有被触发?您正在使用什么类型的套接字在哪里使用套接字我在您的代码中找不到它以这种方式使用套接字和数据库不是一个好主意,它非常容易出错,而且很难维护。使用一些框架或Rest模板或其他东西。您好,我已经添加了创建数据库池的主要功能,并展示了我如何在那里接受连接和处理它们。尝试关闭BufferedReader/Writer toYes我已经尝试了我的问题是,为什么没有触发超时?您使用的是什么类型的套接字您在哪里工作有了套接字,我在你的代码中找不到它。以这种方式使用套接字和数据库不是一个好主意,它很容易出错,而且很难维护。使用一些框架或Rest模板或其他东西。Hi zion,我添加了创建数据库池的主要功能,并演示了如何在那里接受连接和处理连接。抱歉,我更新了代码片段,在代码中,我可以在创建每个新连接时尝试捕获,最后阻止我关闭它。我已经添加了我之前没有包含的代码,以保持代码的简短。因此,我非常确定每次结束时我都会关闭连接。那么您期望什么呢?我只能对你发布的代码发表评论。我的NB仍然是真实的。为丢失的部分感到抱歉。因为我正在以正确的方式关闭db连接。还有什么可能导致打开的文件过多?但是如果池耗尽,应该会捕获或生成一些错误消息,但我从未看到任何错误消息,我会继续连接套接字,并暂停线System.out.println(“\n\n尝试建立新的db连接”);我在我的问题中提到。对不起,我更新了代码片段,在代码中,当我创建每个新连接并最终阻止时,我可以尝试捕获并关闭它。我已经添加了我之前没有包含的代码,以保持代码的简短。因此,我非常确定每次结束时我都会关闭连接。那么您期望什么呢?我只能对你发布的代码发表评论。我的NB仍然是真实的。为丢失的部分感到抱歉。因为我正在以正确的方式关闭db连接。还有什么可能导致打开的文件过多?但是如果池耗尽,应该会捕获或生成一些错误消息,但我从未看到任何错误消息,我会继续连接套接字,并暂停线System.out.println(“\n\n尝试建立新的db连接”);我在问题中提到。