2016-04-21 9 views
0

Ich weiß, das wird die sich wiederholende Frage sein, aber ich fühle mich meine Frage ist etwas anders.Zu viele Verbindungen Spring Boot jdbc

Ich habe JdbcDAO Klassen wie

@Component 
    public class JdbcUserDAO implements UserDAO { 
    @Autowired 
    MyJdbc myJdbc; 
    } 

ich die MyJdbc Klasse definiert sich wie folgt:

@Component 
public class MyJdbc { 

@Autowired 
    protected JdbcTemplate jdbc; 

} 

In der I MyJdbc Klasse bin definieren, um den Einsatz und batchupdate und sie durch jdbc Variable aufrufen. Wird es zu viele Verbindungsausnahmen erstellen.

Ich habe die jdbc Parameter in application.properties-Datei definiert:

spring.datasource.url=#databaseurl 
spring.datasource.username=#username 
spring.datasource.password=#password 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 
spring.datasource.test-on-borrow=true 
spring.datasource.max-active=100 
spring.datasource.max-wait=10000 
spring.datasource.min-idle=10 
spring.datasource.validation-query=SELECT 1 
spring.datasource.time-between-eviction-runs-millis= 5000 
spring.datasource.min-evictable-idle-time-millis=30000 
spring.datasource.test-while-idle=true 
spring.datasource.test-on-borrow=true 
spring.datasource.test-on-return=false 

Ich erhalte die Ausnahme:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections 

I für konstante verschiedene viele Änderungen an der Datei application.properties getan haben aber es hat nicht funktioniert. Meine Datenbank wird auf AWS RDS gehostet.

Aber für die Aktualisierung der Blob-Bildwerte I tun:

blob= myJdbc.jdbc.getDataSource().getConnection().createBlob(); 
      blob.setBytes(1, str.getBytes()); 
      pstmt = myJdbc.jdbc.getDataSource().getConnection().prepareStatement("update user_profile set profileImage=? where user_profile.id in (select id from user_login where email=?)"); 
+3

Der Fehler stammt von MySQL, nicht von Ihrer App, wissen Sie, wie viele Verbindungen Ihre RDS-Instanz bewältigen kann? Meine Vermutung ist, dass es weniger als 100 ist. –

+0

Haben Sie einen Grund für die Verwendung von Jdbc API statt Spring Data oder JPA? –

+0

@DaveBower: Ich habe globale Variablen wie 'max_connections' angezeigt; Es zeigt 66 – Chetan

Antwort

2
blob= myJdbc.jdbc.getDataSource().getConnection().createBlob(); 
blob.setBytes(1, str.getBytes()); 
pstmt = myJdbc.jdbc.getDataSource().getConnection().prepareStatement("update user_profile set profileImage=? where user_profile.id in (select id from user_login where email=?)"); 

Das Problem ist, mit Ihrem Code. Dieser Code öffnet zusätzliche Verbindungen zur Datenbank, ohne sie zu schließen. Sie öffnen Verbindungen selbst, dann sollten Sie sie auch schließen. Es ist jedoch besser, in diesen Fällen eine ConnectionCallback zu verwenden.

myJdbc.execute(new ConnectionCallback() { 
    public Object doInConnection(Connection con) throws SQLException, DataAccessException { 
     blob = con.createBlob(); 
     blob.setBytes(1, str.getBytes()); 
     pstmt = con.prepareStatement("update user_profile set profileImage=? where user_profile.id in (select id from user_login where email=?)"); 
     return null; 
    } 
}); 

Allerdings ist es noch einfacher Frühling JDBCs Blob Unterstützung zu verwenden (siehe the reference guide). Auf diese Weise müssen Sie sich nicht mit Verbindungen und Blobs herumärgern.

final String query = "update user_profile set profileImage=? where user_profile.id in (select id from user_login where email=?)"; 
myJdbc.jdbc.execute(query, new AbstractLobCreatingPreparedStatementCallback(lobHandler) { 1 
    protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { 
     byte[] bytes = str.getBytes(); 
     ps.setString(2, email); 
     lobCreator.setBlobAsBinaryStream(ps, 1, str.getBytes()); 
    } 
}); 
+0

Ich werde dieses versuchen, aber ich benutze meine benutzerdefinierten DAO-Klassen zu Abfrage ist es der richtige Weg oder das öffnet auch die mehrere Verbindungen. – Chetan

+0

Verwenden Sie die jdbc-Vorlage ... An jedem Ort, an dem Sie selbst eine "getConnection" machen (und grundsätzlich den Frühling und seine Transaktions- und Ressourcenverwaltung umgehen), verwalten Sie die Verbindungen selbst. Verwenden Sie das JdbcTemplate ordnungsgemäß. Arbeite mit dem Framework nicht darum herum. –

+0

Wie in der JDBC-Blob-Unterstützung zu sehen ist, wie der gespeicherte Wert des Blobs zurückgelesen und zurück in einen String konvertiert wird. – Chetan