c3p0 连接池无法更改数据库

c3p0 connection pool cannot change database

我是运行一个涉及3个数据库的网络应用程序 第一个数据库是管理数据库,另外两个数据库用于两个独立的机构, 这意味着两个机构都在使用相同的应用程序,但可以根据输入的 unique_code 访问其单独的数据库。 数据库是启动器(管理数据库)、company1 和 company2。

当 Web 应用程序启动时,管理数据库最初会自动连接。 (启动数据库)。 (第一个连接池)代码如下:完美运行。

comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql://host.com/starter");
comboPooledDataSource.setUser("username");
comboPooledDataSource.setPassword("password");                       
comboPooledDataSource.setMinPoolSize(2);
comboPooledDataSource.setMaxPoolSize(3000);
comboPooledDataSource.setAcquireIncrement(1);
comboPooledDataSource.setMaxIdleTime(1800);
comboPooledDataSource.setMaxStatements(0);
comboPooledDataSource.setIdleConnectionTestPeriod(3);
comboPooledDataSource.setBreakAfterAcquireFailure(false);
comboPooledDataSource.setUnreturnedConnectionTimeout(5);

并且用户必须在主页的文本字段中输入代码(如登录)。 如果代码存在于起始数据库中,则连接到与代码相关的数据库,用户可以从该数据库中查看其内容。

//获取数据库名称的代码写在下面:这也成功

String entry_code=request.getParameter("Ecode");
 //where 'Ecode' is the name of the html textfield where the user types the code
 try{
 con=Main_C3Po_Connection.getInstance().getConnection();
 String sql="select db from checker where code='"+entry_code+"'";
 pst=con.prepareStatement(sql);
 rs=pst.executeQuery();
 if(rs.next()){
get_db=rs.getString("db");
 }
 
 }catch(SQLException e){
 out.println(e);
 }

例如:初学者(管理数据库) table 姓名:检查员
编号 |代码 | db |
11 | 44 |公司 1 |
12 | 35 |公司 2 |

所以第二个连接池没有固定的数据库url,而是一个可变的数据库名称。

eg:("jdbc:mysql://host.com/"+get_db+"?autoReconnect=true&useUnicode=yes");

其中 get_db 是变量名。
因此,当用户输入代码 44 时,与输入代码相关的 db 列中的值为 (company1),然后将其放入 get_db 变量中并连接数据库可以访问。

当输入第一个代码 (44) 时,'company1' 值被放入 'get_db ' 变量,连接成功。

但问题是在注销并输入第二个代码 (35) 后,'company2' 值也被放入 'get_db' 变量 BUT 由于某种原因,连接池仍然保持以前的数据库连接,无法切换到所选的其他数据库
下面是第二个无法切换到不同数据库的连接池,尽管数据库变量已更改:

comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql://host.com/"+get_db+"?autoReconnect=true&useUnicode=yes");
comboPooledDataSource.setUser("username");
comboPooledDataSource.setPassword("password");
comboPooledDataSource.setMinPoolSize(2);
comboPooledDataSource.setMaxPoolSize(3000);
comboPooledDataSource.setAcquireIncrement(1);
comboPooledDataSource.setMaxIdleTime(1800);
comboPooledDataSource.setMaxStatements(0);
comboPooledDataSource.setIdleConnectionTestPeriod(5);
comboPooledDataSource.setBreakAfterAcquireFailure(false);
comboPooledDataSource.setUnreturnedConnectionTimeout(5);

请问我如何配置第二个连接池以在注销后终止所有连接,以便它可以**切换**并访问所选的任何其他数据库。谢谢你。

这是一个笨拙的配置;我不推荐它。但它应该工作。打电话的行为

comboPooledDataSource.setJdbcUrl("jdbc:mysql://host.com/"+get_db+"?autoReconnect=true&useUnicode=yes");

应该会导致“软重置”,因此您从池中获得的任何新 Connection 都将进入新数据库。您确定您没有还在使用旧的 Connection 吗?也就是说,您确定 close() 更改之前的所有 Connection 个对象吗?

一种不那么尴尬的方法就是创建多个 Connection 池,一个用于您需要访问的每个数据库。使用完 Connection 池后,通过调用池本身的 close() 释放线程和与之关联的 Connections。