JDBC连接池澄清

时间:2012-02-08 04:27:48

标签: java java-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(); 

2 个答案:

答案 0 :(得分:1)

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

2。)是的,一旦你从上下文数据开始连接(驱动程序设置套接字并且池被初始化),你就可以从任何java类中正确地调用它来获得连接(从池中)。

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

答案 1 :(得分:1)

是的,您使用JNDI(Java命名和目录接口)标准来准备连接,因此您可以在java类中使用相同的代码来访问连接。(当然,您必须使用它来初始化Context实例,例如必须设置它的连接工厂)。

我看到你的代码并找到这些注释,为了更好的应用,你必须遵守它:

  1. 您在表示层使用jdbc,更好的approch是:“设计数据访问层”。
  2. 您可以使用着名的连接池,例如“C3P0”和“Apache Tomcat 7连接池”,这些连接池有更多的企业应用选项。(当然您必须使用这些建议测试当前的连接池)
  3. 您可以将ORM用于数据访问层,这是面向对象的设计。