你先建一个这样的properties文件,里面的内容如下(将你的数据库配置信息写到这里面)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.user=scott
jdbc.password=tiger
然后在数据库配置文件中通过以下方式进行引用,这样你不需要去更改数据库配置文件,只需要改一下properties文件就行了,对于不同的数据库这样处理比较好。
说句实话,C3P0不好用。
调试欢乐多
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>
<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>
你要去看看ThreadLocal 这个类,线程安全的。
他的一个set,get都是获取当前的线程
你的要明白一点,hibernate是最后开始操作对象(save、update..)的时候才去获取DataSource的