2012-02-08 3 views
0

Я установил пул соединений jdbc в среде 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

1.) Вы можете установить contextListener инициализировать соединение только один раз и получить логический соед из пула (Гест вы используете ГСБД TOMCAT компании).

2.) Да, после запуска соединения (драйвер устанавливает сокет и пул инициализируется) из контекстных данных вы можете получить соединение (из пула), правильно используя это из любого класса java.

3.) Старайтесь не добавлять чистый Java-код в JSP. Просто правило дороги: рассматривается как плохое решение.

+0

Итак, хотя я создал jdbc-объединение для jsp/servlets, вы имеете в виду, что я могу использовать этот пул в чистых классах Java, а также в jsp/servlets. –

+0

Поскольку вы устанавливаете источник данных в контексте, вы можете использовать его, когда контекст инициализирует (и, например, добавляет его в сеанс). Здесь объясняется идея contextListener, где вы можете добавить в сеанс экземпляр conn http://www.roseindia.net/servlets/ServletContextListener-example.shtml – Alfabravo

+0

Я хотел использовать пул соединений jdbc в чистых классах Java, а не в сервлетах. –

1

Да, вы использовали стандарт JNDI (Java Naming and Directory Interface) для подготовки соединения, поэтому вы можете использовать один и тот же код в Java-классах для доступа к соединению (конечно, вы должны использовать начальный экземпляр контекста перед его использованием, например, установить для него фабрику соединений).

Я вижу свой код и найти эти заметки для лучшего применения, вы должны его соблюдению:

  1. Вы используете JDBC в слое представления, лучше Approch является: «Уровень доступа рисунков данных».
  2. Вы можете использовать известный пул соединений, такой как «C3P0» и «Пул соединений Apache Tomcat 7», эти пулы соединений имеют больше возможностей для корпоративного приложения (конечно, вам нужно проверить свой текущий пул соединений с этими предложениями)
  3. Вы можете использовать ORM для уровня доступа к данным, это объектно-ориентированный дизайн.
+0

Что вы подразумеваете под «Я должен установить фабрику соединений» для доступа к пулу jdbc в чистых java-классах. Вы имеете в виду, что мне нужно добавить factory = "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" атрибут в контексте.xml –

+0

Нет, значит, вы должны установить JNDI (автономное или веб-приложение) перед его использованием, например достаточно установить их в автономном приложении вручную: javax.naming.Context.INITIAL_CONTEXT_FACTORY или javax.naming.Context.PROVIDER_URLor и т. д. опции. Эти параметры задаются в конфигурационном файле сервера приложений в среде веб-приложений. Чтобы лучше помогать, вы должны полностью объяснить. – MJM

+0

Я попытался выполнить java-программу с тем же параметром, который у меня был для jsp/servlets, я получил следующую ошибку: произошла ошибка javax.naming.NoInitialContextException: нужно указать имя класса в среде или системном свойстве или в качестве параметра апплета, или в файле ресурса приложения: java.naming.factory.initial –

Смежные вопросы