2017-08-26 2 views
1

Ich bin ein sehr Anfänger zu Java und für eine meiner Aufgaben. Ich muss Datenbankoperationen durchführen. Ich habe diesen Java-Code zum Einfügen von Daten in eine Datenbank und es funktioniert gut.Java Datenbank minimieren Verbindungserstellung

public class JavaDBWork 
{ 

    public static void main(String[] args) 
    { 
    try 
    { 
     // create a mysql database connection 
     String myDriver = "org.gjt.mm.mysql.Driver"; 
     String myUrl = "jdbc:mysql://localhost/test"; 
     Class.forName(myDriver); 
     Connection conn = DriverManager.getConnection(myUrl, "root", ""); 

     // create a sql date object so we can use it in our INSERT statement 
     Calendar calendar = Calendar.getInstance(); 
     java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime()); 

     // the mysql insert statement 
     String query = " insert into users (first_name, last_name, date_created, is_admin, num_points)" 
     + " values (?, ?, ?, ?, ?)"; 

    //Other Code 
} 

Meine Frage ist jedesmal, wenn der Code ausgeführt wird, hat mein Code eine Datenbankverbindung und vorbereitete Anweisung Objekte zu erstellen und, wie ich es verstehe, ist ein kostspieliger Vorgang.

Gibt es eine Möglichkeit, dass ich eine einzige Verbindung zur Datenbank behalten und diese für meine Datenbankarbeit verwenden kann?

+1

Google "jdbc Verbindung Pooling" – Ramanlfc

+0

Danke für die Antwort. Will in das schauen :) –

+4

Die Kosten für die Erstellung der Verbindung ist relativ, und es ist wirklich nicht so wichtig für "Spielzeug" Projekte wie Studentenaufgaben zu berücksichtigen. Völlig anderes Thema: das Laden von 'org.gjt.mm.mysql.Driver' ist wirklich 15+ Jahre alt, die MySQL-Treiberklasse heißt seit Jahren' com.mysql.jdbc.Driver' (die 'org.gjt .mm.mysql.Driver 'ist nur aus Gründen der Abwärtskompatibilität erhalten. –

Antwort

2

Sie können die Entwurfsmuster Singleton-Verbindung wie folgt verwenden:

1- eine Klasse erstellen SingletonConnection.java so aussehen:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.EmptyStackException; 

public class SingletonConnection { 


    private static Connection connection = null ; 
    static 
    { 
     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      connection = DriverManager.getConnection 
        ("jdbc:mysql://localhost:3306/gestion_comptes","root",""); 
     }catch(Exception ex) 
     { 

     } 

    } 
    public static Connection getConnection() throws Exception { 
     return connection; 
    } 


} 

Und in der anderen Klasse nennen es wie folgt aus:

public class DaoImpl{ 

     public Connection connection = SingletonConnection.getConnection(); 

     public DaoImpl() throws Exception 
     { 
      if(connection==null) 
       throw new Exception("impossible de se connecter à la base de données"); 
     } 
} 
+1

Vielen Dank für Ihre Antwort. Ich bin ziemlich neu in Java, so müssen auch Design-Muster lernen. Nach einigem Suchen scheint dieser Ansatz mein Problem zu lösen. Nochmals vielen Dank :) –

+1

Wenn - wie in den Kommentaren von @ranmini angegeben - dies für eine Webanwendung gilt, dann ist das eine sehr schlechte Idee. Es wird alle Arten von Race Conditions, Transaktionsisolationsfehler usw. einführen. Tun Sie es nicht. –

+0

@MarkRotteveel Wenn ja, können Sie mir bitte Ihren Vorschlag mitteilen? Ich brauche keine Codes, nur einen Überblick, wie es geht. Selbst eine externe Quelle würde ausreichen :) –

2
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.util.Calendar; 

public class JavaDBWork { 

    private final String DATBASE = "myDatabasename"; 
    private final String URL = "jdbc:mysql://localhost:3306/" + DATBASE + "?useSSL=false"; 
    private final String USERNAME = "myUsername"; 
    private final String PASSWORD = "myPassword"; 

    private Connection databaseConnection; 

    // Main Method to init 
    public static void main(String[] args) { 
     // build an javaDBWork with init connection one time 
     JavaDBWork javaDBWork = new JavaDBWork(); 
     // call methods in javaDBWork you like 
     javaDBWork.doSomething(); 
    } 

    public JavaDBWork() { 
     // create a mysql database connection at init 
     this.databaseConnection = databaseConnection(); 
    } 

    private Connection databaseConnection() { 
     Connection connection = null; 
     try { 
      connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
     return connection; 
    } 

    public void doSomething() { 
     try { 
      // create a sql date object so we can use it in our INSERT statement 
      Calendar calendar = Calendar.getInstance(); 
      java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime()); 

      // the mysql insert statement  
      String sql = " insert into users (first_name, last_name, date_created, is_admin, num_points)" + " values (?, ?, ?, ?, ?)"; 
      PreparedStatement preparedStatement = null; 

      preparedStatement = databaseConnection.prepareStatement(sql); 
      preparedStatement.setString(1, "Lucky"); 
      preparedStatement.setString(2, "Luke"); 
      ... 

      preparedStatement.executeUpdate(); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 
    } 

Sie können so etwas tun.

Initiieren Sie die Datenbankverbindung einmal und halten Sie die Verbindung in einem Objekt, das Sie bei Bedarf aufrufen.

EDIT: Beispiel, wenn Sie Verbindung in eine andere Klasse benötigen:

public class MyMainClass { 

    private JavaDBWork javaDBWork; 

    // Main Method to init 
    public static void main(String[] args) { 
     new MyMainClass(); 
    } 

    public MyMainClass() { 
     // build an javaDBWork with init connection one time 
     javaDBWork = new JavaDBWork(); 
     // call methods in javaDBWork you like 
     javaDBWork.doSomething(); 
    } 

} 


public class JavaDBWork { 

    private final String DATBASE = "myDatabasename"; 
    private final String URL = "jdbc:mysql://localhost:3306/" + DATBASE + "?useSSL=false"; 
    private final String USERNAME = "myUsername"; 
    private final String PASSWORD = "myPassword"; 

    private Connection databaseConnection; 

    public JavaDBWork() { 
     // create a mysql database connection at init 
     this.databaseConnection = databaseConnection(); 
    } 

    private Connection databaseConnection() { 
     Connection connection = null; 
     try { 
      connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
     return connection; 
    } 

    public void doSomething() { 
     try { 
      // create a sql date object so we can use it in our INSERT statement 
      Calendar calendar = Calendar.getInstance(); 
      java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime()); 

      // the mysql insert statement 
      String sql = " insert into users (first_name, last_name, date_created, is_admin, num_points)" + " values (?, ?, ?, ?, ?)"; 
      PreparedStatement preparedStatement = null; 

      preparedStatement = databaseConnection.prepareStatement(sql); 
      preparedStatement.setString(1, "Lucky"); 
      preparedStatement.setString(2, "Luke"); 

      preparedStatement.executeUpdate(); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 
    } 
} 
+0

Vielen Dank für Ihre Antwort :) Es hilft, wenn wir innerhalb der Klasse codieren. Was, wenn wir eine Verbindung außerhalb der Klasse wollen? Irgendwelche Ideen dazu? –

+0

Fügen Sie einfach die Methode main() in die Klasse ein, die Sie benötigen, und verwenden Sie sie wie gestern gezeigt. Vielleicht brauchen Sie eine globale Variable. Siehe meine Bearbeitung in der Antwort.:) – user6266369

+0

Danke für die geänderte Antwort auch :) –