2015-08-18 5 views
-1

Я создаю класс «DataSourceConnection», следуя шаблону Singleton, но я хочу подключиться к мульти-базе данных, поэтому я пишу «getDataSource (String driver, String url, String username, String password)», которая вернет переменную BasicDataSource. Я сохраняю эту переменную в атрибуте ServletContext, и когда мне нужно подключиться к какой базе данных я беру ее из ServletContext. Должен ли я попытаться использовать это решение?Уменьшится ли производительность моего веб-приложения, если я попробую этот код?

import java.io.Serializable; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import javax.sql.DataSource; 

import org.apache.commons.dbcp2.BasicDataSource; 

public class DataSourceConnection implements Cloneable, Serializable { 

    private static final long serialVersionUID = 1L; 

    private BasicDataSource dataSource; 

    private static class DataSourceConnectionHolder { 
     private static DataSourceConnection INSTANCE = new CustomerDataSourceConnection(); 
    } 

    protected Object clone() throws CloneNotSupportedException { 
     return new CloneNotSupportedException(); 
    } 

    private DataSourceConnection() { 
    } 

    public static DataSourceConnection getInstance() { 
     return DataSourceConnectionHolder.INSTANCE; 
    } 

    public DataSource getDataSource(String driver, String url, String username, String password) { 
     dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(driver); 
     dataSource.setUsername(username); 
     dataSource.setPassword(password); 
     return dataSource; 
    } 

    public Connection getConnection() throws SQLException { 
     return dataSource.getConnection(); 
    } 
} 
+0

Предлагаю вам просмотреть его и посмотреть. Если вы сделали это недавно, может быть любое количество вещей, которые намного важнее, чем то, что вы смотрите здесь. –

+0

Спасибо, Питер, я пытаюсь. –

+0

Если вы не измеряете, вы догадываетесь. Даже эксперты в области оптимизации кода часто ошибаются, когда они пытаются угадать, поэтому единственный способ - это дать некоторую оценку, чтобы дать вам подсказку. –

ответ

0

Цель одноплодного шаблона в этом контексте был бы создать только одно подключение к базе данных (которая является медленной операцией), и использовать это соединение в вашем коде.

Поскольку вы хотите подключиться к нескольким базам данных, вам понадобится «singleton» для каждой базы данных. Вы не должны реализовывать несколько классов для этого, просто один класс с несколькими статическими «совместными» соединениями.

Это getConnection(), это медленно, если только DataSource не поддерживает пул соединений.

Обновлены например

public final class DataSourceConnection { 
    // This defines an instance of the class 
    private BasicDataSource dataSource; 
    private DataSourceConnection(String driver, String url, String username, String password) { 
     this.dataSource = new BasicDataSource(); 
     this.dataSource.setDriverClassName(driver); 
     this.dataSource.setUrl(url); 
     this.dataSource.setUsername(username); 
     this.dataSource.setPassword(password); 
    } 
    public Connection getConnection() throws SQLException { 
     return this.dataSource.getConnection(); 
    } 
    // This defines the "shared"/"multiple singleton" instances 
    public static final DataSourceConnection DATABASE1 = new DataSourceConnection("...", "...", "...", "..."); 
    public static final DataSourceConnection DATABASE2 = new DataSourceConnection("...", "...", "...", "..."); 
    public static final DataSourceConnection DATABASE3 = new DataSourceConnection("...", "...", "...", "..."); 
} 

И вы бы использовать его как это:

try (Connection conn = DataSourceConnection.DATABASE2.getConnection()) { 
    // Access database #2 here 
} 

Конечно, на самом деле, вы хотите инициализацию ваших 3 Источники данных, чтобы быть основанный на некотором файле конфигурации, чтобы не быть жестко запрограммированным, как показано.

+0

Я не понимаю, когда вы говорите: «Один класс с несколькими статическими« совместными »подключениями. Можете ли вы объяснить это кодом? –

+0

Спасибо, Андреас. –

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

  • Нет связанных вопросов^_^