簡體   English   中英

JDBC連接池澄清

[英]JDBC Connection Pooling Clarification

我通過執行以下更改在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中。 只是道路規則:被視為一個糟糕的決定。

是的,您使用JNDI(Java命名和目錄接口)標准來准備連接,因此您可以在java類中使用相同的代碼來訪問連接。(當然,您必須使用它來初始化Context實例,例如必須設置連接工廠它)。

我看到你的代碼並找到這些注釋,為了更好的應用,你必須遵守它:

  1. 您在表示層使用jdbc,更好的approch是:“設計數據訪問層”。
  2. 您可以使用着名的連接池,例如“C3P0”和“Apache Tomcat 7連接池”,這些連接池有更多的企業應用程序選項。(當然您必須使用這些建議測試當前的連接池)
  3. 您可以使用ORM進行數據訪問層,這是面向對象的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM