2013-12-18 4 views
0

Я написал класс Java для запуска запросов MS Sql внутри моей программы. Эта программа создает новое соединение для каждого запроса, который должен быть запущен. Я знаю, что это может увеличить мою задержку. Вот код Calss:запрос выполняется с использованием JDBC

import java.sql.*; 

public abstract class DatabaseManager { 

    public static ResultSet executeQuery(String SQL, String dbName) 
    { 
     ResultSet rset = null ; 
     try { 
       Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
       String connectionUrl = "jdbc:sqlserver://localhost:1433;" + 
        "databaseName="+dbName+";user=??;password=??;"; 
       Connection con = DriverManager.getConnection(connectionUrl); 
       Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 
       rset = st.executeQuery(SQL); 
       //st.close(); 
     } 
     catch (ClassNotFoundException e) {} 
     catch (SQLException e) {} 
     return rset; 
    } 

    public static void executeUpdate(String SQL, String dbName) 
    { 
     try { 
       Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
       String connectionUrl = "jdbc:sqlserver://localhost:1433;" + 
        "databaseName="+dbName+";user=??;password=??;"; 
       Connection con = DriverManager.getConnection(connectionUrl); 
       Statement st = con.createStatement(); 
       st.executeUpdate(SQL); 
       st.close(); 
       con.close(); 
     } 
     catch (ClassNotFoundException e) {System.out.println(e);} 
     catch (SQLException e) {System.out.println(e);} 
    } 
} 

Как можно изменить таким образом, что только одно соединение создается и все мои запросы по маршруту Повсеместно этой связи? С уважением.

+0

Использование синглтон шаблон – SpringLearner

+1

Выполните соединение одноэлементно в вашем классе? В самом деле, вы должны изучить варианты объединения (например, C3PO), который также предоставляет тесты на заимствование и другие аккуратные вещи. –

+0

Это может быть полезно вам http://rdeshapriya.com/a-singleton-java-class-for-mysql-db-connection/ – SpringLearner

ответ

0

Вы должны реализовать singleton pattern, чтобы получить один экземпляр класса, который обрабатывает весь ваш запрос. Вот пример Connect to Database with JDBC, Singleton

+0

Другой вариант - автоподключение JDBCConnection через Spring. В этом случае вы также повторно используете одно и то же соединение ... –

4

Я прошу отличить, я бы не объявлял соединение с базой данных как одноэлементное. Обычный подход заключается в кэшировании пула подключений к управляемой базе данных. Преимущества здесь:

  • Более одновременный доступ к базе данных
  • Managed удаление ресурсов базы данных (пул соединений усадка при необходимости)

Посмотрите на этот

http://en.wikipedia.org/wiki/Connection_pool

Обычные варианты осуществления: http://sourceforge.net/projects/c3p0/ http://commons.apache.org/proper/commons-dbcp/

При развертывании приложений в коммерческом сервере приложений, таких как Websphere или Weblogic, они приходят с поддержкой вне из коробки для соединений с базами данных

+0

Какая для вас лучшая реализация? –

+0

Это зависит от вашей среды. По моему опыту, я использовал пул соединений с базой данных, который мне дали сервер приложений, но когда у меня было программное обеспечение, поставляемое провайдерами, они были вполне довольны DBCP. –

+0

Я узнал, что MS SQL Server поддерживает объединение пулов изнутри. У вас есть информация, как я могу это использовать? –

1

Вы должны реализовать Singleton шаблон. Это похоже на ниже:

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

public class DBConnection { 
    private static Connection connection = null; 
    private static Class driver; 
    public static void loadDriver() throws ClassNotFoundException{ 
     driver = Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
    } 
    /** 
    * Check for some connection 
    * @return true, eсли установленно; false в противном случае 
    */ 
    public static boolean isConnection(){ 
     if (connection != null) return true; 
     return false; 
    } 
    /** 
    * Return connection 
    */ 
    public static synchronized Connection getConnection(String url, 
      String user, String pass) throws SQLException{ 
     //Create connections if we have't work connection. 
     if (connection == null || connection.isClosed()) { 
      connection = DriverManager.getConnection(url, user, pass); //Next string show use without parameters 
      //connecction = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;" + 
       "databaseName="+dbName+";user=??;password=??;";); 
      connection.setAutoCommit(false); 
     } 
     return connection; 
    } 
} 

Вы можете использовать его:

try{ 
     DBConnection.loadDriver(); 
     conn = DBConnection.getConnection(dburl, dbuser, dbpass); 
//get Prepared statement and Result set. You cam create many anstances from one connections. 
     PreparedStatement ps = null; ResultSet rs = null; 
     ps = conn.prepareStatement("Some query"); 
     rs = ps.executeQuery(); 
} catch (SQLException sqlex) {System.out.println("SQL problem");} 
finally{ //You can close all connections 
     rs.close(); 
     ps.close(); 
     //Close DB connections before terminate code. 
     conn.close() 
} 
+0

Большое спасибо. –

+0

@Alin См. Обновление –

+2

Это только решение, если нет многопоточности, и это не проблема, если соединение истекает и ломается. В противном случае: используйте пул соединений и откройте соединение, когда это необходимо, и закройте его, когда закончите единицу работы. –

Смежные вопросы