Guest User

GUI_Controller.java

a guest
Dec 9th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.83 KB | None | 0 0
  1. import java.io.BufferedWriter;
  2. import java.io.File;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10.  
  11. import javafx.fxml.*;
  12. import javafx.scene.control.Alert;
  13. import javafx.scene.control.Alert.AlertType;
  14. import javafx.scene.control.Button;
  15. import javafx.scene.control.CheckBox;
  16. import javafx.scene.control.Label;
  17. import javafx.scene.control.PasswordField;
  18. import javafx.scene.control.RadioButton;
  19. import javafx.scene.control.TextArea;
  20. import javafx.scene.control.TextField;
  21. import javafx.scene.control.ToggleGroup;
  22.  
  23. import java.text.SimpleDateFormat;
  24. import java.util.Date;
  25. import java.util.SplittableRandom;
  26. import java.util.concurrent.TimeUnit;
  27.  
  28. import com.sun.javafx.image.impl.ByteIndexed.Getter;
  29.  
  30. /**
  31.  *
  32.  * @author Lars Habier,Felix Tenbruck,Gerrit Schulz
  33.  *
  34.  * Folgende Anwendung dient dazu, eine bestimmte Datenmenge mit Hilfe eines Skalierungsfaktor n in eine Datenbank einzufügen und die Dauer dieses
  35.  * einfügens zu messen. Dabei ist (unsere) effektivste Methode immer unter der Methode insertData() zu finden, und weniger effektiver Methoden sind
  36.  * entweder auskommentiert, oder in ältern Revisionen zu finden.
  37.  *
  38.  */
  39. public class GUI_Controller {
  40.    
  41.     // Deklarationen der Variablen die Methoden übergreifend sind
  42.     protected Connection connection;
  43.     protected String ip;
  44.     protected String db;
  45.     protected String user;
  46.     protected String psw;
  47.     protected int n;
  48.    
  49.     //Deklaration der Controll-Objekte für den SceneBuilder
  50.     @FXML
  51.     Label l_connectServer_title;
  52.     @FXML
  53.     Label l_connectServer_IP;
  54.     @FXML
  55.     Label l_connectServer_DB;
  56.     @FXML
  57.     Label l_connectServer_USER;
  58.     @FXML
  59.     Label l_connectServer_PSW;
  60.     @FXML
  61.     Label l_context_n;
  62.     @FXML
  63.     Label l_IP;
  64.     @FXML
  65.     Label l_DB;
  66.     @FXML
  67.     Label l_USER;
  68.     @FXML
  69.     Label l_PSW;
  70.    
  71.     @FXML
  72.     CheckBox cb_autoclear;
  73.     @FXML
  74.     CheckBox cb_db_avail;
  75.     @FXML
  76.     CheckBox cb_show_psw;
  77.     @FXML
  78.     RadioButton r_lokal;
  79.     @FXML
  80.     RadioButton r_extern;
  81.    
  82.     @FXML
  83.     ToggleGroup connectServer_toggleGroup_radio = new ToggleGroup();
  84.    
  85.    
  86.     @FXML
  87.     TextField tf_connectServer_IP;
  88.     @FXML
  89.     TextField tf_connectServer_DB;
  90.     @FXML
  91.     TextField tf_connectServer_USER;
  92.     @FXML
  93.     TextField tf_connectServer_PSW;
  94.     @FXML
  95.     TextField tf_get_n;
  96.    
  97.     @FXML
  98.     PasswordField pf_connectServer_PSW;
  99.  
  100.     @FXML
  101.     TextArea console;
  102.    
  103.     @FXML
  104.     Button btn_connectServer_connect;
  105.     @FXML
  106.     Button btn_createDB;
  107.     @FXML
  108.     Button btn_createTables;
  109.     @FXML
  110.     Button btn_dropDB;
  111.     @FXML
  112.     Button btn_dropTables;
  113.     @FXML
  114.     Button btn_startInsert;
  115.     @FXML
  116.     Button btn_createLog;
  117.    
  118.     /**
  119.      * Diese Methode dient dazu, bei einem Klick auf den Radiobutton "lokal" die Textfelder vorab schonmal mit Inhalt zu füllen
  120.      */
  121.     @FXML
  122.     protected void connectServer_lokal_onclick() {
  123.         tf_connectServer_IP.setText("localhost");
  124.         tf_connectServer_DB.setText("");
  125.         tf_connectServer_USER.setText("root");
  126.         tf_connectServer_PSW.setText("");
  127.        
  128.     }
  129.    
  130.     /**
  131.      * Diese Methode leert die Textfelder, damit nun eigenständig Eingaben gemacht werden können
  132.      */
  133.     @FXML
  134.     protected void connectServer_extern_onclick() {
  135.         tf_connectServer_IP.setText("");
  136.         tf_connectServer_DB.setText("");
  137.         tf_connectServer_USER.setText("");
  138.         tf_connectServer_PSW.setText("");
  139.     }
  140.     /**
  141.      * Diese Methode aktiviert das TextFeld tf_connectServer_DB, wenn ein Haken reingesetzt wird
  142.      */
  143.     @FXML
  144.     protected void connectServer_db_available_onclick() {
  145.         if(tf_connectServer_DB.isDisabled()) {
  146.             tf_connectServer_DB.setDisable(false);
  147.             tf_connectServer_DB.setText("benchmark_db");
  148.         }
  149.         else {
  150.             tf_connectServer_DB.setDisable(true);
  151.             tf_connectServer_DB.setText("");
  152.         }
  153.     }
  154.    
  155.     /**
  156.      * Diese Methode dient dazu, die Objekte nach dem erfolgreichen anmelden anzuzeigen
  157.      */
  158.     @FXML
  159.     protected void show_connected_Controlls() {
  160.         l_IP.setVisible(true);
  161.         l_IP.setText("IP-Adresse: "+getIp());
  162.         l_DB.setVisible(true);
  163.         if(getDb().isEmpty()) {
  164.             l_DB.setText("Datenbank: keine vorhanden");
  165.         }
  166.         else {
  167.         l_DB.setText("Datenbank: "+getDb());
  168.         }
  169.         l_USER.setVisible(true);
  170.         l_USER.setText("Benutzer: "+getUser());
  171.         String encrypted_psw = "";
  172.         int length = getPsw().length();
  173.         if(length == 0) {
  174.             encrypted_psw = "-";
  175.         }else {
  176.            
  177.         for(int i = 1;i<=length;i++) {
  178.             encrypted_psw = encrypted_psw+"*";
  179.         }
  180.         }
  181.         l_PSW.setVisible(true);
  182.         l_PSW.setText("Passwort: "+encrypted_psw);
  183.         btn_createDB.setVisible(true);
  184.         btn_createTables.setVisible(true);
  185.         btn_dropDB.setVisible(true);
  186.         btn_dropTables.setVisible(true);
  187.         btn_startInsert.setVisible(true);
  188.         l_context_n.setVisible(true);
  189.         tf_get_n.setVisible(true);
  190.         console.setVisible(true);
  191.         cb_autoclear.setVisible(true);
  192.         btn_createLog.setVisible(true);
  193.     }
  194.    
  195.     /**
  196.      * Diese Methode dient dazu, alle Objekte, die beim Start im Verbindungsfenster zu sehen sind, unsichtbar zu machen, so dass die neuen Objekte
  197.      * im Vordergrund stehen
  198.      */
  199.     @FXML
  200.     protected void hide_connectServer_Controlls() {
  201.         l_connectServer_IP.setVisible(false);
  202.         l_connectServer_DB.setVisible(false);
  203.         l_connectServer_USER.setVisible(false);
  204.         l_connectServer_PSW.setVisible(false);
  205.         l_connectServer_title.setVisible(false);
  206.         tf_connectServer_IP.setVisible(false);
  207.         tf_connectServer_DB.setVisible(false);
  208.         tf_connectServer_USER.setVisible(false);
  209.         tf_connectServer_PSW.setVisible(false);
  210.         r_lokal.setVisible(false);
  211.         r_extern.setVisible(false);
  212.         btn_connectServer_connect.setVisible(false);
  213.         cb_db_avail.setVisible(false);
  214.         cb_show_psw.setVisible(false);
  215.         pf_connectServer_PSW.setVisible(false);
  216.     }
  217.    
  218.    
  219.     /**
  220.      * Diese Methode dient dazu, eine Verbindung zu einem Datenbankserver herzustellen und diese global zu speichern, oder beim einem Fehlschlag den
  221.      * Benutzer darüber zu informieren.
  222.      */
  223.     @FXML protected void connectServer_connect() {
  224.         connection = null;
  225.          ip = tf_connectServer_IP.getText();
  226.          db = tf_connectServer_DB.getText();
  227.          user = tf_connectServer_USER.getText();
  228.          if(pf_connectServer_PSW.getText().isEmpty()) {
  229.          psw = tf_connectServer_PSW.getText();
  230.          }
  231.          else {
  232.              psw = pf_connectServer_PSW.getText();
  233.          }
  234.         try {
  235.             if(cb_db_avail.isSelected()) {
  236.             String url = "jdbc:mysql://"+ip+"/"+db+"?useUnicode=true&characterEncoding=UTF-8" +
  237.                    "&rewriteBatchedStatements=true&useSSL=false";
  238.             connection = DriverManager.getConnection(url, user, psw);
  239.             setConnection(connection);
  240.             setIp(ip);
  241.             setDb(db);
  242.             setUser(user);
  243.             setPsw(psw);
  244.             hide_connectServer_Controlls();
  245.             show_connected_Controlls();
  246.             }
  247.             else {
  248.                 String url = "jdbc:mysql://"+ip+"/"+"?useUnicode=true&characterEncoding=UTF-8" +
  249.                         "&rewriteBatchedStatements=true&useSSL=false";
  250.                 connection = DriverManager.getConnection(url, user, psw);
  251.                 setConnection(connection);
  252.                 setIp(ip);
  253.                 setUser(user);
  254.                 setPsw(psw);
  255.                 hide_connectServer_Controlls();
  256.                 show_connected_Controlls();
  257.             }
  258.            
  259.            
  260.         }
  261.         catch(Exception e) {
  262.             e.printStackTrace();
  263.             Alert alert = new Alert(AlertType.ERROR);
  264.             alert.setHeaderText(null);
  265.             alert.setTitle("Verbindung konnte nicht hergestellt werden.");
  266.             alert.setContentText("Die Verbindung zum Datenbankserver konnte nicht hergestellt werden. Bitte überprüfen Sie ihre Eingaben.");
  267.             alert.showAndWait();
  268.         }
  269.     }
  270.    
  271.     /**
  272.      * Diese Methode dient dazu, dem Benutzer Applikationsnah Veränderungen an dem Datenbankserver vornehmen lassen zu können, wie zum Beispiel das Löschen
  273.      * der Datenbank, mit der man gerade verbunden ist.
  274.      */
  275.     @FXML protected void dropDB() {
  276.         resetConnection();
  277.         try {
  278.        
  279.             Statement stmt = connection.createStatement();
  280.             String sql = "DROP DATABASE "+getDb();
  281.             stmt.executeUpdate(sql);
  282.             writeIntoConsole("Die Datenbank "+getDb()+" wurde erfolgreich gelöscht.");
  283.             l_DB.setText("Datenbank: keine vorhanden ");
  284.             setDb("");
  285.         } catch (SQLException e) {
  286.             writeIntoConsole("Löschen der Datenbank ist fehlgeschlagen! Überprüfen Sie, ob diese existiert!");
  287.             e.printStackTrace();
  288.         }
  289.        
  290.     }
  291.     /**
  292.      * Diese Methode dient dazu, dem Benutzer Applikationsnah Veränderungen an dem Datenbankserver vornehmen lassen zu können, wie zum Beispiel das Löschen der
  293.      * Tabellen branches,accounts,tellers,history.
  294.      *
  295.      */
  296.     @FXML protected void dropTables() throws SQLException {
  297.         Statement stmt;
  298.         Connection conn = getConnection();
  299.         try {
  300.             conn.setAutoCommit(false);
  301.             stmt = connection.createStatement();
  302.             String sql="SET FOREIGN_KEY_CHECKS=0;";
  303.             stmt.executeUpdate(sql);
  304.             sql = "DROP TABLE branches;";
  305.             stmt.executeUpdate(sql);
  306.             sql = "DROP TABLE accounts;";
  307.             stmt.executeUpdate(sql);
  308.             sql = "DROP TABLE tellers;";
  309.             stmt.executeUpdate(sql);
  310.             sql = "DROP TABLE history;";
  311.             stmt.executeUpdate(sql);
  312.             sql = "SET FOREIGN_KEY_CHECKS=1;";
  313.             stmt.executeUpdate(sql);
  314.             conn.commit();
  315.             writeIntoConsole("Die Tabellen branches,accounts,tellers und history wurden erfolgreich gelöscht.");
  316.         }
  317.          catch (SQLException e) {
  318.             writeIntoConsole("Die Tabellen konnten nicht gelöscht werden!");
  319.             e.printStackTrace();
  320.             conn.rollback();
  321.          }
  322.         }
  323.     /**
  324.      * Diese Methode dient dazu, dem Benutzer Applikationsnah Veränderungen an dem Datenbankserver vornehmen lassen zu können, wie zum Beispiel das Erstellen einer Datenbank
  325.      * benchmark_db.
  326.      */
  327.     @FXML protected void createDB() {
  328.         try {
  329.             Statement stmt = connection.createStatement();
  330.             String sql = "CREATE DATABASE benchmark_db";
  331.             stmt.executeUpdate(sql);
  332.             writeIntoConsole("Die Datenbank benchmark_db wurde erfolgreich erstellt.");
  333.             l_DB.setText("Datenbank: benchmark_db");
  334.             setDb("benchmark_db");
  335.         }
  336.         catch(SQLException e) {
  337.             writeIntoConsole("Beim erstellen der Datenbank ist ein Fehler aufgetreten. Überprüfen Sie ob eine Datenbank benchmark_db schon existiert.");
  338.             e.printStackTrace();
  339.         }
  340.     }
  341.     /**
  342.      * Diese Methode dient dazu, dem Benutzer Applikationsnah Veränderungen an dem Datenbankserver vornehmen lassen zu können, wie zum Beispiel das Erstellen der Tabellen
  343.      * branches,accounts,tellers,history.
  344.      */
  345.     @FXML protected void createTables() throws SQLException {
  346.         resetConnection();
  347.         Statement stmt;
  348.         Connection conn = connection;
  349.         try {
  350.             conn.setAutoCommit(false);
  351.             stmt = conn.createStatement();
  352.             String query = "create table branches\r\n" +
  353.                     "( branchid int not null,\r\n" +
  354.                     " branchname char(20) not null,\r\n" +
  355.                     " balance int not null,\r\n" +
  356.                     " address char(72) not null,\r\n" +
  357.                     " primary key (branchid) );";
  358.            
  359.                    stmt.executeUpdate(query);
  360.                    query = "create table accounts\r\n" +
  361.                         "( accid int not null,\r\n" +
  362.                         " name char(20) not null,\r\n" +
  363.                         " balance int not null,\r\n" +
  364.                         "branchid int not null,\r\n" +
  365.                         "address char(68) not null,\r\n" +
  366.                         "primary key (accid),\r\n" +
  367.                         "foreign key (branchid) references branches (branchid))";
  368.                    stmt.executeUpdate(query);
  369.                    query = "create table tellers\r\n" +
  370.                         "( tellerid int not null,\r\n" +
  371.                         " tellername char(20) not null,\r\n" +
  372.                         " balance int not null,\r\n" +
  373.                         " branchid int not null,\r\n" +
  374.                         " address char(68) not null,\r\n" +
  375.                         " primary key (tellerid),\r\n" +
  376.                         " foreign key (branchid) references branches (branchid))";
  377.                    stmt.executeUpdate(query);
  378.                    query = "create table history\r\n" +
  379.                         "( accid int not null,\r\n" +
  380.                         " tellerid int not null,\r\n" +
  381.                         " delta int not null,\r\n" +
  382.                         " branchid int not null,\r\n" +
  383.                         " accbalance int not null,\r\n" +
  384.                         " cmmnt char(30) not null,\r\n" +
  385.                         " foreign key (accid) references accounts (accid),\r\n" +
  386.                         " foreign key (tellerid) references tellers (tellerid),\r\n" +
  387.                         " foreign key (branchid) references branches(branchid)) ";
  388.                    stmt.executeUpdate(query);
  389.             conn.commit();
  390.             writeIntoConsole("Die Tabellen branches,accounts,tellers und history wurden erfolgreich erstellt.");
  391.         }
  392.          catch (SQLException e) {
  393.             writeIntoConsole("Die Tabellen konnten auf Grund eines Fehlers nicht erstellt werden. Überprüfen Sie ob diese nicht schon existieren.");
  394.             e.printStackTrace();
  395.             conn.rollback();
  396.          }
  397.         }
  398.     /**
  399.      * Diese Methode entspricht dem Herz des Programms, denn diese dient dazu die Tabellen mit Daten nach Vorgabe der Aufgabe zu füllen.
  400.      * @throws SQLException
  401.      */
  402.     @FXML protected void insertData() throws SQLException {
  403.         if(tf_get_n.getText().isEmpty()) {
  404.             Alert alert = new Alert(AlertType.ERROR);
  405.             alert.setHeaderText(null);
  406.             alert.setTitle("Geben Sie einen Skalierungsfaktor n an.");
  407.             alert.setContentText("Sie haben keinen Skalierungsfaktor n angegeben! Die Tabellen werden mit Hilfe von einem Skalierungsfaktor n erstellt. Dieser wird benötigt um eine Messung starten zu können.");
  408.             alert.showAndWait();
  409.         }
  410.         else {
  411.             int n = Integer.parseInt(tf_get_n.getText());
  412.             resetConnection();
  413.             Connection conn = getConnection();
  414.             conn.setAutoCommit(false);
  415.             writeIntoConsole("---------------------------------------------------------------------------------------------------------------");
  416.             try {
  417.                 final long timeStart = System.currentTimeMillis();
  418.                 executeSQL_fillBranches(conn, n);
  419.                 executeSQL_fillAccounts(conn, n);
  420.                 executeSQL_fillTellers(conn, n);
  421.                 conn.commit();
  422.                 final long timeEnd = System.currentTimeMillis();
  423.                 final long timeMillis = timeEnd - timeStart;
  424.                 long timeSeconds = TimeUnit.MILLISECONDS.toSeconds(timeMillis);
  425.                 long timeMinutes = TimeUnit.MILLISECONDS.toMinutes(timeMillis);
  426.                 writeIntoConsole("Alle Tabellen wurde mit dem Faktor n = "+n+" erstellt und dies hat "+timeMillis+" Millisekunden, "+timeSeconds+" Sekunden bzw. "+timeMinutes+":"+(timeSeconds%60)+" Minuten gedauert.");
  427.                 long tps = n + n*100000 + n*10;
  428.                 long averageTPS = tps/timeSeconds;
  429.                 writeIntoConsole("Es wurden insgesamt "+tps+" Transaktionen durchgeführt und es wurden durchschnittlich "+averageTPS+" Transaktionen pro Sekunde erreicht.");
  430.                 if(cb_autoclear.isSelected()) {
  431.                 clearTables();
  432.                 }
  433.                
  434.                
  435.            
  436.             } catch (SQLException e) {
  437.                 conn.rollback();
  438.                 writeIntoConsole("Das füllen der Tabellen mit Daten ist fehlgeschlagen!");
  439.                 e.printStackTrace();
  440.             }
  441.            
  442.         }
  443.     }
  444.    
  445.    
  446.     /**
  447.      * Diese Methode füllt die Tabelle Branches mit n beliebigen Tupeln
  448.      * @param n - Parameter für die Anzahl mit der multipliziert werden soll
  449.      * @throws SQLException
  450.      */
  451.    
  452.     protected static void executeSQL_fillBranches(Connection conn, int n) throws SQLException {
  453.         Connection connection = conn;
  454.         try{
  455.            
  456.        
  457.         conn.setAutoCommit(false);
  458.         String query = "Insert INTO branches(branchid,branchname,address,balance) VALUES(?,?,?,?)";
  459.         PreparedStatement ps = conn.prepareStatement(query);
  460.         for(int i = 1; i<=n;i++) {
  461.             ps.setInt(1, i);
  462.             ps.setString(2,"abcdefghijklmnopqrst");
  463.             ps.setString(3, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrst");
  464.             ps.setInt(4, 0);
  465.             ps.addBatch();
  466.            
  467.         }
  468.         ps.executeBatch();
  469.         conn.commit();
  470.         }
  471.         catch(Exception e){
  472.             connection.rollback();
  473.             System.out.println("Es ist ein Fehler beim füllen der Tabelle Branches aufgetreten.");
  474.             e.printStackTrace();
  475.         }
  476.        
  477.     }
  478.     /**
  479.      * Diese Methode füllt die Tabelle Accounts mit n beliebigen Tupeln
  480.      * @param conn - Hier wird die Datenbankverbindung übergeben
  481.      * @param n - Parameter für die Anzahl, mit der multipliziert werden soll
  482.      * @throws SQLException
  483.      */
  484.    
  485.     protected static void executeSQL_fillAccounts(Connection conn, int n) throws SQLException{
  486.         Connection connection = conn;
  487.         SplittableRandom random = new SplittableRandom();
  488.         int count = 0;
  489.         final int batchSize = 10000;
  490.         //final int transactionSize = 100000;
  491.         int zufallsID = 0;
  492.         try{
  493.         conn.setAutoCommit(false);
  494.         String query = "INSERT INTO accounts(accid,name,balance,branchid,address) VALUES(?,?,?,?,?)";
  495.         PreparedStatement ps = conn.prepareStatement(query);
  496.         for(int i = 1;i<=n*100000;i++){
  497.              zufallsID = random.nextInt(0,n)+1;
  498.              ps.setInt(1, i);
  499.              ps.setString(2, "abcdefghijklmnopqrst");
  500.              ps.setInt(3, 0);
  501.              ps.setInt(4, zufallsID);
  502.              ps.setString(5,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnop");
  503.              ps.addBatch();
  504.              ps.clearParameters();
  505.              
  506.              
  507.              // erreicht der Batch eine Größe von 10000 wird diese ausgeführt
  508.              if(i%batchSize == 0) {
  509.                  ps.executeBatch();
  510.                  ps.clearBatch();
  511.              }
  512.            
  513.              /*
  514.              // diese IF-Bedingung sorgt dafür, dass nicht eine große Transaktion mit mehreren Millionen inserts durchgeführt wird, sondern jede transaktion 100.000 inserts beinhaltet
  515.              if(++count % transactionSize == 0 ) {
  516.                  conn.commit();
  517.              }
  518.              */
  519.              
  520.         }
  521.        
  522.         ps.executeBatch();
  523.         conn.commit();
  524.         }
  525.         catch(Exception e){
  526.             connection.rollback();
  527.             System.out.println("Es ist ein Fehler beim füllen der Tabelle Accounts aufgetreten.");
  528.             e.printStackTrace();
  529.         }
  530.        
  531.     }
  532.     /**
  533.      * Diese Methode füllt die Tabelle Tellers mit n beliebigen Tupeln
  534.      * @param conn - Hier wird die Datenbankverbindung übergeben
  535.      * @param n - Parameter für die Anzahl, mit der multipliziert werden soll
  536.      * @throws SQLException
  537.      */
  538.     protected static void executeSQL_fillTellers(Connection conn, int n) throws SQLException{
  539.         Connection connection = conn;
  540.         SplittableRandom random = new SplittableRandom();
  541.         int zufallsID = 0;
  542.         try{
  543.         conn.setAutoCommit(false);
  544.         String query = "INSERT INTO tellers(tellerid,tellername,balance,branchid,address) VALUES(?,?,?,?,?)";
  545.         PreparedStatement ps = conn.prepareStatement(query);
  546.         for(int i = 1;i<=n*10;i++){
  547.             zufallsID = random.nextInt(0,n)+1;
  548.             ps.setInt(1, i);
  549.             ps.setString(2,"abcdefghijklmnopqrst");
  550.             ps.setInt(3, 0);
  551.             ps.setInt(4, zufallsID);
  552.             ps.setString(5, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnop");
  553.    
  554.              ps.addBatch();
  555.         }
  556.         ps.executeBatch();
  557.         conn.commit();
  558.         }
  559.         catch(Exception e){
  560.             connection.rollback();
  561.             System.out.println("Es ist ein Fehler beim füllen der Tabelle Tellers aufgetreten.");
  562.             e.printStackTrace();
  563.         }
  564.     }
  565.    
  566.     /**
  567.      * Diese Methode dient dazu, alle Tabellen nach einem Aufruf von insertData() automatisch zu löschen, vorrausgesetzt der Haken bei
  568.      * der CheckBox ist aktiv.
  569.      * @throws SQLException
  570.      */
  571.     protected void clearTables() throws SQLException {
  572.         resetConnection();
  573.         Connection conn = getConnection();
  574.         try {
  575.             conn.setAutoCommit(false);
  576.             Statement stmt = conn.createStatement();
  577.            
  578.             String sql = "SET FOREIGN_KEY_CHECKS=0;";
  579.             stmt.addBatch(sql);
  580.             stmt.executeBatch();
  581.             sql = "DELETE FROM branches";
  582.             stmt.addBatch(sql);
  583.             sql = "DELETE FROM accounts";
  584.             stmt.addBatch(sql);
  585.             sql = "DELETE FROM tellers";
  586.             stmt.addBatch(sql);
  587.             sql = "DELETE FROM history";
  588.             stmt.addBatch(sql);
  589.             stmt.executeBatch();
  590.             sql = "SET FOREIGN_KEY_CHECKS=1;";
  591.             stmt.addBatch(sql);
  592.             stmt.executeBatch();
  593.             conn.commit();
  594.             writeIntoConsole("Die Tabellen wurden automatisch geleert.");
  595.         } catch (SQLException e) {
  596.             writeIntoConsole("Die Tabellen konnten nicht geleert werden.");
  597.             conn.rollback();
  598.             e.printStackTrace();
  599.         }
  600.        
  601.        
  602.     }
  603.    
  604.     /**
  605.      * Diese Methode dient dazu, eine Verbindung zu erneuern, falls der Benutzer während der Sitzung Tabellen/Datenbanken gelöscht/erstellt hat.
  606.      */
  607.     private void resetConnection()  {
  608.         String url = "jdbc:mysql://"+getIp()+"/"+getDb()+"?useUnicode=true&characterEncoding=UTF-8" +
  609.                "&rewriteBatchedStatements=true&useSSL=false";
  610.         try {
  611.             connection = DriverManager.getConnection(url, user, psw);
  612.         } catch (SQLException e) {
  613.             Alert alert = new Alert(AlertType.ERROR);
  614.             alert.setHeaderText(null);
  615.             alert.setTitle("Verbindung konnte nicht resetet werden.");
  616.             alert.setContentText("Die Verbindung zum Datenbankserver konnte nicht erneuert werden. Das Programm wird nun beendet.");
  617.             alert.showAndWait();
  618.             e.printStackTrace();
  619.             System.exit(1);
  620.         }
  621.         setConnection(connection);
  622.     }
  623.    
  624.     /**
  625.      * Diese Methode entspricht einem Logger, der universal alle Nachrichten in der TextArea console einfügt.
  626.      * @param message - In diesem Parameter muss die Nachricht angegeben werden, die in der Konsole erscheinen soll.
  627.      */
  628.     private void writeIntoConsole(String message) {
  629.         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  630.         String uhrzeit = sdf.format(new Date());
  631.         console.appendText(uhrzeit+" - "+message+"\n");
  632.     }
  633.    
  634.     /**
  635.      * Diese Method dient dazu, bei Bedarf nach mehreren Messungen eine .txt Datei zu erstellen, in der alle Messungen festgehalten werden.
  636.      * @throws IOException
  637.      */
  638.     @FXML
  639.     private void createLog() throws IOException {
  640.         FileWriter fw = null;
  641.         BufferedWriter bw = null;
  642.         String[] console_lines = console.getText().split("\n");
  643.         SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy-HH-mm");
  644.         String date = sdf.format(new Date());
  645.         String path = "/Users/"+System.getProperty("user.name")+"/Desktop/";
  646.         String dirname = "Benchmark_logs";
  647.         String fileName = "dbi_"+date+".txt";
  648.         File file= new File(path + dirname +"/"+fileName);
  649.         File dir = new File(path + dirname);
  650.    
  651.         if(dir.exists()) {
  652.             try {
  653.                 file.createNewFile();
  654.                 fw = new FileWriter(file);
  655.                 bw = new BufferedWriter(fw);
  656.                 for(int i = 1;i<console_lines.length;i++) {
  657.                     bw.write(console_lines[i]);
  658.                     bw.write(System.getProperty("line.separator"));
  659.                 }
  660.                 writeIntoConsole("Es wurde ein .txt erstellt unter "+path+" mit dem Namen "+fileName);
  661.             } catch (IOException e) {
  662.                 Alert alert = new Alert(AlertType.ERROR);
  663.                 alert.setHeaderText(null);
  664.                 alert.setTitle("Log.txt konnte nicht erstellt werden.");
  665.                 alert.setContentText("Das Erstellen der log.txt ist fehlgeschlagen.");
  666.                 alert.showAndWait();
  667.                 e.printStackTrace();
  668.             }
  669.         }
  670.         else {
  671.             dir.mkdir();
  672.             try {
  673.                 file.createNewFile();
  674.                 fw = new FileWriter(file);
  675.                 bw = new BufferedWriter(fw);
  676.                 for(int i = 1;i<console_lines.length;i++) {
  677.                     bw.write(console_lines[i]);
  678.                     bw.write(System.getProperty("line.separator"));
  679.                 }
  680.                 writeIntoConsole("Es wurde ein .txt erstellt unter "+path+" mit dem Namen "+fileName);
  681.             } catch (IOException e) {
  682.                 Alert alert = new Alert(AlertType.ERROR);
  683.                 alert.setHeaderText(null);
  684.                 alert.setTitle("Log.txt konnte nicht erstellt werden.");
  685.                 alert.setContentText("Das Erstellen der log.txt ist fehlgeschlagen.");
  686.                 alert.showAndWait();
  687.                 e.printStackTrace();
  688.             }
  689.            
  690.         }
  691.        
  692.         bw.close();
  693.        
  694.        
  695.     }
  696.     /**
  697.      * Diese Methode lässt beim anklicken das Passwort anzeigen
  698.      */
  699.     @FXML
  700.     protected void show_password() {
  701.         if(cb_show_psw.isSelected()) {
  702.             String psw = pf_connectServer_PSW.getText();
  703.             pf_connectServer_PSW.setVisible(false);
  704.             tf_connectServer_PSW.setVisible(true);
  705.             tf_connectServer_PSW.setText(psw);
  706.         }
  707.         else {
  708.             String psw = tf_connectServer_PSW.getText();
  709.             pf_connectServer_PSW.setVisible(true);
  710.             tf_connectServer_PSW.setVisible(false);
  711.             pf_connectServer_PSW.setText(psw);
  712.         }
  713.     }
  714.    
  715.    
  716.     // Übliche Getter und Setter
  717.    
  718.     public Connection getConnection() {
  719.         return connection;
  720.     }
  721.     public void setConnection(Connection connection) {
  722.         this.connection = connection;
  723.     }
  724.     public String getDb() {
  725.         return db;
  726.     }
  727.     public void setDb(String db) {
  728.         this.db = db;
  729.     }
  730.     public String getUser() {
  731.         return user;
  732.     }
  733.     public void setUser(String user) {
  734.         this.user = user;
  735.     }
  736.     public String getPsw() {
  737.         return psw;
  738.     }
  739.     public void setPsw(String psw) {
  740.         this.psw = psw;
  741.     }
  742.     public String getIp() {
  743.         return ip;
  744.     }
  745.     public void setIp(String ip) {
  746.         this.ip = ip;
  747.     }
  748.     public int getN() {
  749.         return n;
  750.     }
  751.     public void setN(int n) {
  752.         this.n = n;
  753.     }
  754.    
  755.  
  756. }
Add Comment
Please, Sign In to add comment