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()
释放线程和与之关联的 Connection
s。
我是运行一个涉及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()
释放线程和与之关联的 Connection
s。