Wie würden Sie testen, ein Connection Pool
Habe ich implementiert eine sehr einfache ConnectionPool in Java.
Es hat keine ausgefallenen Funktionen, nur get/release-Methoden für die Verbindung.
Wie kann ich es testen?
Ich weiß, es gibt viele Verbindungs-Pools bereit zu verwenden, die sind viel zuverlässiger als das, was ich mache, aber ich versuche nur, zu üben, zu verstehen, wie verbindungen Pool.
Danke!
Hier ist der code falls es hilft:
public class ConnectionPoolImpl implements ConnectionPool {
private Vector<PooledConnection> connections; //The connections container
String url;
String username;
String password;
/**
* Instanciates a new MySQLConnectionPool
* @param nbConnectionsMax
*/
public ConnectionPoolImpl(String DBUrl, String username, String password){
this.connections = new Vector<PooledConnection>();
this.url = DBUrl;
this.username = username;
this.password = password;
}
/**
* Returns a connection from the pool, if some are available, or create a new one.
*
* @return the connection.
*/
public Connection getConnection() throws SQLException {
synchronized(this.connections){
//Checking if there is an available connection to return
for(PooledConnection c : this.connections){
if(!c.isUsed()){
c.setUsed();
return c.getConnection();
}
}
//If there are none, open a new one and return it
Connection conn = DriverManager.getConnection(url, username, password);
PooledConnection pConn = new PooledConnection(conn);
pConn.setUsed();
connections.add(pConn);
return pConn.getConnection();
}
}
/**
* Releases a connection to the pool.
*
* @param con the connection to release.
*/
public void releaseConnection(Connection con) throws SQLException {
synchronized(this.connections){
for(PooledConnection c : this.connections){
if(c.getConnection().equals(con)){
c.setFree();
return;
}
}
}
}
}
Und meine PooledConnection.java:
public class PooledConnection {
private Connection conn;
private boolean used;
public PooledConnection(Connection conn){
this.conn = conn;
this.used = false;
}
public void setUsed(){
this.used = true;
}
public void setFree(){
this.used = false;
}
public boolean isUsed(){
return this.used;
}
public Connection getConnection(){
return this.conn;
}
}
fyi, Sie haben einen Fehler. wenn Sie erstellen und eine neue Verbindung, die Sie nicht markieren, wie verwendet.
Hoppla, du hast Recht. Ich korrigiert diesen in der Bearbeiten. Danke.
Hoppla, du hast Recht. Ich korrigiert diesen in der Bearbeiten. Danke.
InformationsquelleAutor nbarraille | 2011-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man testen,
Beachten Sie, dass ein unit-test wäre eine echte Datenbank, mit einem echten Benutzer und Passwort zu testen. Sie machen Ihre Verbindung pool abhängen, eine DataSource und bauen Sie Ihre ConnectionPool Verwendung eines mock-DataSource Rückkehr mock-Verbindungen, um testen zu können die Klasse, ohne je auf eine richtige Datenbank.
InformationsquelleAutor JB Nizet
Für ein integration-test, den Sie verwenden konnten, dbUnit zum laden der Datenbank mit aufbereiteten Daten und dann einen Test schreiben, dass die Abfrage der Datenbank.
Für einen unit-test, sollten Sie mit einem spöttischen Bibliothek wie Mockito um sicherzustellen, dass Sie das Verhalten, die Sie erwarten. Keine Datenbank notwendig in diesem Fall. [EDIT: Doch, durch die statische Methode Aufrufe, wie DriverManager.getConnection(), erfordert dies einige refactoring und/oder dependency injection.]
Durch Kombination von unit-tests und integration tests (und mischen Sie einige multi-threaded unit-tests), Sie können gehen einen langen Weg zu testen Sie Ihre Arbeit.
Guter Punkt. Es kann nützlich sein, mit einigen refactoring / dependency injection. Werde ich Bearbeiten.
Nizet, @Michael Oster: ich habe versucht, so viel DI wie ich konnte (zum Beispiel die Zusammengefasste Verbindung nicht erstellen Sie Ihre eigenen Verbindung, sondern eine durch den Konstruktor. Aber ich kann mir nicht vorstellen, dass es eine Möglichkeit für den ConnectionPool sich nicht darauf zu verlassen DriverManager.getConnection(), wie kann ich das tun?
Nicht unbedingt elegant, aber hier ist eine Möglichkeit: definieren Sie ein interface namens Anschließbar, die eine getConnection () - Methode. Schreiben DefaultConnectableImpl, die diese Schnittstelle implementiert, durch den Aufruf der DriverManager.getConnection(). Nun, wenn deine Klasse erhält eine Anschließbare im Tor, dann haben Sie entkommen der Abhängigkeit.
Ostern: Ja, dachte nur es wenige Minuten ist es her, dass die tolle Idee, jetzt kann ich erklären, eine mock-Implementierung dieser Schnittstelle und testen Sie meine ConnectionPool, ohne auch nur einen echten DB für den größten Teil.
InformationsquelleAutor Michael Easter
Industrielle Stärke connection pools die Fähigkeit haben, prüfen Sie die verbindungen, indem eine Verbindung und der Ausführung einer einfachen SQL-Abfrage (z.B. "SELECT 1"), um sicherzustellen, dass die Verbindung tragfähig ist, bevor er es aus. Deins tut das nicht.
Ich nicht sehen, wo Sie initialisieren kann die Verbindung pool mit einer festen Anzahl von verbindungen. Der ganze Sinn eines verbindungspools ist, amortisieren sich die Kosten für die Schaffung einer Verbindung für alle clients.
Ich würde befürchten das design der connection pool.
Als zum testen, starten Sie einfach das schreiben von unit-tests. Seit Ihr pool wird gemeinsam genutzt werden, sicher sein, zu schreiben, einige multi-threaded-tests durch, um sicherzustellen, dass es wirklich thread-sicher.
2. Wenn der maximale Wert erreicht ist und ein thread eine Verbindung anfordert, ist es besser, auf null zurück, oder Sie warten, bis der Anschluss freigegeben werden, und schicken Sie es dann? - 3. Ist das nicht einer der Punkte, der mit einem Verbindungs-pool, nicht zu verbringen Zeit öffnen und schließen von verbindungen jedes mal, wenn ein Gewinde soll mit den DB? Wenn ja, ist nicht prüfen Sie die Verbindung, bevor es in die entgegengesetzte Richtung? Ich danke Ihnen sehr!
Ich würde empfehlen, eine Anzahl von verbindungen gemäß der minimale Wert und fügen Sie mehr als nötig. Wenn eine andere Verbindung angefordert wird, es ist Ihre Wahl, entweder eine neue erstellen oder warten, bis ein anderer freigesetzt wird. Verwendung einer Verbindung nicht das Problem; das erstellen einer ist. Sie schließen Sie nicht die Verbindung, die Sie einfach legen Sie es zurück in den pool. Überprüfen Sie die Verbindung, bevor Sie Sie loslassen ist etwas, das alle kommerziellen und open-source-pools ermöglichen es Ihnen, zu tun, so Schätze ich, dass es nicht in die entgegengesetzte Richtung.
nbarraille, möchten Sie möglicherweise starten Sie eine separate Frage, die "Kritik" meine Verbindung "pool". Oder "wie würde ich das design ein connection pool?". Dieser thread ist interessant, aber kaum geht es um die Frage "wie testen?".
InformationsquelleAutor duffymo
Sollten Sie auch testen, Parallelität/Skalierbarkeit unter Last mit mehreren threads.
InformationsquelleAutor MRalwasser