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 实现,使用后应该关闭行集。我建议立即将其读入普通对象数组并关闭。而且不要用JdbcRowSetImplRowSet就够了。

编辑: 我忘了回答你的问题:检查池中有多少连接,而不是循环调用 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 连接池(如何检查)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java JDBC 连接池?

数据库连接池的Java连接池

如何监控数据库连接池(JDBC Connection Pool)

如何重置 JDBC 连接池

JAVA基础-JDBC连接池

数据库连接池与JDBC的区别