2012-02-08 162 views
0

通过执行以下更改,我在java-ee环境中设置了jdbc连接池。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

1)你可以设置一个contextListener只有一次初始化连接,并从池中获取的逻辑康恩(客串使用Tomcat的DBCP)。

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

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

+0

因此,即使我为jsp/servlets设置了jdbc pooling,你的意思是我可以在纯java类中使用这个池,以及我在jsp/servlets中使用的池。 – 2012-02-08 04:40:01

+0

当您在上下文中设置数据源时,可以在上下文初始化时使用它(例如,将其添加到会话中)。这里解释contextListener的想法,在那里你可以添加到会话的conn实例http://www.roseindia.net/servlets/ServletContextListener-example.shtml – Alfabravo 2012-02-08 04:51:21

+0

我想在纯java类中使用jdbc连接池而不是在servlet中。 – 2012-02-08 07:06:13

1

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

我看到你的代码,并发现这些笔记,为更好的应用程序,你必须遵奉它:

  1. 您在表示层使用JDBC,更好的计算策略是:“德兴数据访问层”。
  2. 您可以使用着名的连接池,例如“C3P0”和“Apache Tomcat 7连接池”,这些连接池为企业应用提供了更多选择(当然,您必须使用这些建议测试当前连接池)
  3. 您可以使用ORM作为数据访问层,这是面向对象的设计。
+0

你是什么意思“我必须设置连接工厂”访问jdbc纯Java类classes.Do doDo意思是我必须添加工厂=“org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory” 属性context.xml – 2012-02-08 07:02:04

+0

不,我的意思是你必须在使用它之前设置JNDI(独立或web应用程序),为前充足的手动设置这些独立的应用程序:javax.naming.Context.INITIAL_CONTEXT_FACTORY或javax.naming.Context.PROVIDER_URLor等选项。您可以在Web应用程序环境中将这些选项设置为应用程序服务器配置文件为了更好的帮助,你必须完整地解释。 – MJM 2012-02-08 07:25:18

+0

我试图用相同的设置来执行一个java程序,我对jsp/servlets有以下错误:发生错误javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名称,或者作为小程序参数,或者在一个应用程序资源文件中:java.naming.factory.initial – 2012-02-08 11:01:59