Sql server 重置JDBC连接状态(c3p0)
将C3P0托管连接重置为初始状态的建议方法是什么 我正在使用Microsoft JDBC驱动程序,并在一个连接上设置Sql server 重置JDBC连接状态(c3p0),sql-server,jdbc,c3p0,Sql Server,Jdbc,C3p0,将C3P0托管连接重置为初始状态的建议方法是什么 我正在使用Microsoft JDBC驱动程序,并在一个连接上设置SET ROWCOUNT 1。这会导致该连接执行的所有查询仅返回一行,即使在该连接已返回到池并稍后再次获取之后也是如此。我应该显式地重置值onCheckin还是onCheckout 主类 import com.mchange.v2.c3p0.ComboPooledDataSource; 导入java.beans.PropertyVetoException; 导入java.sql.S
SET ROWCOUNT 1
。这会导致该连接执行的所有查询仅返回一行,即使在该连接已返回到池并稍后再次获取之后也是如此。我应该显式地重置值onCheckin
还是onCheckout
主类
import com.mchange.v2.c3p0.ComboPooledDataSource;
导入java.beans.PropertyVetoException;
导入java.sql.SQLException;
导入java.sql.Statement;
导入java.sql.Connection;
导入java.sql.ResultSet;
公共班机{
最终组合池数据源CPD;
Main()抛出PropertyVetoException{
cpds=新的ComboPooledDataSource();
setDriverClass(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
setJdbcUrl(“jdbc:sqlserver://10.42.62.41:1433;databaseName=mach;integratedSecurity=false;SendStringParametersAsUnicode=true;applicationName=panda;“”;
设置用户(“测试用户”);
设置密码(“welcome123”);
设置初始池大小(0);
设置最小池大小(1);
cpds.setMaxPoolSize(1);
setConnectionCustomizerClassName(“C3p0ConnectionCustomizer”);
setDescription(“Netbeans测试项目”);
}
Connection getConnection()引发SQLException{
返回cpds.getConnection();
}
公共静态void main(字符串[]args)引发PropertyVetoException、SQLException{
Main m=新的Main();
try(Connection=m.getConnection()){
语句stmt=connection.createStatement();
stmt.execute(“设置行数1”);
}
try(Connection=m.getConnection()){
try(语句stmt=connection.createStatement()){
int cnt=0,rsCnt=0;
布尔结果=stmt.execute(“从Foo中选择*;从Bar中选择*);
如果(结果){
做{
rsCnt++;
ResultSet rs=stmt.getResultSet();
while(rs.next()){
cnt++;
}
系统输出打印项次(rsCnt+“->”+cnt);
rs.close();
results=stmt.getMoreResults();
cnt=0;
}而(结果),;
}
}
}
}
}
自定义程序-主要用于查看正在使用的连接
import com.mchange.v2.c3p0.AbstractConnectionCustomizer;
导入java.sql.Connection;
导入java.sql.SQLException;
导入java.sql.Statement;
公共类C3p0ConnectionCustomizer扩展了AbstractConnectionCustomizer{
@凌驾
Acquire上的公共无效(连接c、字符串pdsIdt){
try(语句stmt=c.createStatement()){
stmt.execute(“设置行数0”);
}捕获(SQLException sqle){
printStackTrace();
}
}
@凌驾
连接c、字符串pdsIdt上的公共void{
System.out.println(“签出“+c+”[“+pdsIdt+”]);
}
@凌驾
public void onCheckIn(连接c,字符串pdsIdt)引发SQLException{
System.out.println(“签入“+c+”[“+pdsIdt+”]”);
}
}
如果没有
SET ROWCOUNT 1
行,则上述查询将返回更多行。自定义程序日志显示正在使用相同的连接。有人可能会认为,理想情况下,调用设置行数1
的代码确实应该在将连接释放回池之前通过确保调用设置行数0
来“自我清理”
但是,如果我们不能绝对保证这种行为,那么将SET ROWCOUNT 0
调用从onAcquire
方法移动到onCheckIn
方法似乎是非常合理的。即使重置行数
并不是真的必要,但设置行数0
将是一种相对便宜的操作,这将导致每次入住都需要额外的往返行程
(我刚刚用c3p0-0.9.5.2和mssql jdbc进行了尝试,将
SET ROWCOUNT 0
移动到onCheckIn
方法中达到了预期效果。)重置onCheckIn值不是比重置onCheckOut值更好吗?我从c3p0文档中了解到签入是异步处理的,而签出本质上是同步的。