2012-11-14 26 views
5

Xin chào tất cả Tôi có một ứng dụng Storm cơ bản được thiết lập nơi nó nhận được một luồng tweet và lưu trữ chúng trong cơ sở dữ liệu MySQL. Ứng dụng hoạt động tốt trong ~ 23 giờ đầu tiên hoặc lâu hơn sau đó nó bắt đầu đưa ra lỗi sau:Storm Crashing sau 23 giờ

SQL Exception 
SQL State: 08003 

Sau khi thực hiện thao tác này một vài lần nó sẽ chết. Tôi đang sử dụng kết nối JBDC tiêu chuẩn để kết nối với cơ sở dữ liệu từ Java. Các mã cho các chức năng để lưu trữ và thiết lập kết nối DB như sau:

private String _db=""; 
private Connection conn = null; 
private PreparedStatement pst = null; 

public ArchiveBolt(String db){ 
    _db = db; 
} 

private void setupConnection() { 
    //Connect to the database 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = DriverManager.getConnection("jdbc:mysql://localhost:8889/twitter_recording", "root", "root"); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void execute(Tuple tuple, BasicOutputCollector collector) { 

    Status s = (Status) tuple.getValue(0); 

    //setup the connection on the first run through or if the connection got closed down 
    try { 
     setupConnection(); 
    } catch (Exception e) { 
     // TODO: handle exception 
     System.out.println(e.toString()); 
    } 


    try { 

     pst = conn.prepareStatement("INSERT INTO " + _db + " (tweet)" + 
            "VALUES (?);"); 

     pst.setString(1, s.toString()); 

     //execute the SQL 
     pst.executeUpdate(); 

    } catch (SQLException ex) { 
     // handle any errors 
     System.out.println("SQLException: " + ex.getMessage()); 
     System.out.println("SQLState: " + ex.getSQLState()); 
     System.out.println("VendorError: " + ex.getErrorCode()); 

     if(ex.getSQLState().equals("08003")){ 
      setupConnection(); 
     } 

    } finally { 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Sau khi nó trở nên rõ ràng rằng nó đã đâm do lỗi 08.003 Tôi quyết định rằng nếu nó ném lỗi rằng nó nên thử lại các thiết lập kết nối, tuy nhiên điều đó cũng không giúp được gì. Bất cứ ai có thể chỉ cho tôi đi đúng hướng để giải quyết vấn đề này?

+0

[08003 \t Kết nối không tồn tại] (http://dev.mysql.com/doc/refman/5.0/vi/connector-odbc-reference-errorcodes.html) –

+0

Kết nối có luôn luôn ngắt cùng một lúc trong ngày không? Nếu vậy, có lẽ kết nối bị hỏng bởi một số sự kiện được lên lịch (ví dụ: DB được khởi động lại hàng ngày). –

+0

Có, tôi biết điều này. Đó là lý do tại sao tôi đã thiết lập lại kết nối trong trường hợp nó chạy vào lỗi này. Như được hiển thị ở trên 'catch (SQLException ex) { // xử lý bất kỳ lỗi nào System.out.println (" SQLException: "+ ex.getMessage()); System.out.println ("SQLState:" + ex.getSQLState()); System.out.println ("VendorError:" + ex.getErrorCode()); nếu (ex.getSQLState(). Bằng ("08003")) { setupConnection(); } } ' –

Trả lời

3

After it became apparent that it was crashing because of a 08003 error I decided that if it threw that error it should retry the set up of the connection, however that didn't help either. Could anyone point me in the right direction for solving this issue?

Về cơ bản có hai vấn đề ở đây là cần phải được giải quyết:

  • Tại sao các kết nối bị mất ở nơi đầu tiên?
  • Tại sao nỗ lực của bạn không kết nối lại thành công?

Đối với vấn đề đầu tiên, bạn nên xem nhật ký MySQL để xem có bất kỳ chỉ dẫn nào ở đó không. Ngoài ra, hãy kiểm tra các ngoại lệ SQL ngay trước khi ngoại lệ (lặp lại) "state 080003". Sau này chỉ đơn giản là nói với bạn rằng kết nối đã chết trước đó.

tôi đoán là vấn đề là một trong những cách sau:

  • Các máy chủ MySQL đã timed out kết nối do không hoạt động. Bạn có thể thay đổi thời gian chờ kết nối trong cấu hình MySQL nếu đây là vấn đề.

  • Ứng dụng của bạn có thể từ từ bị rò rỉ kết nối JDBC.

Đối với vấn đề thứ hai, cách tiếp cận chung là đúng, nhưng mã của bạn không khớp với mô tả. Trong thực tế, có vẻ như là luôn luôn cố gắng thiết lập kết nối cơ sở dữ liệu mới mỗi khi phương thức execute của bạn được gọi. Điều này làm cho cuộc gọi kết nối lại trong trình xử lý ngoại lệ của bạn vô nghĩa. (OTOH, mã hiển thị dấu hiệu cho thấy ai đó đã "đánh đập nó" để cố gắng làm cho nó hoạt động ... và đó cũng có thể là một phần của vấn đề.)

Tôi sẽ kiểm tra xem setupConnection đang được gọi là khi cần phải là và tìm bất kỳ ngoại lệ nào có thể bị ném. Ngoài ra, bạn nên đảm bảo rằng bạn rõ ràng close() đối tượng kết nối đã chết ... và suy nghĩ lại/recode quản lý kết nối của bạn để nó không bị rò rỉ.


Để ghi lại, có tham số URL kết nối được gọi là "tự động kết nối" được sử dụng để "xử lý" với các kết nối bị mất. Thật không may, việc triển khai ban đầu là không an toàn, vì vậy họ đã vô hiệu hóa nó một cách hiệu quả; xem Câu hỏi này để biết chi tiết: Why does autoReconnect=true not seem to work?

Các vấn đề liên quan