Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

MySQL: 5.5.41-0ubuntu0.14.04.1

mysql-connector-java: 5.1.35

 

 

public class DBFunctions {
  
  private static String CONSTR = "jdbc:mysql://" + HOST + "/" + DB + "?user=" + SQLUSER +
				 "&password=" + SQLUSERPW + "&useUnicode=true&characterEncoding=UTF-8";

  private Connection connect;
  
  public DBFunctions() throws SQLException{
	  this.connect = DriverManager.getConnection(CONSTR);
  }


public String findPrimarySynonym(String table, String term) throws ClassNotFoundException, SQLException {
	//Connection connect = null;
	Statement statement = null;
	ResultSet resultSet = null;
	
	// to return
	String s = "";
	
	// fill statement	
	String sqlst = "select term from " + DB + "." + table + " where isprimary = 1" +
			" and synonymsetid in (select synonymsetid from " + DB + "." + table +
			" where term = '" + term + "')";
	
	try {
    	
		Class.forName("com.mysql.jdbc.Driver");
      
		//connect = DriverManager.getConnection(CONSTR);
		
		statement = connect.createStatement();
		 
	    resultSet = statement.executeQuery(sqlst);
 
	    while (resultSet.next()) {	    	
	    	s = resultSet.getString("term"); 	
	    }
 
	} finally {
		//close(connect, statement, resultSet);
		close(statement, resultSet);
	}
	return s;
}


  // You need to close the resultSet
  private void close(Connection connect, Statement statement, ResultSet resultSet) {
    try {
      if (resultSet != null) {
        resultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

      if (connect != null) {
        connect.close();
      }
    } catch (Exception e) {

    }
  }
  
  // You need to close the resultSet
  private void close(Statement statement, ResultSet resultSet) {
    try {
      if (resultSet != null) {
        resultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

//      if (connect != null) {
//        connect.close();
//      }
    } catch (Exception e) {

    }
  }
} 

 

 

 

Προσπαθουσα να κανω ~600.000 SELECTs στη βαση, αλλα καθε φορα μετα τις πρωτες 1000 εως 5000 φορες εβγαζε σφαλμα: "communications link failure". Με τα INSERTs δεν ειχα προβλημα.

 

Την λυση την βρηκα τελικα εδω και συγκεκριμενα στο κομματι:

 

 

But what solved my problem?

 

My problem was that I had many SELECTs on database. Each time I was creating a connection and then closing it. Although I was closing the connection every time, but the system faced with many connections and gave me that error. What I did was that I defined my connection variable as a public (or private) variable for whole class and initialized it in the constructor. Then every time I just used that connection. It solved my problem and also increased my speed dramatically.

 

 

Στην αρχη ανοιγοκλεινα το Connection για καθε request, οπως βλεπετε στον κωδικα, αλλα μετα το αλλαξα συμφωνα με την απαντηση και τωρα παιζει. Αλλα δεν μπορω να καταλαβω γιατι συμβαινει αυτο. Στη βαση κοιταξα στις ρυθμισεις και δεν βρηκα καποιο περιορισμο, ειτε χρονικο ή αριθμο συνδεσεων.

Δημοσ.

MySQL: 5.5.41-0ubuntu0.14.04.1

mysql-connector-java: 5.1.35

 

 

 

public class DBFunctions {
  
  private static String CONSTR = "jdbc:mysql://" + HOST + "/" + DB + "?user=" + SQLUSER +
				 "&password=" + SQLUSERPW + "&useUnicode=true&characterEncoding=UTF-8";

  private Connection connect;
  
  public DBFunctions() throws SQLException{
	  this.connect = DriverManager.getConnection(CONSTR);
  }


public String findPrimarySynonym(String table, String term) throws ClassNotFoundException, SQLException {
	//Connection connect = null;
	Statement statement = null;
	ResultSet resultSet = null;
	
	// to return
	String s = "";
	
	// fill statement	
	String sqlst = "select term from " + DB + "." + table + " where isprimary = 1" +
			" and synonymsetid in (select synonymsetid from " + DB + "." + table +
			" where term = '" + term + "')";
	
	try {
    	
		Class.forName("com.mysql.jdbc.Driver");
      
		//connect = DriverManager.getConnection(CONSTR);
		
		statement = connect.createStatement();
		 
	    resultSet = statement.executeQuery(sqlst);
 
	    while (resultSet.next()) {	    	
	    	s = resultSet.getString("term"); 	
	    }
 
	} finally {
		//close(connect, statement, resultSet);
		close(statement, resultSet);
	}
	return s;
}


  // You need to close the resultSet
  private void close(Connection connect, Statement statement, ResultSet resultSet) {
    try {
      if (resultSet != null) {
        resultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

      if (connect != null) {
        connect.close();
      }
    } catch (Exception e) {

    }
  }
  
  // You need to close the resultSet
  private void close(Statement statement, ResultSet resultSet) {
    try {
      if (resultSet != null) {
        resultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

//      if (connect != null) {
//        connect.close();
//      }
    } catch (Exception e) {

    }
  }
} 

 

 

 

Προσπαθουσα να κανω ~600.000 SELECTs στη βαση, αλλα καθε φορα μετα τις πρωτες 1000 εως 5000 φορες εβγαζε σφαλμα: "communications link failure". Με τα INSERTs δεν ειχα προβλημα.

 

Την λυση την βρηκα τελικα εδω και συγκεκριμενα στο κομματι:

 

 

 

 

Στην αρχη ανοιγοκλεινα το Connection για καθε request, οπως βλεπετε στον κωδικα, αλλα μετα το αλλαξα συμφωνα με την απαντηση και τωρα παιζει. Αλλα δεν μπορω να καταλαβω γιατι συμβαινει αυτο. Στη βαση κοιταξα στις ρυθμισεις και δεν βρηκα καποιο περιορισμο, ειτε χρονικο ή αριθμο συνδεσεων.

 

   Επειδη καθε φορα που συνδεεσαι με μια database θελει εναν χρονο για να establish connection, authentication κτλ. Αμα θελεις να κανεις πολλα transactions πραγματικα δεν εχει καμια λογικη να ριχνεις συνεχως την συνδεση και να δημιουργεις κανουργια.

  To να προσπαθησεις να δημιουργεις 600.000 new connections ειναι τουλαχιστον αστειο...

 

  Και ειδικα αμα τα create new connections σου τρεχει asynchronously, τοτε μιλαμε για τρελο αριθμο connections ανοιχτων μιας και θα ανοιγουνε συνεχως καινουργιες πριν κλεισουν οι πρωτες ...

Δημοσ.

Αυτο

Το connection το κρατας ανοιχτο οσο το χρειαζεσαι

Δεν εχει νοημα να το κλεινεις και να το ξανανοιγεις συνεχεια

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...