2017-08-26 52 views
1

我是Java和我的任務之一的初學者。我必須做數據庫操作。我有這個Java代碼插入數據到數據庫,它工作正常。Java數據庫最大限度地減少連接創建

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 
} 

我的問題是每次代碼運行時,我的代碼必須創建一個數據庫連接,並準備發言的對象,並按照我的理解這是一個代價高昂的操作。

有什麼辦法可以保持與數據庫的單一連接並使用它來執行我的數據庫工作?

+1

谷歌「jdbc連接池」 – Ramanlfc

+0

感謝您的回答。將看看:) –

+4

創建連接的成本是相對的,對於像學生作業這樣的「玩具」項目來說,考慮並不重要。完全不同的主題:加載'org.gjt.mm.mysql.Driver'實際上已經超過15年了,MySQL驅動程序類多年來一直稱爲'com.mysql.jdbc.Driver'(org.gjt .mm.mysql.Driver'只保留用於向後兼容)。 –

回答

2

您可以使用設計模式辛格爾頓連接這樣的:

1 - 創建一個類SingletonConnection.java樣子說:

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; 
    } 


} 

而在你的其他類調用它像:

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

謝謝你的回答。我是相當新的Java,所以不得不學習設計模式。經過一番搜索,似乎這種方法解決了我的問題。再次感謝:) –

+1

如果 - 如@ranmini的評論所示 - 這是針對Web應用程序的,那麼這是一個非常糟糕的主意。它會引入各種競爭條件,交易隔離錯誤等。不要這樣做。 –

+0

@MarkRotteveel如果是這樣,你能讓我知道你的建議嗎?我不需要代碼,只是一個如何做到這一點的概述。即使外部資源也足夠了:) –

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 
     } 
    } 

你可以這樣做。

一次初始化數據庫連接並將連接保存在您需要時調用的對象中。

編輯: 例如,當你需要在另一個類連接:

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

謝謝你的回答:)如果我們在課堂上編碼,它會有所幫助。如果我們想在課堂之外建立聯繫怎麼辦?有關於此的任何想法? –

+0

只需將main()方法放入您需要的類中,並如昨天所示使用。也許你需要一個全局變量。 在答案中查看我的編輯。:) – user6266369

+0

感謝您的修改的答案,以及:) –

相關問題