MySQL Methodenaufruf mit Connection Übergabe

Dimax

Top Contributor
Guten Tag ,ich habe angefangen Java zu lernen und habe ein paar Fragen.Von erfahrenen Kollegen habe ich ein Hinweis bekommen ,dass :wenn ich eine Methode habe wo Connection gebraucht wird ,besser diese Methode aufrufen und gleich die Connection mitgeben also zmb:
folgende Methode:
Java:
public static String[][] topTenKomplex() throws ClassNotFoundException{
       
        List<String> topTenKomplex=new ArrayList<>();
        List<Double> topTenKomplexWert=new ArrayList<>();
        String [][] statik;
        String topTen="select programm.programm,macro_daten.fm from programm join macro_daten "
                + "on programm.programm_id=macro_daten.programm_id order by macro_daten.fm desc limit 10;";
        String sDbDrv = MYSQLparameter.getDriver();
        String sDbUrl = MYSQLparameter.getURL();
        String sUsr = MYSQLparameter.getUser();
        String sPwd = MYSQLparameter.getPassword();
        Class.forName(sDbDrv);
        try{
             Connection cn=DriverManager.getConnection(sDbUrl, sUsr, sPwd);
            Statement st1=cn.createStatement();
            ResultSet rs1=st1.executeQuery(topTen);
            while(rs1.next()){
                topTenKomplex.add(rs1.getString(1));
                topTenKomplexWert.add(rs1.getDouble(2));
            }statik=new String[topTenKomplex.size()][2];
            for(int i=0;i<statik.length;i++){
                  
                statik[i][0]=topTenKomplex.get(i);
                statik[i][1]=Double.toString(topTenKomplexWert.get(i));        
               
            }
            cn.close();
        }catch(Exception e){e.printStackTrace();statik=new String[topTenKomplex.size()][2];}

        return statik;
    }
wenn ich aber Connection baue auf da ,wo diese Methode aufgerufen wird und leite es an diese Methode weiter wird die so aussehen:
Java:
public static String[][] topTenKomplex(Connection c) {
       
        List<String> topTenKomplex=new ArrayList<>();
        List<Double> topTenKomplexWert=new ArrayList<>();
        String [][] statik;   
        String topTen="select programm.programm,macro_daten.fm from programm join macro_daten "
                + "on programm.programm_id=macro_daten.programm_id order by macro_daten.fm desc limit 10;";
       
        try( Statement st1=c.createStatement();ResultSet rs1=st1.executeQuery(topTen);){                       
           
            while(rs1.next()){
                topTenKomplex.add(rs1.getString(1));
                topTenKomplexWert.add(rs1.getDouble(2));
            }statik=new String[topTenKomplex.size()][2];
            for(int i=0;i<statik.length;i++){
                   
                statik[i][0]=topTenKomplex.get(i);
                statik[i][1]=Double.toString(topTenKomplexWert.get(i));           
               
            }
       
        }catch(Exception e){e.printStackTrace();statik=new String[topTenKomplex.size()][2];}

        return statik;
    }
und es sieht viel besser aus und macht nur das was sie machen soll aber:
ist es in Ordnung wenn die Methode in einer JSP aufgerufen wird und deswegen soll ich die Connection dann halt in jsp aufbauen um an diese Methode weiter zu leiten ,oder gibs Möglichkeit dass umgehen?
 
Habe ein Paar Tagen mich mit Connection Pools beschäftigt. Habe mich für c3PO entschieden .Folgende Klasse ist entstanden:
Java:
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class ComboPoole{
    static String sDbUrl = MYSQLparameter.getURL();
    static String sUsr = MYSQLparameter.getUser();
    static String sPwd = MYSQLparameter.getPassword();
    static String sDrv = MYSQLparameter.getDriver();
    private ComboPooledDataSource cpds;
    private static ComboPoole dataSource;
   
private  ComboPoole() {
   
    cpds = new ComboPooledDataSource();
    try{
        cpds.setDriverClass(sDrv);
    }catch (PropertyVetoException e) {
        e.printStackTrace();
    }
        cpds.setJdbcUrl(sDbUrl);
        cpds.setUser(sUsr);
        cpds.setPassword(sPwd);
       
        Properties prop=new Properties();
        prop.setProperty("user", sUsr);
        prop.setProperty("password", sPwd);
        prop.setProperty("useUnicode", "true");
        prop.setProperty("characterEncoding", "UTF8");
       
        cpds.setProperties(prop);
        cpds.setInitialPoolSize(10);
        cpds.setMaxStatements(180);
        cpds.setMaxStatementsPerConnection(180);
        cpds.setMinPoolSize(10);
        cpds.setAcquireIncrement(10);
        cpds.setMaxPoolSize(60);
        cpds.setMaxIdleTime(30);
        //cpds.setNumHelperThreads(10);
    }
public static ComboPoole getInstance(){
    if(dataSource==null)dataSource=new ComboPoole();
    return dataSource;
}
public Connection getConnection(){
    Connection conn=null;
    try{
        conn=cpds.getConnection();
    }catch(SQLException e){e.printStackTrace();}
    return conn;
}
}

da wo es gebraucht wird ,wird auch aufgerufen:
view.jsp
Code:
html sachen....
<%
Connection cn=ComboPoole.getInstance().getConnection();....
+"<tr><td style=\"text-align:left\"><b>Im Durchschnitt gibt es ( LOC )</b></td><td>"+DBfragen.getAvgLoc(cn)+"</td></tr>"
+"<tr><td style=\"text-align:left\"><b>Das Programm "+DBfragen.maxiLoc(cn).getFirst()+" ist am längsten( LOC ) </b></td><td>"+DBfragen.maxiLoc(cn).getSecond()+"</td></tr>"......cn.close();
DBfragen.java
und die Methode die Daten liefert
Java:
public static DBfragen<String, Double> maxKomplex(Connection cn)throws SQLException{
               
                Statement st = cn.createStatement();
                ResultSet rs=null;
                rs = st.executeQuery(getFm);
                if (rs.next()) {
                    DBfragen<String,Double> maxFm =new DBfragen<String,Double>(rs.getString(1),rs.getDouble(2));           
                   
                    return maxFm;
                } else {
                    DBfragen<String,Double> maxFm =new DBfragen<String,Double>("Keine gespeichert",0.0);
                     return maxFm;
                }   
            }
Dazu habe ich 2 Fragen-
1.Habe ich alles richtig verstanden mit Connection Pools?
2.Wie geht es weiter,wie in der Antwort von mrBrown steht,muss ich jetzt das alles noch kapseln,habe die 2 Patterns angeschaut.Mehrere empfehlen den Repository statt DOA zu nutzen.Ein Paar Links wo es gut erklärt ist?
 
da wo es gebraucht wird ,wird auch aufgerufen:
view.jsp
Ich weiß, wir wiederholen uns: aber lass doch den Java-Code aus den JSPs raus.

1.Habe ich alles richtig verstanden mit Connection Pools?
Jain. Lass als erstes mal static da weg.

Welchen Container benutzt du?

2.Wie geht es weiter,wie in der Antwort von mrBrown steht,muss ich jetzt das alles noch kapseln,habe die 2 Patterns angeschaut.Mehrere empfehlen den Repository statt DOA zu nutzen.Ein Paar Links wo es gut erklärt ist?

Einfach mal kurz Google benutzen 😉
DAO: https://www.oracle.com/technetwork/java/dataaccessobject-138824.html
Repository: https://medium.com/@pererikbergman/repository-design-pattern-e28c0f3e4a30

Als Literatur-Empfehlung: Design Patterns. Elements of Reusable Object-Oriented Software und domain driven design.
 
Wieder so ein Beispiel wo etwas, das jeder kennt und benutzt, nämlich ein Singleton, einen neuen wichtige Namen bekommt damit sich irgendein theoretischer Informatiker eine tolle neue Idee zuschreiben lassen kann und ein Programmierer keine Ahnung hat was mit ConnectionPool gemeint ist, wenn er nicht seine Zeit verschwendet und sich das durchliest.....
 
Lass Methodenaufrufe in JSP nach Möglichkeit sein.
Das ist mir klar,deswegen versuche ich das mit Repository zu lösen. Was ich nicht verstehe,wie kann ich eine Tabelle in JSP bauen wenn ich keine Daten habe die mir Java Methode liefert,oder wie kriege ich die ohne Methodenaufrufe?
Das ist die Tabelle wo ich die Daten rein setze(Foto).
Lass als erstes mal static da weg.
public static ComboPoole <- diesen?
Welchen Container benutzt du?
Ich benutze keine EJB ,fange erst mal klein an.
 

Anhänge

  • tab.png
    tab.png
    41,2 KB · Aufrufe: 34
Wieder so ein Beispiel wo etwas, das jeder kennt und benutzt, nämlich ein Singleton, einen neuen wichtige Namen bekommt damit sich irgendein theoretischer Informatiker eine tolle neue Idee zuschreiben lassen kann und ein Programmierer keine Ahnung hat was mit ConnectionPool gemeint ist, wenn er nicht seine Zeit verschwendet und sich das durchliest.....
"Zeit verschwenden" und mal durchlesen, was das beides überhaupt ist, wäre dir offensichtlich wirklich mal anzuraten.

Der "neue Name" ist älter als zwanzig Jahre und hat mit dem "Beispiel was jeder kennt und benutzt" absolut nichts zu tun.
Singleton und ConnectionPool sind völlig unterschiedliche Dinge, die völlig unterschiedliche Probleme auf völlig unterschiedlich Art und Weise lösen.
Jeder, der nicht grad völliger Neueinsteiger ist, sollte beides kennen.


Aber Hauptsache mal wieder aufgeregt über Dinge, von denen man keine Ahnung hat...

(Theoretische Informatiker sind übrigens die, die mit sowas am wenigsten zu tun haben)
 
Das ist mir klar,deswegen versuche ich das mit Repository zu lösen. Was ich nicht verstehe,wie kann ich eine Tabelle in JSP bauen wenn ich keine Daten habe die mir Java Methode liefert,oder wie kriege ich die ohne Methodenaufrufe?
Das ist die Tabelle wo ich die Daten rein setze(Foto).
In dem du das in sinnvollen Beans kapselst, zB hier grob beschreiben: http://openbook.rheinwerk-verlag.de...23_006.htm#mj07bda1db155e5cd6868a66e794cf4822


public static ComboPoole <- diesen?
Das ist das einzige static, welches man mit viel wohlwollen lassen könnte.
Viel wichtiger sind alle anderen statics (in deinem gesamten Programm).

Ich benutze keine EJB ,fange erst mal klein an.
Mit Container meinte ich den Server, oder startest du das einfach per main? (und selbst dann, welches Framework?)
 
Mit Container meinte ich den Server
Tomcat v8.5
Viel wichtiger sind alle anderen statics
Java:
    String sDbUrl = MYSQLparameter.getURL();
    String sUsr = MYSQLparameter.getUser();
    String sPwd = MYSQLparameter.getPassword();
    String sDrv = MYSQLparameter.getDriver();
weg.Danke dir mrBrown für die Tipps. Erstmal schaue Repository dann komme zu JBeans rüber,bis dahin lasse ich Methoden in jsp.
 

Zurück
Oben