java - JDBC 连接池说明

标签 java jakarta-ee jdbc connection-pooling

我通过执行以下更改在 java-ee 环境中设置了 jdbc 连接池。

    The context.xml 

<Context> 
        <Resource name="jdbc/mysybase" auth="Container" 
                  type="javax.sql.DataSource" driverClassName="com.sybase.jdbc3.jdbc.SybDriver" 
                  url="jdbc:sybase:Tds:H2S33.studtrack.com:2025/student" 
                  username="scott" password="tiger" maxActive="20" maxIdle="10" 
                  maxWait="-1"/> 
    </Context> 


    In The web.xml file 
    <resource-ref> 
     <description>Sybase Datasource example</description> 
     <res-ref-name>jdbc/mysybase</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 


    And the jsp page 

    <%@page import="java.sql.*"%> 
    <%@page import="javax.naming.Context"%> 
    <%@page import="javax.naming.InitialContext"%> 
    <%@page import="java.sql.Connection"%> 
    <%@page import="java.sql.SQLException"%> 
    <%@page import="java.sql.ResultSet"%> 
    <%@page import="javax.sql.DataSource"%> 
    <html> 
    <head> 
    <title>Obtaining a Connection</title> 
    </head> 
    <body> 

    <% 
        Connection conn = null; 
        ResultSet result = null; 
        Statement stmt = null; 
         try { 
           Context initContext = new InitialContext(); 
        Context envContext  = (Context)initContext.lookup("java:/comp/env"); 
           DataSource ds = (DataSource)envContext.lookup("jdbc/mysybase"); 
           conn = ds.getConnection(); 
        if (conn != null)  
        { 
            String message = "Got Connection " + conn.toString() + ", "; 
            out.write(message); 
        } 
        else 
        { 
            out.write("hello no conn obtained"); 

        } 

            stmt = conn.createStatement(); 
            result = stmt.executeQuery("SELECT * FROM Student"); 
        while(result.next()) 
        { 
            out.write(result.getString("name")); 
        } 

         } 
         catch (SQLException e) { 
             out.write("Error occurred " + e); 
          } 

    %> 

    </body> 
    </html>

现在我希望 jdbc 池也可以在普通的 java 类中使用。 如果我希望池在 java 类中可用,我是否需要进行任何更改? 我可以在 java 类中获取连接对象,就像我在 jsp 中获取连接一样,如上所示。

Connection conn = null; 
ResultSet result = null; 
Statement stmt = null;
Context initContext = new InitialContext(); 
Context envContext  = (Context)initContext.lookup("java:/comp/env"); 
DataSource ds = (DataSource)envContext.lookup("jdbc/mysybase"); 
conn = ds.getConnection(); 

最佳答案

1.) 您可以设置一个 contextListener 来仅初始化一次连接并从池中获取逻辑 conn(假设您使用 tomcat 的 DBCP)。

2.) 是的,一旦您从上下文数据启动连接(驱动程序设置套接字并初始化池),您就可以从任何 java 类正确调用该连接(从池)获取连接。

3.) 尽量不要将纯 Java 代码放入 JSP 中。这只是一条规则:被视为一个糟糕的决定。

关于java - JDBC 连接池说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187848/

相关文章:

java - 如何使用 Eclipse 检查调试符号状态?

java - 定义使用 API 的规则的标准方法,也许是动态 UI

java - 以 HashSet 为值迭代 HashMap

java - 我应该使用哪个阶段来拦截 JSF 中的登录尝试

java - 从纯客户端调用远程 EJB(RMI over IIOP)时如何传播 JAAS Subject

java - 如何保持文件打开以供阅读

java - 每小时运行一次 Java 代码

java - 如何将在 JDBC 中执行的 SQL 查询的结果分配给 java 变量?

mysql - 无法在 Google 表格中建立与 mySQL 的连接

java - Jdbcrowset 错误?返回空指针异常!