Java JDBC 连接池(如何检查)?
Posted
技术标签:
【中文标题】Java JDBC 连接池(如何检查)?【英文标题】:Java JDBC Connection Pooling (How to check)? 【发布时间】:2012-10-05 07:16:01 【问题描述】:首先,我是Java/JSP/Eclipse
的新手。但是,我拥有多年的 .Net 经验。我刚刚在 Java 中学习了如何使用 javax.sql.DataSource
连接到 MS SQL Server(这样我就不需要输入用户名/密码)。
现在,我创建了一个类来处理数据库查询,并且在该类中,我有一个函数,我可以调用它来返回一个 RowSet
。
import javax.naming.Context;
import javax.naming.InitialContext;
import java.sql.Connection;
import javax.sql.DataSource;
import javax.sql.rowset.JdbcRowSet;
import com.sun.rowset.JdbcRowSetImpl;
public abstract class ClsDBAccessBASE
public boolean prbAutoCommit = true;
public String prsDataSourceName = "";
public ClsDBAccessBASE( String pvsDataSourceName )
prsDataSourceName = pvsDataSourceName;
public JdbcRowSet fnorsSQLText( String pvsSQLText )
JdbcRowSet voRS = null;
try
Context voContext = new InitialContext();
DataSource voDS = (DataSource)voContext.lookup(prsDataSourceName);
Connection voConn = (Connection)voDS.getConnection();
voRS = new JdbcRowSetImpl((voConn.createStatement()).executeQuery(pvsSQLText));
catch (Exception e) e.printStackTrace();
return voRS;
我的目标是确保我使用的是连接池。我知道JdbcRowSet
会自动实现它吗?但是,问题(我认为)是我将(voConn.createStatement()).executeQuery(pvsSQLText)
从ResultSet
转换为JdbcRowSet
。这是否意味着使用的底层连接仍然是ResultSet
?而不是RowSet
?
有没有办法让我检查我是否确实在使用连接池?
对不起,如果我的问题听起来很愚蠢。我对 Java 开发和 Eclipse 非常陌生。请多多包涵,我将不胜感激您能为我提供的任何指导。
我正在使用:sqljdbc4.jar
from Microsoft
(每当我调用 JdbcRowSet.execute()
函数和/或 .next() 函数时,这似乎都会给我错误。关于 NullReference 的一些东西。但这是另一个问题。
【问题讨论】:
【参考方案1】:是的,如果您使用容器数据源,它会为您执行连接池。
连接池不依赖于 RowSet 实现,使用后应该关闭行集。我建议立即将其读入普通对象数组并关闭。而且不要用JdbcRowSetImpl
,RowSet
就够了。
编辑:
我忘了回答你的问题:检查池中有多少连接,而不是循环调用 getConnection 并执行 select,并且 不要关闭 ResultSet
。当您达到计数打开连接 == 连接池中配置的最大打开连接数时,您会收到错误。
【讨论】:
谢谢!得到了连接池的答案!我可以总结一下: voRS = (RowSet)(proConnection.createStatement()).executeQuery(pvsSQLText);会成功吗?它会将 ResultSet 转换为 RowSet? 嗯,对不起,我的错误,不是RowSet,当然应该是ResultSet。 executeQuery 将始终返回 ResultSet,您可以手动获取它,它有方法 next() 和各种类型的 getter 来读取当前行值。【参考方案2】:获取JDBC connection object
System.out.println(conn.getClass().getName());
【讨论】:
它说: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection 但问题不会是: (voConn.createStatement()).executeQuery(pvsSQLText) 吗?在这里,它使用了返回 ResultSet 的 createStatement()。与 JdbcRowSet 相比,此 ResultSet 是否“糟糕”(ResultSet 不使用连接池)?因此我将它转换为 JdbcRowSet。但是这个选角会起作用吗? 检查了这个:download.java.net/jdk7/archive/b123/docs/api/javax/sql/rowset/…。以上是关于Java JDBC 连接池(如何检查)?的主要内容,如果未能解决你的问题,请参考以下文章