Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC连接池澄清_Java_Jakarta Ee_Jdbc_Connection Pooling - Fatal编程技术网

Java JDBC连接池澄清

Java JDBC连接池澄清,java,jakarta-ee,jdbc,connection-pooling,Java,Jakarta Ee,Jdbc,Connection Pooling,我通过做以下更改,在JavaEE环境中设置了jdbc连接池 The context.xml <Context> <Resource name="jdbc/mysybase" auth="Container" type="javax.sql.DataSource" driverClassName="com.sybase.jdbc3.jdbc.SybDriver" url="j

我通过做以下更改,在JavaEE环境中设置了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>
1.)您可以将contextListener设置为只初始化一次连接,并从池中获取逻辑连接(使用tomcat的DBCP)

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

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

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

我看到您的代码并发现以下注释,为了更好地应用,您必须遵守这些注释:

  • 若在表示层使用jdbc,更好的方法是:“设计数据访问层”
  • 您可以使用著名的连接池,如“C3P0”和“ApacheTomcat7连接池”,这些连接池对企业应用程序有更多的选择。(当然,您必须根据这些建议测试当前的连接池)
  • 您可以使用ORM作为数据访问层,这是面向对象的设计

  • 因此,即使我为jsp/servlets设置了jdbc池,您的意思是我可以像在jsp/servlets中一样在纯java类中使用这个池吗?当您在上下文中设置数据源时,您可以在上下文初始化时使用它(例如,将它添加到会话中)。这里解释了contextListener的思想,您可以将我想要在纯java类而不是servlet中使用jdbc连接池的conn实例添加到会话中。事实是:您可以随时探索应用程序的上下文并检索信息。问题是:如果你不保存连接信息(如在会话中),你每次都要做大量的工作,为一个查询创建一个完整的池。现在我需要将conn实例添加到会话中,然后尝试在纯java类中访问该池吗?你说的“我必须设置连接工厂”是什么意思用于在纯java类中访问jdbc池。您的意思是我必须在context.xmlNo中添加factory=“org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”属性吗?否,我的意思是您必须在使用JNDI(单机或web应用程序)之前设置它,例如,在独立应用程序中手动设置这些选项:javax.naming.Context.INITIAL\u Context\u FACTORY或javax.naming.Context.PROVIDER\u URLor等选项。您可以在web应用程序环境中将这些选项设置到应用程序服务器配置文件中。为了更好地提供帮助,您必须详细解释。我尝试使用与jsp/servlets相同的设置执行java程序,但出现以下错误:错误发生javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或作为小程序参数,或者在一个应用程序资源文件中:java.naming.factory.initialBy server config file你是指server.xml吗?我在这个文件中设置了什么?我在没有设置任何JNDI的情况下出现了一个错误,如前面的注释所示。我如何纠正这个错误。我按照将适当的值更改为sybase db的说明修改了我的server.xml,但我仍然获取上一篇文章中提到的错误。
    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();