C3P0配置多个数据库的有关问题
C3P0配置多个数据库的问题
希望有人能解答:
C3P0配置文件内容如下:
JDBC代码如下:
问题:
1、我在C3P0的配置中,并没有指定具体的数据库名称:
没有指定的是:
<property name="jdbcUrl">jdbc:mysql://localhost:3306/</property>
指定的是:
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mysql</property>
结果,测试“没有指定”的配置文件,通过测试代码,仍然获得了connection,为什么?
测试代码:
输出结果:com.mchange.v2.c3p0.impl.NewProxyConnection@19eda2c,这是问题一,为什么?
问题二、我想要实现:每一个用户登录后,能够访问自己登录的用户名对应的数据库,为了实现这一点,我才让C3P0的配置文件没有指定。用下面的代码实现:
如果按这个办法做的话,本地测试是实现了根据用户名来决定访问哪个数据库,但是问题就是:如果这样子做的话,那第一个用户访问的connection还没有结束,第二个用户也到数据源里面取connection,那样的话,就会修改数据源的指向,很显然,这里的Conection就混乱了。
请问,有什么办法能实现每个用户独立访问他自己对应的数据库,我想过新建数据源的办法,但是那样的资源消耗是不可能的。所以求教。
自学新手烦恼,大神,高手勿闲问题太差劲。谢谢
------解决方案--------------------
你先建一个这样的properties文件,里面的内容如下(将你的数据库配置信息写到这里面)
然后在数据库配置文件中通过以下方式进行引用,这样你不需要去更改数据库配置文件,只需要改一下properties文件就行了,对于不同的数据库这样处理比较好。
说句实话,C3P0不好用。
------解决方案--------------------
问题一: connection 是指数据库的连接,你连接数据库的时候是不是也有n种方式,以mysql为例
mysql -uroot -pxxx #不指定数据库的
mysql -uroot -pxxx dbname #指定数据库的
问题二:改一下获取DataSource的类
配置文件也有少许改变,注意named-config 的name 和 property的 jdbcUrl
希望有人能解答:
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>();
public static DataSource getDataSource(String username) {
#这里忽略数据安全的问题,可以自己加锁实现dsList的数据安全
ds = dsList.get(username);
if (ds == null){
ds = new ComboPooledDataSource(username);
dsList.put(username,ds);
}
return ds;
}
配置文件也有少许改变,注意named-config 的name 和 property的 jdbcUrl
<named-config name="user1">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/user1</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>
<named-config name="user2">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/user2</property>