日期:2014-05-18  浏览次数:20632 次

C3P0配置多个数据库的问题
希望有人能解答:
C3P0配置文件内容如下:

<named-config name="user">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/</property>
<property name="user">root</property>
<property name="password"></property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</named-config>


JDBC代码如下:


private static ComboPooledDataSource ds=null;
static 
{
ds=new ComboPooledDataSource("user");
}

public static DataSource getDataSource() {
return ds;
}

public static Connection getConnection() throws SQLException
{
return ds.getConnection();
}




问题:
1、我在C3P0的配置中,并没有指定具体的数据库名称:
没有指定的是:
<property name="jdbcUrl">jdbc:mysql://localhost:3306/</property>
指定的是:
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mysql</property>


结果,测试“没有指定”的配置文件,通过测试代码,仍然获得了connection,为什么?
测试代码:

public void test_UserDao_impl_find3() throws Exception
{
Connection c1=JdbcUtils.getConnection();
if(c1==null)
{
System.out.println("没拿到!");
}
System.out.println(c1);
}

输出结果:com.mchange.v2.c3p0.impl.NewProxyConnection@19eda2c,这是问题一,为什么?

问题二、我想要实现:每一个用户登录后,能够访问自己登录的用户名对应的数据库,为了实现这一点,我才让C3P0的配置文件没有指定。用下面的代码实现:

static 
{
ds=new ComboPooledDataSource("user");
}

public static DataSource getDataSource(String username) {
String url="jdbc:mysql://localhost:3306/"+username;
ds.setJdbcUrl(url);
return ds;
}


如果按这个办法做的话,本地测试是实现了根据用户名来决定访问哪个数据库,但是问题就是:如果这样子做的话,那第一个用户访问的connection还没有结束,第二个用户也到数据源里面取connection,那样的话,就会修改数据源的指向,很显然,这里的Conection就混乱了。

请问,有什么办法能实现每个用户独立访问他自己对应的数据库,我想过新建数据源的办法,但是那样的资源消耗是不可能的。所以求教。


自学新手烦恼,大神,高手勿闲问题太差劲。谢谢

------解决方案--------------------

你先建一个这样的properties文件,里面的内容如下(将你的数据库配置信息写到这里面)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.user=scott
jdbc.password=tiger

然后在数据库配置文件中通过以下方式进行引用,这样你不需要去更改数据库配置文件,只需要改一下properties文件就行了,对于不同的数据库这样处理比较好。
说句实话,C3P0不好用。

------解决方案--------------------
问题一: connection 是指数据库的连接,你连接数据库的时候是不是也有n种方式,以mysql为例
        mysql -uroot -pxxx               #不指定数据库的
        mysql -uroot -pxxx dbname        #指定数据库的
问题二:改一下获取DataSource的类


    #这里使用的是map,不同用户可以取到不同的datasource
    private static Map<String,ComboPooledDataSource> dsList=new HashMap<String,ComboPooledDataSource>();