【问题标题】:C3P0 one server multiple databasesC3P0 一服务器多数据库
【发布时间】:2018-06-03 20:55:00
【问题描述】:

早上好,

正如标题所说,我想创建一个解决方案来使用连接池连接到同一 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();
                }
        }
}

每次连接数据库时,我都会使用特定的连接字符串调用构造函数。

但是,我怀疑这是否是一个有效的解决方案,或者我做错了什么......

附:我正在使用一个没有 Spring 的项目。

非常感谢您的建议,在此先感谢,

您好。

【问题讨论】:

    标签: java mysql connection-pooling c3p0


    【解决方案1】:

    不,这绝对不是一个有效的解决方案。每次要获取连接时,您都在创建一个新的整个连接池。试试这样的。

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

    【讨论】:

    • 正是我需要的,非常感谢!我试过了,效果很好!
    • MiguelPérezMartínez 你能告诉我,现在你是如何在你的代码中调用史蒂夫沃尔德曼解决方案的? ,那么你调用了2次数据源函数?
    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多