Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C3P0一台服务器多个数据库_Java_Mysql_Connection Pooling_C3p0 - Fatal编程技术网

Java C3P0一台服务器多个数据库

Java C3P0一台服务器多个数据库,java,mysql,connection-pooling,c3p0,Java,Mysql,Connection Pooling,C3p0,早上好 正如标题所说,我想创建一个解决方案,使用连接池连接到同一Mysql服务器上的不同数据库。我遵循了以下帖子中指出的步骤: 我的解决办法是: public class DatabaseUtility { public static ComboPooledDataSource getDataSource(String db, String user, String pass) throws PropertyVetoException {

早上好

正如标题所说,我想创建一个解决方案,使用连接池连接到同一Mysql服务器上的不同数据库。我遵循了以下帖子中指出的步骤:

我的解决办法是:

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的项目

谢谢你的建议,提前谢谢


您好。

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

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;
}
私有静态ComboPooledDataSource createDataSource(字符串数据库、字符串用户、字符串传递){
ComboPooledDataSource cpds=新ComboPooledDataSource();
setJdbcUrl(“jdbc:mysql://X.X.X.X:3306/“+db);
设置用户(用户);
设置密码(pass);
//可选设置
设置初始池大小(5);
设置最小池大小(5);
cpds.setAcquireIncrement(5);
设置最大池大小(20);
cpds.setMaxStatements(100);
返回CPD;
}
私有静态最终类DbUserPassword{
最终字符串db;
最终字符串用户;
最终字符串密码;
DbUserPassword(字符串数据库、字符串用户、字符串密码){
这个.db=db;
this.user=用户;
this.password=密码;
}
@凌驾
公共布尔等于(对象o){
if(o DbUserPassword的instanceof){
DbUserPassword,它=(DbUserPassword)o;
返回(this.db.equals(that.db)&&this.user.equals(that.user)&&this.password.equals(that.password));
}
否则{
返回false;
}
}
@凌驾
公共int hashCode(){
返回db.hashCode()^user.hashCode()^password.hashCode();
}
}
//MT:受类“锁”保护
私有静态HashMap poolMap=新HashMap();
公共静态同步ComboPooledDataSource getDataSource(字符串数据库、字符串用户、字符串传递){
DbUserPassword dbup=新的DbUserPassword(db,user,pass);
ComboPooledDataSource out=poolMap.get(dbup);
if(out==null){
out=createDataSource(数据库、用户、过程);
poolMap.put(dbup,out);
}
返回;
}

这正是我需要的,非常感谢!我试过了,效果很好!MiguelPérezMartínez您能告诉我,现在您在代码中如何调用上面的Steve Waldman解决方案吗,那么调用数据源函数两次?