C3P0 один сервер несколько баз данных

0

Доброе утро,

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

https://stackoverflow.com/questions/26785842/multiple-data-sources-for-c3p0

Мое решение таково:

public class DatabaseUtility
{
        public static ComboPooledDataSource getDataSource(String db, String user, String pass) throws PropertyVetoException
        {
                ComboPooledDataSource cpds = new ComboPooledDataSource();
                cpds.setJdbcUrl("jdbc:mysql://X.X.X.X:3306/"+db);
                cpds.setUser(user);
                cpds.setPassword(pass);

                // Optional Settings
                cpds.setInitialPoolSize(5);
                cpds.setMinPoolSize(5);
                cpds.setAcquireIncrement(5);
                cpds.setMaxPoolSize(20);
                cpds.setMaxStatements(100);

                return cpds;
        }

        public static void main(String[] args) throws SQLException
        {
                Connection connection = null;
                PreparedStatement pstmt = null;
                ResultSet resultSet = null;
                try
                {
                        //QUERY to DATABASE 1
                        ComboPooledDataSource dataSource = DatabaseUtility.getDataSource("bd1", "user1", "pass1");
                        connection = dataSource.getConnection();
                        pstmt = connection.prepareStatement("SELECT * FROM municipio");

                        System.out.println("The Connection Object is of Class: " + connection.getClass());

                        resultSet = pstmt.executeQuery();
                        while (resultSet.next())
                        {
                                System.out.println(resultSet.getString(1) + "," + resultSet.getString(2) + "," + resultSet.getString(3));
                        }


                        //QUERY to DATABASE 2
                        dataSource = DatabaseUtility.getDataSource("bd2", "user2", "pass2");
                        connection = dataSource.getConnection();
                        pstmt = connection.prepareStatement("SELECT * FROM alojamiento");

                        System.out.println("The Connection Object is of Class: " + connection.getClass());

                        resultSet = pstmt.executeQuery();
                        while (resultSet.next())
                        {
                                System.out.println(resultSet.getString(1) + "," + resultSet.getString(2) + "," + resultSet.getString(3));
                        }

                }
                catch (Exception e)
                {
                        connection.rollback();
                        e.printStackTrace();
                }
        }
}

Каждый раз, когда я подключаюсь к базе данных, я вызываю конструктор с конкретной строкой соединения.

Тем не менее, я сомневаюсь, что это эффективное решение, или я делаю что-то неправильно...

PS Я использую проект без весны.

Я был бы признателен за ваш совет, спасибо заранее,

Привет.

Теги:
connection-pooling
c3p0

1 ответ

2
Лучший ответ

Нет, это определенно не эффективное решение. Каждый раз, когда вы хотите захватить соединение, вы создаете новый пул соединений. Попробуйте что-то вроде этого.

private static ComboPooledDataSource createDataSource(String db, String user, String pass) {
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setJdbcUrl("jdbc:mysql://X.X.X.X:3306/"+db);
    cpds.setUser(user);
    cpds.setPassword(pass);

    // Optional Settings
    cpds.setInitialPoolSize(5);
    cpds.setMinPoolSize(5);
    cpds.setAcquireIncrement(5);
    cpds.setMaxPoolSize(20);
    cpds.setMaxStatements(100);

    return cpds;
}

private static final class DbUserPassword {
    final String db;
    final String user;
    final String password;

    DbUserPassword( String db, String user, String password ) {
        this.db = db;
        this.user = user;
        this.password = password;
    }

    @Override
    public boolean equals( Object o ) {
        if ( o instanceof DbUserPassword ) {
            DbUserPassword that = (DbUserPassword) o;
            return ( this.db.equals( that.db ) && this.user.equals( that.user ) && this.password.equals( that.password ) );
        }
        else {
            return false;
        }
}

    @Override
    public int hashCode() {
        return db.hashCode() ^ user.hashCode() ^ password.hashCode();
    }

}

// MT: protected by class' lock
private static HashMap<DbUserPassword,ComboPooledDataSource> poolMap = new HashMap<>();

public static synchronized ComboPooledDataSource getDataSource(String db, String user, String pass) {
    DbUserPassword dbup = new DbUserPassword( db, user, pass );
    ComboPooledDataSource out = poolMap.get(dbup);
    if ( out == null ) {
        out = createDataSource( db, user, pass );
        poolMap.put( dbup, out );
    }
    return out;
}
  • 0
    Это именно то, что мне было нужно, большое спасибо! Я пробовал, и это работает отлично!
  • 0
    MiguelPérezMartínez, пожалуйста, дайте мне знать, как теперь вы используете решение Стив Уолдмана в своем коде? 2 раза вы вызываете функцию источника данных?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню